ZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLm1rIGIvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggMmYxNjkyMy4uYjE3YjNkMiAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDYgQEAKIAlsaWJ1dGlscyBcCiAJbGliYmluZGVyIFwKIAlsaWJoYXJkd2FyZSBcCi0JbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKIAlsaWJ1aSBcCiAJbGliZ3VpCiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggZTI4ODMxMi4uNWViNDhkYSAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTIwNSwyMiArMjA1LDYgQEAKICAgICByZXR1cm4gYy0+c3RhcnRQcmV2aWV3KCk7CiB9CiAKLWludDMyX3QgQ2FtZXJhOjpnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0Ci17Ci0gICAgTE9HVigiZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMiKTsKLSAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGMtPmdldE51bWJlck9mVmlkZW9CdWZmZXJzKCk7Ci19Ci0KLXNwPElNZW1vcnk+IENhbWVyYTo6Z2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3QKLXsKLSAgICBMT0dWKCJnZXRWaWRlb0J1ZmZlcjogJWQiLCBpbmRleCk7Ci0gICAgc3AgPElDYW1lcmE+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBjLT5nZXRWaWRlb0J1ZmZlcihpbmRleCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYTo6c3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpCiB7CiAgICAgTE9HVigic3RvcmVNZXRhRGF0YUluQnVmZmVyczogJXMiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDBmZDc5YTQuLjkzOTJjZjIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTU5LDYgKzU5LDggQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GTEFTSF9NT0RFU1tdID0gImZsYXNoLW1vZGUtdmFsdWVzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX01PREVbXSA9ICJmb2N1cy1tb2RlIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GT0NVU19NT0RFU1tdID0gImZvY3VzLW1vZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fRk9DVVNfQVJFQVNbXSA9ICJtYXgtbnVtLWZvY3VzLWFyZWFzIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTW10gPSAiZm9jdXMtYXJlYXMiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DQUxfTEVOR1RIW10gPSAiZm9jYWwtbGVuZ3RoIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0hPUklaT05UQUxfVklFV19BTkdMRVtdID0gImhvcml6b250YWwtdmlldy1hbmdsZSI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9WRVJUSUNBTF9WSUVXX0FOR0xFW10gPSAidmVydGljYWwtdmlldy1hbmdsZSI7CkBAIC02Niw2ICs2OCwxMiBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX0VYUE9TVVJFX0NPTVBFTlNBVElPTltdID0gIm1heC1leHBvc3VyZS1jb21wZW5zYXRpb24iOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUlOX0VYUE9TVVJFX0NPTVBFTlNBVElPTltdID0gIm1pbi1leHBvc3VyZS1jb21wZW5zYXRpb24iOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX1NURVBbXSA9ICJleHBvc3VyZS1jb21wZW5zYXRpb24tc3RlcCI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9BVVRPX0VYUE9TVVJFX0xPQ0tbXSA9ICJhdXRvLWV4cG9zdXJlLWxvY2siOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfQVVUT19FWFBPU1VSRV9MT0NLX1NVUFBPUlRFRFtdID0gImF1dG8tZXhwb3N1cmUtbG9jay1zdXBwb3J0ZWQiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DS1tdID0gImF1dG8td2hpdGViYWxhbmNlLWxvY2siOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DS19TVVBQT1JURURbXSA9ICJhdXRvLXdoaXRlYmFsYW5jZS1sb2NrLXN1cHBvcnRlZCI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTW10gPSAibWF4LW51bS1tZXRlcmluZy1hcmVhcyI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBU1tdID0gIm1ldGVyaW5nLWFyZWFzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01bXSA9ICJ6b29tIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9aT09NW10gPSAibWF4LXpvb20iOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9SQVRJT1NbXSA9ICJ6b29tLXJhdGlvcyI7CkBAIC03OCw2ICs4Niw3IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVGRVJSRURfUFJFVklFV19TSVpFX0ZPUl9WSURFT1tdID0gInByZWZlcnJlZC1wcmV2aWV3LXNpemUtZm9yLXZpZGVvIjsKIAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFW10gPSAidHJ1ZSI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZBTFNFW10gPSAiZmFsc2UiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19ESVNUQU5DRV9JTkZJTklUWVtdID0gIkluZmluaXR5IjsKIAogLy8gVmFsdWVzIGZvciB3aGl0ZSBiYWxhbmNlIHNldHRpbmdzLgpAQCAtMTM3LDYgKzE0Niw3IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJJW10gPSAieXV2NDIyaS15dXl2IjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFBbXSAgPSAieXV2NDIwcCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0I1NjVbXSA9ICJyZ2I1NjUiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCQTg4ODhbXSA9ICJyZ2JhODg4OCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9KUEVHW10gPSAianBlZyI7CiAKIC8vIFZhbHVlcyBmb3IgZm9jdXMgbW9kZSBzZXR0aW5ncy4KZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhLmNwcCBiL2NhbWVyYS9JQ2FtZXJhLmNwcAppbmRleCA5MzFiNTdkLi41ZjZlNWVmIDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0lDYW1lcmEuY3BwCkBAIC00Niw4ICs0Niw2IEBACiAgICAgU1RPUF9SRUNPUkRJTkcsCiAgICAgUkVDT1JESU5HX0VOQUJMRUQsCiAgICAgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUUsCi0gICAgR0VUX05VTV9WSURFT19CVUZGRVJTLAotICAgIEdFVF9WSURFT19CVUZGRVIsCiAgICAgU1RPUkVfTUVUQV9EQVRBX0lOX0JVRkZFUlMsCiB9OwogCkBAIC0xNDksMjcgKzE0Nyw2IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1JFQ09SRElOR19GUkFNRSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICBpbnQzMl90IGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIExPR1YoImdldE51bWJlck9mVmlkZW9CdWZmZXJzIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTlVNX1ZJREVPX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICBzcDxJTWVtb3J5PiBnZXRWaWRlb0J1ZmZlcihpbnQzMl90IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgTE9HVigiZ2V0VmlkZW9CdWZmZXI6ICVkIiwgaW5kZXgpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZJREVPX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgcmV0dXJuIG1lbTsKLSAgICB9Ci0KICAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGJvb2wgZW5hYmxlZCkKICAgICB7CiAgICAgICAgIExPR1YoInN0b3JlTWV0YURhdGFJbkJ1ZmZlcnM6ICVzIiwgZW5hYmxlZD8gInRydWUiOiAiZmFsc2UiKTsKQEAgLTM1NSwxOSArMzMyLDYgQEAKICAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShtZW0pOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9OVU1fVklERU9fQlVGRkVSUzogewotICAgICAgICAgICAgTE9HVigiR0VUX05VTV9WSURFT19CVUZGRVJTIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1ZJREVPX0JVRkZFUjogewotICAgICAgICAgICAgTE9HVigiR0VUX1ZJREVPX0JVRkZFUiIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmEsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldFZpZGVvQnVmZmVyKGluZGV4KS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU1RPUkVfTUVUQV9EQVRBX0lOX0JVRkZFUlM6IHsKICAgICAgICAgICAgIExPR1YoIlNUT1JFX01FVEFfREFUQV9JTl9CVUZGRVJTIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDFiMTNkZDkuLmU5NjQyZjcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTgsNyArOCw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlic2tpYSBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgbGliZ3VpCisgICAgICAgIGxpYnNraWEgbGliZ3VpCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAgICAgc3RyZWFtLmNwcCAgICBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYmd1aSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJtZWRpYSBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgbGliY3V0aWxzIGxpYnVpCisgICAgICAgIGxpYm1lZGlhIGxpYmd1aSBsaWJjdXRpbHMgbGlidWkKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCA4NzMzNjYyLi44NTg2ODFmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogaW50IG1haW4oKSB7CkBAIC0zMSw4ICszMyw4IEBACiAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwKICAgICAgICAgICAgIGtTYW1wbGVSYXRlLAogICAgICAgICAgICAga051bUNoYW5uZWxzID09IDEKLSAgICAgICAgICAgICAgICA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8KLSAgICAgICAgICAgICAgICA6IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX1NURVJFTyk7CisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX0lOX01PTk8KKyAgICAgICAgICAgICAgICA6IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKTsKICNlbmRpZgogCiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKaW5kZXggYzFkMDgwMy4uMjg5NjY1ZiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcApAQCAtNTQzLDcgKzU0Myw2IEBACiAgICAgICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKIAogICAgICAgICBjb250cm9sID0gY29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgU3RyaW5nOCgiQSBTdXJmYWNlIiksCiAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAxMjgwLApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBhODc1YzNhLi4wMTI2MmZhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtNjk1LDEyICs2OTUsMTQgQEAKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKIAorICAgICAgICAgICAgYm9vbCBmYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgQ0hFQ0tfRVEocmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZpbGVuYW1lKSwgKHN0YXR1c190KU9LKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RnJhbWVBdFRpbWUoJXMpID0+IE9LXG4iLCBmaWxlbmFtZSk7CiAKICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9IChWaWRlb0ZyYW1lICopbWVtLT5wb2ludGVyKCk7CkBAIC03MTUsMTYgKzcxNywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2RjYXJkL291dC5qcGciLCBiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tJbWFnZUVuY29kZXI6OmtKUEVHX1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tJbWFnZUVuY29kZXI6OmtEZWZhdWx0UXVhbGl0eSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1lbSA9IHJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiAKICAgICAgICAgICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXh0cmFjdEFsYnVtQXJ0KCVzKSA9PiBPS1xuIiwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiYm90aCBnZXRGcmFtZUF0VGltZSBhbmQgZXh0cmFjdEFsYnVtQXJ0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgb24gZmlsZSAnJXMnLlxuIiwgZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiYm90aCBnZXRGcmFtZUF0VGltZSBhbmQgZXh0cmFjdEFsYnVtQXJ0ICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBvbiBmaWxlICclcycuXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiYjg0YmQxLi5mNzgwYWZiIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAgICAgOiBtRU9TKGZhbHNlKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpIHsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgICAgICBpZiAobXNnID09IE1FRElBX0VSUk9SIHx8IG1zZyA9PSBNRURJQV9QTEFZQkFDS19DT01QTEVURSkgewpAQCAtMTQ5LDcgKzE0OSw2IEBACiAKICAgICBzcDxTdXJmYWNlQ29udHJvbD4gY29udHJvbCA9CiAgICAgICAgIGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgIGdldHBpZCgpLAogICAgICAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgMTI4MCwKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcCBiL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcAppbmRleCA4ZDExNWE4Li4yN2E1YTJkIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0RybUluZm9FdmVudC5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1Ecm1JbmZvRXZlbnQ6OkRybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSkKK0RybUluZm9FdmVudDo6RHJtSW5mb0V2ZW50KGludCB1bmlxdWVJZCwgaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4IG1lc3NhZ2UpCiAgICAgOiBtVW5pcXVlSWQodW5pcXVlSWQpLAogICAgICAgbUluZm9UeXBlKGluZm9UeXBlKSwKICAgICAgIG1NZXNzYWdlKG1lc3NhZ2UpIHsKQEAgLTM0LDcgKzM0LDcgQEAKICAgICByZXR1cm4gbUluZm9UeXBlOwogfQogCi1jb25zdCBTdHJpbmc4JiBEcm1JbmZvRXZlbnQ6OmdldE1lc3NhZ2UoKSBjb25zdCB7Citjb25zdCBTdHJpbmc4IERybUluZm9FdmVudDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbU1lc3NhZ2U7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwIGIvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAKaW5kZXggYzBiZmYwZS4uM2RlZTQzNSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8ZHJtL0RybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMTUyLDQgKzE1MywzIEBACiAgICAgbUluZGV4Kys7CiAgICAgcmV0dXJuIHZhbHVlOwogfQotCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggMzQ2OTM0Yi4uYzM3YjRmOCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtNjUwLDExICs2NTAsNiBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX0RFQ1JZUFRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7Ci0gICAgICAgIExPR1YoImRlbGV0aW5nIGRlY3J5cHRJbmZvIik7Ci0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CiAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogfQogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKaW5kZXggZjk0ZjlhMy4uZTNjZDQ0ZiAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCisrKyBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMjIsNiArMjIsNyBAQAogICAgIERybU1hbmFnZXJTZXJ2aWNlLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYSBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmJpbmRlcgogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCAxZWVlNWYyLi4xODA5NjE5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTM3LDcgKzM3LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLVZlY3RvcjxpbnQ+IERybU1hbmFnZXI6Om1VbmlxdWVJZFZlY3RvcjsKIGNvbnN0IFN0cmluZzggRHJtTWFuYWdlcjo6RU1QVFlfU1RSSU5HKCIiKTsKIAogRHJtTWFuYWdlcjo6RHJtTWFuYWdlcigpIDoKQEAgLTEwMiw2ICsxMDEsNyBAQAogICAgICAgICAgICAgRHJtU3VwcG9ydEluZm8qIGluZm8gPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luUGF0aCkuZ2V0U3VwcG9ydEluZm8oMCk7CiAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CiAgICAgICAgICAgICAgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIHBsdWdJblBhdGgpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTc5LDYgKzE3OSw3IEBACiAKICAgICBEcm1TdXBwb3J0SW5mbyogaW5mbyA9IHJEcm1FbmdpbmUuZ2V0U3VwcG9ydEluZm8oMCk7CiAgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIGFic29sdXRlUGF0aCk7CisgICAgZGVsZXRlIGluZm87CiAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCAwOTAxYTQ0Li41ODM2NjllIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0yNTYsMyArMjU3LDMxIEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIAorc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIERybU1hbmFnZXJTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworI2lmIERSTV9NRU1PUllfTEVBS19UUkFDSworICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgICAgICBkdW1wTWVtb3J5QWRkcmVzc2VzKGZkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rCmluZGV4IDk5MTMzYmEuLmYxNTI2YTQgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5taworKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQubWsKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKaW5kZXggYzFmMzgyYS4uYjUwMTk5ZiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCkBAIC03NiwxMiArNzYsMTMgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jaGVja1JpZ2h0c1N0YXR1cyhtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNvbnN1bWVSaWdodHMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50Ojpjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNvbnN1bWVSaWdodHMobVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwKICAgICAgICAgICAgIC0+c2V0UGxheWJhY2tTdGF0dXMobVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogfQpAQCAtMTE1LDM3ICsxMTYsMzkgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXRBbGxTdXBwb3J0SW5mbyhtVW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnQ6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgeworc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+b3BlbkRlY3J5cHRTZXNzaW9uKG1VbmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSkgeworc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSkgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5EZWNyeXB0U2Vzc2lvbihtVW5pcXVlSWQsIHVyaSk7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNsb3NlRGVjcnlwdFNlc3Npb24oRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSkgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNsb3NlRGVjcnlwdFNlc3Npb24obVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCiAgICAgICAgICAgICBtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpkZWNyeXB0KAotICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAotICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5kZWNyeXB0KAogICAgICAgICAgICAgbVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpmaW5hbGl6ZURlY3J5cHRVbml0KERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7Ci0gICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+ZmluYWxpemVEZWNyeXB0VW5pdChtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmZpbmFsaXplRGVjcnlwdFVuaXQobVVuaXF1ZUlkLAorICAgICAgICAgICAgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKIHNzaXplX3QgRHJtTWFuYWdlckNsaWVudDo6cHJlYWQoCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnByZWFkKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCA5YzdmZWQzLi5hNTdkZDk4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtODEsMTQgKzgxLDE2IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRPbkluZm9MaXN0ZW5lcigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtT25JbmZvTGlzdGVuZXIgPSBpbmZvTGlzdGVuZXI7CiAgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldERybVNlcnZpY2VMaXN0ZW5lcih1bmlxdWVJZCwKICAgICAgICAgICAgIChOVUxMICE9IGluZm9MaXN0ZW5lci5nZXQoKSkgPyB0aGlzIDogTlVMTCk7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Omluc3RhbGxEcm1FbmdpbmUoCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gZHJtRW5naW5lRmlsZSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbnN0YWxsRHJtRW5naW5lKHVuaXF1ZUlkLCBkcm1FbmdpbmVGaWxlKTsKQEAgLTEwMCw3ICsxMDIsOCBAQAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKICAgICBEcm1Db25zdHJhaW50cyAqZHJtQ29uc3RyYWludHMgPSBOVUxMOwogICAgIGlmICgoTlVMTCAhPSBwYXRoKSAmJiAoRU1QVFlfU1RSSU5HICE9ICpwYXRoKSkgewotICAgICAgICBkcm1Db25zdHJhaW50cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgICAgICBkcm1Db25zdHJhaW50cyA9CisgICAgICAgICAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIGRybUNvbnN0cmFpbnRzOwogfQpAQCAtMTEzLDcgKzExNiw4IEBACiAgICAgcmV0dXJuIGRybU1ldGFkYXRhOwogfQogCi1ib29sIERybU1hbmFnZXJDbGllbnRJbXBsOjpjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2FuSGFuZGxlKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgYm9vbCByZXRDb2RlID0gZmFsc2U7CiAgICAgaWYgKChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgfHwgKEVNUFRZX1NUUklORyAhPSBtaW1lVHlwZSkpIHsKICAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOwpAQCAtMTIxLDcgKzEyNSw4IEBACiAgICAgcmV0dXJuIHJldENvZGU7CiB9CiAKLURybUluZm9TdGF0dXMqIERybU1hbmFnZXJDbGllbnRJbXBsOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKK0RybUluZm9TdGF0dXMqIERybU1hbmFnZXJDbGllbnRJbXBsOjpwcm9jZXNzRHJtSW5mbygKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CiAgICAgRHJtSW5mb1N0YXR1cyAqZHJtSW5mb1N0YXR1cyA9IE5VTEw7CiAgICAgaWYgKE5VTEwgIT0gZHJtSW5mbykgewogICAgICAgICBkcm1JbmZvU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOwpAQCAtMTI5LDcgKzEzNCw4IEBACiAgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7CiB9CiAKLURybUluZm8qIERybU1hbmFnZXJDbGllbnRJbXBsOjphY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworRHJtSW5mbyogRHJtTWFuYWdlckNsaWVudEltcGw6OmFjcXVpcmVEcm1JbmZvKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgewogICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOwogICAgIGlmIChOVUxMICE9IGRybUluZm9SZXF1ZXN0KSB7CiAgICAgICAgIGRybUluZm8gPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5hY3F1aXJlRHJtSW5mbyh1bmlxdWVJZCwgZHJtSW5mb1JlcXVlc3QpOwpAQCAtMTQwLDEzICsxNDYsMTIgQEAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gY29udGVudFBhdGgpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2F2ZVJpZ2h0cyh1bmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNhdmVSaWdodHMoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOwogfQogCi1TdHJpbmc4IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0T3JpZ2luYWxNaW1lVHlwZSgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CiAgICAgU3RyaW5nOCBtaW1lVHlwZSA9IEVNUFRZX1NUUklORzsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKICAgICAgICAgbWltZVR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBwYXRoKTsKQEAgLTE1OCw3ICsxNjMsOCBAQAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIGludCBkcm1PamVjdFR5cGUgPSBEcm1PYmplY3RUeXBlOjpVTktOT1dOOwogICAgIGlmICgoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHx8IChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpKSB7Ci0gICAgICAgICBkcm1PamVjdFR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgICAgICBkcm1PamVjdFR5cGUgPQorICAgICAgICAgICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKICAgICB9CiAgICAgcmV0dXJuIGRybU9qZWN0VHlwZTsKIH0KQEAgLTE2NywzNSArMTczLDQxIEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKICAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKLSAgICAgICAgcmlnaHRzU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgICAgIHJpZ2h0c1N0YXR1cyA9CisgICAgICAgICAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047Ci0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIGJvb2wgRHJtTWFuYWdlckNsaWVudEltcGw6OnZhbGlkYXRlQWN0aW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgewogICAgIGJvb2wgcmV0Q29kZSA9IGZhbHNlOwogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgewotICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+dmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KQEAgLTIxMiw3ICsyMjQsOCBAQAogICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOwogfQogCi1pbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CitpbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIGludCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSB7CiAgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1pbWVUeXBlKTsKQEAgLTIyNCwxMiArMjM3LDE0IEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CiAgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOwogICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSkgewotICAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9CisgICAgICAgICAgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKICAgICB9CiAgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKIH0KIAotRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmNsb3NlQ29udmVydFNlc3Npb24oCisgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgewogICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOwogfQogCkBAIC0yMzcsMTcgKzI1MiwxOSBAQAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKChOVUxMICE9IGRybVN1cHBvcnRJbmZvQXJyYXkpICYmIChOVUxMICE9IGxlbmd0aCkpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKICAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgewogICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpKTsKQEAgLTI1NSw1MCArMjcyLDU3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VEZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbiggdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgeworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpkZWNyeXB0KAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKICAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7Ci0gICAgICAgIHN0YXR1cwotICAgICAgICAgICAgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBidWZmZXIpICYmICgwIDwgbnVtQnl0ZXMpKSB7Ci0gICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gYnVmZmVyKSAmJiAoMCA8IG51bUJ5dGVzKSkgeworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJlYWQoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgfQogICAgIHJldHVybiByZXRDb2RlOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKaW5kZXggYzcyNzZmOS4uYWYyYzJhOCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlci5oCkBAIC0zMCw3ICszMCw2IEBACiBjbGFzcyBEcm1SZWdpc3RyYXRpb25JbmZvOwogY2xhc3MgRHJtVW5yZWdpc3RyYXRpb25JbmZvOwogY2xhc3MgRHJtUmlnaHRzQWNxdWlzaXRpb25JbmZvOwotY2xhc3MgRHJtQ29udGVudElkczsKIGNsYXNzIERybUNvbnN0cmFpbnRzOwogY2xhc3MgRHJtTWV0YWRhdGE7CiBjbGFzcyBEcm1SaWdodHM7CkBAIC0xNDEsNyArMTQwLDcgQEAKICAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBWZWN0b3I8aW50PiBtVW5pcXVlSWRWZWN0b3I7CisgICAgVmVjdG9yPGludD4gbVVuaXF1ZUlkVmVjdG9yOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IEVNUFRZX1NUUklORzsKIAogICAgIGludCBtRGVjcnlwdFNlc3Npb25JZDsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKaW5kZXggNDI5ZTRjMy4uNTY0ODk2YiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTE4OSw3ICsxODksNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgLyoqCiAgICAgICogSW5mb3JtcyB0aGUgRFJNIGVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgpAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KICAgICAgKi8KLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgLyoqCiAgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CkBAIC0zMTMsNyArMzEzLDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgogICAgICAqLwotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKIAogICAgIC8qKgogICAgICAqIENsb3NlIHRoZSBkZWNyeXB0IHNlc3Npb24gZm9yIHRoZSBnaXZlbiBoYW5kbGUKQEAgLTMyMyw3ICszMjMsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSk7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtMzM1LDcgKzMzNSw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKICAgICAvKioKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAogICAgIC8qKgpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtMzgwLDcgKzM4MCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IGQwYTBkYjcuLjIyNzQ5NmEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC0xMTUsNiArMTE1LDggQEAKICAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKIHByaXZhdGU6CiAgICAgRHJtTWFuYWdlciogbURybU1hbmFnZXI7CiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDI0MjRlYTUuLjc3MjdlNTUgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTI1LDcgKzI1LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEcm1Db250ZW50SWRzOwogY2xhc3MgRHJtQ29uc3RyYWludHM7CiBjbGFzcyBEcm1NZXRhZGF0YTsKIGNsYXNzIERybVJpZ2h0czsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCmluZGV4IGQwNWMyNGYuLjc3NDYwZjYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMjEsNyArMjEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERybUNvbnRlbnRJZHM7CiBjbGFzcyBEcm1Db25zdHJhaW50czsKIGNsYXNzIERybU1ldGFkYXRhOwogY2xhc3MgRHJtUmlnaHRzOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tawppbmRleCBhZjY3YWEzLi45ODA1YTQwIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5taworKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tawpAQCAtNDcsNyArNDcsNyBAQAogICAgIGxpYmZ3ZGxvY2stY29udmVydGVyIFwKICAgICBsaWJmd2Rsb2NrLWRlY29kZXIKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQubWsKaW5kZXggNzg1NmQzNy4uYmUxOGI2NCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQubWsKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQubWsKQEAgLTMyLDcgKzMyLDcgQEAKICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCiBlbmRpZgogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKaW5kZXggZjNjOGY2NC4uNzEwNmJmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKQEAgLTIwLDEyMiArMjAsMjggQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYUNsaWVudC5oPgogI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLyoKLSAqIEEgc2V0IG9mIGJpdCBtYXNrcyBmb3Igc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmVkIHByZXZpZXcgZnJhbWVzIGFyZQotICogaGFuZGxlZCBiZWZvcmUgdGhlIHByZXZpZXdDYWxsYmFjaygpIGNhbGwuCi0gKgotICogVGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZiBhbiAiaW50IiB2YWx1ZSBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOgotICoKLSAqIC4uLi4uIDAgMCAwCi0gKiAgICAgICBeIF4gXgotICogICAgICAgfCB8IHwtLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBlbmFibGVkIG9yIG5vdAotICogICAgICAgfCB8LS0tLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBvbmUtc2hvdCBvciBub3QKLSAqICAgICAgIHwtLS0tLS0tLS0tLS0tPiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUgaXMgY29waWVkIG91dCBvciBub3QKLSAqCi0gKiBXQVJOSU5HOgotICogV2hlbiBhIGZyYW1lIGlzIHNlbnQgZGlyZWN0bHkgd2l0aG91dCBjb3B5aW5nLCBpdCBpcyB0aGUgZnJhbWUgcmVjZWl2ZXIncwotICogcmVzcG9uc2libGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWUgZGF0YSB3b24ndCBnZXQgY29ycnVwdGVkIGJ5Ci0gKiBzdWJzZXF1ZW50IHByZXZpZXcgZnJhbWVzIGZpbGxlZCBieSB0aGUgY2FtZXJhLiBUaGlzIGZsYWcgaXMgcmVjb21tZW5kZWQKLSAqIG9ubHkgd2hlbiBjb3B5aW5nIG91dCBkYXRhIGJyaW5ncyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwcmljZSBhbmQgdGhlCi0gKiBoYW5kbGluZy9wcm9jZXNzaW5nIG9mIHRoZSByZWNlaXZlZCBmcmFtZSBkYXRhIGlzIGFsd2F5cyBmYXN0ZXIgdGhhbgotICogdGhlIHByZXZpZXcgZnJhbWUgcmF0ZSBzbyB0aGF0IGRhdGEgY29ycnVwdGlvbiB3b24ndCBvY2N1ci4KLSAqCi0gKiBGb3IgaW5zdGFuY2UsCi0gKiAxLiAweDAwIGRpc2FibGVzIHRoZSBjYWxsYmFjay4gSW4gdGhpcyBjYXNlLCBjb3B5IG91dCBhbmQgb25lIHNob3QgYml0cwotICogICAgYXJlIGlnbm9yZWQuCi0gKiAyLiAweDAxIGVuYWJsZXMgYSBjYWxsYmFjayB3aXRob3V0IGNvcHlpbmcgb3V0IHRoZSByZWNlaXZlZCBmcmFtZXMuIEEKLSAqICAgIHR5cGljYWwgdXNlIGNhc2UgaXMgdGhlIENhbWNvcmRlciBhcHBsaWNhdGlvbiB0byBhdm9pZCBtYWtpbmcgY29zdGx5Ci0gKiAgICBmcmFtZSBjb3BpZXMuCi0gKiAzLiAweDA1IGlzIGVuYWJsaW5nIGEgY2FsbGJhY2sgd2l0aCBmcmFtZSBjb3BpZWQgb3V0IHJlcGVhdGVkbHkuIEEgdHlwaWNhbAotICogICAgdXNlIGNhc2UgaXMgdGhlIENhbWVyYSBhcHBsaWNhdGlvbi4KLSAqIDQuIDB4MDcgaXMgZW5hYmxpbmcgYSBjYWxsYmFjayB3aXRoIGZyYW1lIGNvcGllZCBvdXQgb25seSBvbmNlLiBBIHR5cGljYWwgdXNlCi0gKiAgICBjYXNlIGlzIHRoZSBCYXJjb2RlIHNjYW5uZXIgYXBwbGljYXRpb24uCi0gKi8KLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyAgICAgICAgICAgIDB4MDQKLQotLy8gVHlwaWNhbCB1c2UgY2FzZXMKLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX0NBTUNPUkRFUiAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ0FNRVJBICAgICAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19CQVJDT0RFX1NDQU5ORVIgICAgICAgICAgMHgwNwotCi0vLyBtc2dUeXBlIGluIG5vdGlmeUNhbGxiYWNrIGFuZCBkYXRhQ2FsbGJhY2sgZnVuY3Rpb25zCi1lbnVtIHsKLSAgICBDQU1FUkFfTVNHX0VSUk9SICAgICAgICAgICAgPSAweDAwMDEsCi0gICAgQ0FNRVJBX01TR19TSFVUVEVSICAgICAgICAgID0gMHgwMDAyLAotICAgIENBTUVSQV9NU0dfRk9DVVMgICAgICAgICAgICA9IDB4MDAwNCwKLSAgICBDQU1FUkFfTVNHX1pPT00gICAgICAgICAgICAgPSAweDAwMDgsCi0gICAgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FICAgID0gMHgwMDEwLAotICAgIENBTUVSQV9NU0dfVklERU9fRlJBTUUgICAgICA9IDB4MDAyMCwKLSAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FICAgPSAweDAwNDAsCi0gICAgQ0FNRVJBX01TR19SQVdfSU1BR0UgICAgICAgID0gMHgwMDgwLAotICAgIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSA9IDB4MDEwMCwKLSAgICBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkgPSAweDAyMDAsCi0gICAgQ0FNRVJBX01TR19BTExfTVNHUyAgICAgICAgID0gMHhGRkZGCi19OwotCi0vLyBjbWRUeXBlIGluIHNlbmRDb21tYW5kIGZ1bmN0aW9ucwotZW51bSB7Ci0gICAgQ0FNRVJBX0NNRF9TVEFSVF9TTU9PVEhfWk9PTSAgICAgPSAxLAotICAgIENBTUVSQV9DTURfU1RPUF9TTU9PVEhfWk9PTSAgICAgID0gMiwKLSAgICAvLyBTZXQgdGhlIGNsb2Nrd2lzZSByb3RhdGlvbiBvZiBwcmV2aWV3IGRpc3BsYXkgKHNldFByZXZpZXdEaXNwbGF5KSBpbgotICAgIC8vIGRlZ3JlZXMuIFRoaXMgYWZmZWN0cyB0aGUgcHJldmlldyBmcmFtZXMgYW5kIHRoZSBwaWN0dXJlIGRpc3BsYXllZCBhZnRlcgotICAgIC8vIHNuYXBzaG90LiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHBvcnRyYWl0IG1vZGUgYXBwbGljYXRpb25zLiBOb3RlIHRoYXQKLSAgICAvLyBwcmV2aWV3IGRpc3BsYXkgb2YgZnJvbnQtZmFjaW5nIGNhbWVyYXMgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkgYmVmb3JlCi0gICAgLy8gdGhlIHJvdGF0aW9uLCB0aGF0IGlzLCB0aGUgaW1hZ2UgaXMgcmVmbGVjdGVkIGFsb25nIHRoZSBjZW50cmFsIHZlcnRpY2FsCi0gICAgLy8gYXhpcyBvZiB0aGUgY2FtZXJhIHNlbnNvci4gU28gdGhlIHVzZXJzIGNhbiBzZWUgdGhlbXNlbHZlcyBhcyBsb29raW5nCi0gICAgLy8gaW50byBhIG1pcnJvci4KLSAgICAvLwotICAgIC8vIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBvcmRlciBvZiBieXRlIGFycmF5IG9mIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwKLSAgICAvLyBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FLCBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FLCBDQU1FUkFfTVNHX1JBV19JTUFHRSwKLSAgICAvLyBvciBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UuIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gYmUgc2V0IGR1cmluZwotICAgIC8vIHByZXZpZXcuCi0gICAgQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTiA9IDMsCi0KLSAgICAvLyBjbWRUeXBlIHRvIGRpc2FibGUvZW5hYmxlIHNodXR0ZXIgc291bmQuCi0gICAgLy8gSW4gc2VuZENvbW1hbmQgcGFzc2luZyBhcmcxID0gMCB3aWxsIGRpc2FibGUsCi0gICAgLy8gd2hpbGUgcGFzc2luZyBhcmcxID0gMSB3aWxsIGVuYWJsZSB0aGUgc2h1dHRlciBzb3VuZC4KLSAgICBDQU1FUkFfQ01EX0VOQUJMRV9TSFVUVEVSX1NPVU5EID0gNCwKLQotICAgIC8vIGNtZFR5cGUgdG8gcGxheSByZWNvcmRpbmcgc291bmQuCi0gICAgQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCA9IDUsCi19OwotCi0vLyBjYW1lcmEgZmF0YWwgZXJyb3JzCi1lbnVtIHsKLSAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiAgPSAxLAotICAgIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCA9IDEwMAotfTsKLQotZW51bSB7Ci0gICAgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMCwgLyogVGhlIGZhY2luZyBvZiB0aGUgY2FtZXJhIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YgdGhlIHNjcmVlbi4gKi8KLSAgICBDQU1FUkFfRkFDSU5HX0ZST05UID0gMSAvKiBUaGUgZmFjaW5nIG9mIHRoZSBjYW1lcmEgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgc2NyZWVuLiAqLwotfTsKLQogc3RydWN0IENhbWVyYUluZm8gewotCiAgICAgLyoqCi0gICAgICogVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBjYW1lcmEgZmFjZXMgdG8uIEl0IHNob3VsZCBiZQotICAgICAqIENBTUVSQV9GQUNJTkdfQkFDSyBvciBDQU1FUkFfRkFDSU5HX0ZST05ULgorICAgICAqIFRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgY2FtZXJhIGZhY2VzIHRvLiBJdCBzaG91bGQgYmUgQ0FNRVJBX0ZBQ0lOR19CQUNLCisgICAgICogb3IgQ0FNRVJBX0ZBQ0lOR19GUk9OVC4KICAgICAgKi8KICAgICBpbnQgZmFjaW5nOwogCiAgICAgLyoqCiAgICAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBjYW1lcmEgaW1hZ2UuIFRoZSB2YWx1ZSBpcyB0aGUgYW5nbGUgdGhhdCB0aGUKLSAgICAgKiBjYW1lcmEgaW1hZ2UgbmVlZHMgdG8gYmUgcm90YXRlZCBjbG9ja3dpc2Ugc28gaXQgc2hvd3MgY29ycmVjdGx5IG9uCi0gICAgICogdGhlIGRpc3BsYXkgaW4gaXRzIG5hdHVyYWwgb3JpZW50YXRpb24uIEl0IHNob3VsZCBiZSAwLCA5MCwgMTgwLCBvciAyNzAuCisgICAgICogY2FtZXJhIGltYWdlIG5lZWRzIHRvIGJlIHJvdGF0ZWQgY2xvY2t3aXNlIHNvIGl0IHNob3dzIGNvcnJlY3RseSBvbiB0aGUKKyAgICAgKiBkaXNwbGF5IGluIGl0cyBuYXR1cmFsIG9yaWVudGF0aW9uLiBJdCBzaG91bGQgYmUgMCwgOTAsIDE4MCwgb3IgMjcwLgogICAgICAqCiAgICAgICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBkZXZpY2UgaGFzIGEgbmF0dXJhbGx5IHRhbGwgc2NyZWVuLiBUaGUKICAgICAgKiBiYWNrLWZhY2luZyBjYW1lcmEgc2Vuc29yIGlzIG1vdW50ZWQgaW4gbGFuZHNjYXBlLiBZb3UgYXJlIGxvb2tpbmcgYXQKICAgICAgKiB0aGUgc2NyZWVuLiBJZiB0aGUgdG9wIHNpZGUgb2YgdGhlIGNhbWVyYSBzZW5zb3IgaXMgYWxpZ25lZCB3aXRoIHRoZQogICAgICAqIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNjcmVlbiBpbiBuYXR1cmFsIG9yaWVudGF0aW9uLCB0aGUgdmFsdWUgc2hvdWxkIGJlCi0gICAgICogOTAuIElmIHRoZSB0b3Agc2lkZSBvZiBhIGZyb250LWZhY2luZyBjYW1lcmEgc2Vuc29yIGlzIGFsaWduZWQgd2l0aAotICAgICAqIHRoZSByaWdodCBvZiB0aGUgc2NyZWVuLCB0aGUgdmFsdWUgc2hvdWxkIGJlIDI3MC4KKyAgICAgKiA5MC4gSWYgdGhlIHRvcCBzaWRlIG9mIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSBzZW5zb3IgaXMgYWxpZ25lZCB3aXRoIHRoZQorICAgICAqIHJpZ2h0IG9mIHRoZSBzY3JlZW4sIHRoZSB2YWx1ZSBzaG91bGQgYmUgMjcwLgogICAgICAqLwogICAgIGludCBvcmllbnRhdGlvbjsKIH07CkBAIC0yMTksMTIgKzEyNSw2IEBACiAgICAgICAgICAgICAvLyBzZW5kIGNvbW1hbmQgdG8gY2FtZXJhIGRyaXZlcgogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKIAotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHZpZGVvIGJ1ZmZlcnMuCi0gICAgICAgICAgICBpbnQzMl90ICAgICBnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyByZXR1cm4gdGhlIGluZGl2aWR1YWwgdmlkZW8gYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGluZGV4LgotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZ2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0KICAgICAgICAgICAgIC8vIHRlbGwgY2FtZXJhIGhhbCB0byBzdG9yZSBtZXRhIGRhdGEgb3IgcmVhbCBZVVYgaW4gdmlkZW8gYnVmZmVycy4KICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoYm9vbCBlbmFibGVkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmQ4NDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9IQVJEV0FSRV9JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9IQVJEV0FSRV9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogIFRoZSBzaXplIG9mIGltYWdlIGZvciBkaXNwbGF5LgotICovCi10eXBlZGVmIHN0cnVjdCBpbWFnZV9yZWN0X3N0cnVjdAotewotICB1aW50MzJfdCB3aWR0aDsgICAgICAvKiBJbWFnZSB3aWR0aCAqLwotICB1aW50MzJfdCBoZWlnaHQ7ICAgICAvKiBJbWFnZSBoZWlnaHQgKi8KLX0gaW1hZ2VfcmVjdF90eXBlOwotCi0KLXR5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFjaykoaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2spKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLXR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2tfdGltZXN0YW1wKShuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7Ci0KLS8qKgotICogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlCi0gKiBjYW1lcmEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIsIHVzZWQgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcKLSAqIHBhcmFtZXRlcnMsIGxpdmUgcHJldmlld2luZywgYW5kIHRha2luZyBwaWN0dXJlcy4KLSAqCi0gKiBJdCBpcyBhIHJlZmVyZW5jZWQgY291bnRlZCBpbnRlcmZhY2Ugd2l0aCBSZWZCYXNlIGFzIGl0cyBiYXNlIGNsYXNzLgotICogQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSB0byByZXRyaWV2ZSBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZQotICogaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgYW5kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZQotICogZm9sbG93aW5nIHN0ZXBzIGRlc2NyaWJlIGEgdHlwaWNhbCBzZXF1ZW5jZToKLSAqCi0gKiAgIC0jIEFmdGVyIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCksIGdldFBhcmFtZXRlcnMoKSBhbmQKLSAqICAgICAgc2V0UGFyYW1ldGVycygpIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnN0YW5jZS4KLSAqICAgICAgQ2FtZXJhU2VydmljZSBjYWxscyBnZXRQcmV2aWV3SGVhcCgpIHRvIGVzdGFibGlzaCBhY2Nlc3MgdG8gdGhlCi0gKiAgICAgIHByZXZpZXcgaGVhcCBzbyBpdCBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIFN1cmZhY2VGbGluZ2VyIGZvcgotICogICAgICBlZmZpY2llbnQgZGlzcGxheSB1cGRhdGluZyB3aGlsZSBpbiBwcmV2aWV3IG1vZGUuCi0gKiAgIC0jIHN0YXJ0UHJldmlldygpIGlzIGNhbGxlZC4gIFRoZSBjYW1lcmEgaW5zdGFuY2UgdGhlbiBwZXJpb2RpY2FsbHkKLSAqICAgICAgc2VuZHMgdGhlIG1lc3NhZ2UgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FIChpZiBlbmFibGVkKSBlYWNoIHRpbWUKLSAqICAgICAgYSBuZXcgcHJldmlldyBmcmFtZSBpcyBhdmFpbGFibGUuICBJZiBkYXRhIGNhbGxiYWNrIGNvZGUgbmVlZHMgdG8gdXNlCi0gKiAgICAgIHRoaXMgbWVtb3J5IGFmdGVyIHJldHVybmluZywgaXQgbXVzdCBjb3B5IHRoZSBkYXRhLgotICoKLSAqIFByaW9yIHRvIHRha2luZyBhIHBpY3R1cmUsIENhbWVyYVNlcnZpY2UgY2FsbHMgYXV0b2ZvY3VzKCkuIFdoZW4gYXV0bwotICogZm9jdXNpbmcgaGFzIGNvbXBsZXRlZCwgdGhlIGNhbWVyYSBpbnN0YW5jZSBzZW5kcyBhIENBTUVSQV9NU0dfRk9DVVMgbm90aWZpY2F0aW9uLAotICogd2hpY2ggaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gd2hldGhlciBmb2N1c2luZyB3YXMgc3VjY2Vzc2Z1bC4gVGhlIGNhbWVyYSBpbnN0YW5jZQotICogb25seSBzZW5kcyB0aGlzIG1lc3NhZ2Ugb25jZSBhbmQgaXQgaXMgdXAgIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIGF1dG9Gb2N1cygpCi0gKiBhZ2FpbiBpZiByZWZvY3VzaW5nIGlzIGRlc2lyZWQuCi0gKgotICogQ2FtZXJhU2VydmljZSBjYWxscyB0YWtlUGljdHVyZSgpIHRvIHJlcXVlc3QgdGhlIGNhbWVyYSBpbnN0YW5jZSB0YWtlIGEKLSAqIHBpY3R1cmUuIEF0IHRoaXMgcG9pbnQsIGlmIGEgc2h1dHRlciwgcG9zdHZpZXcsIHJhdywgYW5kL29yIGNvbXByZXNzZWQgY2FsbGJhY2sKLSAqIGlzIGRlc2lyZWQsIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgbXVzdCBiZSBlbmFibGVkLiBBcyB3aXRoIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwKLSAqIGFueSBtZW1vcnkgcHJvdmlkZWQgaW4gYSBkYXRhIGNhbGxiYWNrIG11c3QgYmUgY29waWVkIGlmIGl0J3MgbmVlZGVkIGFmdGVyIHJldHVybmluZy4KLSAqLwotY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpIHsgfQotCi0gICAgLyoqIFNldCB0aGUgQU5hdGl2ZVdpbmRvdyB0byB3aGljaCBwcmV2aWV3IGZyYW1lcyBhcmUgc2VudCAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKSA9IDA7Ci0KLSAgICAvKiogUmV0dXJuIHRoZSBJTWVtb3J5SGVhcCBmb3IgdGhlIHJhdyBpbWFnZSBoZWFwICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICBnZXRSYXdIZWFwKCkgY29uc3QgPSAwOwotCi0gICAgLyoqIFNldCB0aGUgbm90aWZpY2F0aW9uIGFuZCBkYXRhIGNhbGxiYWNrcyAqLwotICAgIHZpcnR1YWwgdm9pZCBzZXRDYWxsYmFja3Mobm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2sgZGF0YV9jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wIGRhdGFfY2JfdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcikgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYWxsIHRha2UgYSBtc2d0eXBlLAotICAgICAqIHdoaWNoIGlzIGEgYml0bWFzayBvZiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbgotICAgICAqIGluY2x1ZGUvdWkvQ2FtZXJhLmgKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhIG1lc3NhZ2UsIG9yIHNldCBvZiBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIGEgbWVzc2FnZSwgb3IgYSBzZXQgb2YgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBPbmNlIHJlY2VpdmVkIGEgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgY2FtZXJhIGhhbAotICAgICAqIHNob3VsZCBub3QgcmVseSBvbiBpdHMgY2xpZW50IHRvIGNhbGwgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgdG8gcmVsZWFzZQotICAgICAqIHZpZGVvIHJlY29yZGluZyBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYWwgaGFsIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlCi0gICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkgY2FsbC4gQ2FtZXJhIGhhbCBjbGllbnRzIG11c3Qgbm90Ci0gICAgICogbW9kaWZ5L2FjY2VzcyBhbnkgdmlkZW8gcmVjb3JkaW5nIGZyYW1lIGFmdGVyIGNhbGxpbmcKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUXVlcnkgd2hldGhlciBhIG1lc3NhZ2UsIG9yIGEgc2V0IG9mIG1lc3NhZ2VzLCBpcyBlbmFibGVkLgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9wZXJhdGVzIGFzIGFuIEFORCwgaWYgYW55IG9mIHRoZSBtZXNzYWdlcwotICAgICAqIHF1ZXJpZWQgYXJlIG9mZiwgdGhpcyB3aWxsIHJldHVybiBmYWxzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIG1zZ1R5cGVFbmFibGVkKGludDMyX3QgbXNnVHlwZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RhcnQgcHJldmlldyBtb2RlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnRQcmV2aWV3KCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCBwcmV2aWV3LgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcFByZXZpZXcoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJldmlldyBpcyBlbmFibGVkLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgcHJldmlld0VuYWJsZWQoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gY2FtZXJhIGhhbCBmb3IgcGFzc2luZwotICAgICAqIHZpZGVvIGZyYW1lIGRhdGEgaW4gYSByZWNvcmRpbmcgc2Vzc2lvbi4gTXVzdCBiZSBjYWxsZWQgYWdhaW4gaWYgYSBuZXcKLSAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbiBpcyBzdGFydGVkLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdGFydFJlY29yZGluZygpLCBzaW5jZQotICAgICAqIHRoZSBzb21lIGNhbWVyYSBoYWwgbWF5IGNob29zZSB0byBhbGxvY2F0ZSB0aGUgdmlkZW8gYnVmZmVycyBvbmx5IGFmdGVyCi0gICAgICogcmVjb3JkaW5nIGlzIHN0YXJ0ZWQuCi0gICAgICoKLSAgICAgKiBTb21lIGNhbWVyYSBoYWwgbWF5IG5vdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QsIGFuZCAwIGNhbiBiZSByZXR1cm5lZCB0bwotICAgICAqIGluZGljYXRlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdmlkZW8gYnVmZmVycyB0aGF0IGNhbWVyYSBoYWwgbWFrZXMgYXZhaWxhYmxlLgotICAgICAqICAgICAgWmVybyAoMCkgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBjYW1lcmEgaGFsIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiAgICAgIHRoaXMgZmVhdHVyZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGludDMyX3QgICAgIGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHZpZGVvIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbmRleCBpbiBhCi0gICAgICogcmVjb3JkaW5nIHNlc3Npb24uIE11c3QgYmUgY2FsbGVkIGFnYWluIGlmIGEgbmV3IHJlY29yZGluZyBzZXNzaW9uCi0gICAgICogaXMgc3RhcnRlZC4KLSAgICAgKgotICAgICAqIEl0IGFsbG93cyBhIGNsaWVudCB0byByZXRyaWV2ZSBhbGwgdmlkZW8gYnVmZmVycyB0aGF0IGNhbWVyYSBoYWwgbWFrZXMKLSAgICAgKiBhdmFpbGFibGUgdG8gcGFzc2luZyB2aWRlbyBmcmFtZSBkYXRhIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCBhbGwKLSAgICAgKiB2YWxpZCBpbmRleCB2YWx1ZXMuIFRoZSB2YWxpZCBpbmRleCB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIG4sIHdoZXJlCi0gICAgICogbiA9IGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgLSAxLiBXaXRoIGFuIGluZGV4IG91dHNpZGUgb2YgdGhlIHZhbGlkCi0gICAgICogcmFuZ2UsIDAgbXVzdCBiZSByZXR1cm5lZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgotICAgICAqIHN0YXJ0UmVjb3JkaW5nKCkuCi0gICAgICoKLSAgICAgKiBUaGUgdmlkZW8gYnVmZmVycyBzaG91bGQgTk9UIGJlIG1vZGlmaWVkL3JlbGVhc2VkIGJ5IGNhbWVyYSBoYWwKLSAgICAgKiB1bnRpbCBzdG9wUmVjb3JkaW5nKCkgaXMgY2FsbGVkIGFuZCBhbGwgb3V0c3RhbmRpbmcgdmlkZW8gYnVmZmVycwotICAgICAqIHByZXZpb3VzbHkgc2VudCBvdXQgdmlhIENBTUVSQV9NU0dfVklERU9fRlJBTUUgaGF2ZSBiZWVuIHJlbGVhc2VkCi0gICAgICogdmlhIHJlbGVhc2VWaWRlb0J1ZmZlcigpLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IGFuIGluZGV4IHRvIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIHZpZGVvIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZpZGVvIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldFZpZGVvQnVmZmVyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIC8qKgotICAgICAqIFJlcXVlc3QgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUgbWV0YSBkYXRhIG9yIHJlYWwgWVVWIGRhdGEgaW4KLSAgICAgKiB0aGUgdmlkZW8gYnVmZmVycyBzZW5kIG91dCB2aWEgQ0FNRVJBX01TR19WSURFT19GUlJBTUUgZm9yIGEKLSAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbi4gSWYgaXQgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgY2FtZXJhCi0gICAgICogaGFsIGJlaGF2aW9yIGlzIHRvIHN0b3JlIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzdGFydFJlY29yZGluZygpIGluIG9yZGVyCi0gICAgICogdG8gYmUgZWZmZWN0aXZlLgotICAgICAqCi0gICAgICogSWYgbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgdmlkZW8gYnVmZmVycywgaXQgaXMgdXAgdG8gdGhlCi0gICAgICogcmVjZWl2ZXIgb2YgdGhlIHZpZGVvIGJ1ZmZlcnMgdG8gaW50ZXJwcmV0IHRoZSBjb250ZW50cyBhbmQKLSAgICAgKiB0byBmaW5kIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBtZXRhIGRhdGEKLSAgICAgKiBpbiB0aGUgYnVmZmVyLiBIb3cgdGhpcyBpcyBkb25lIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mCi0gICAgICogdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBTb21lIGNhbWVyYSBoYWwgbWF5IG5vdCBzdXBwb3J0IHN0b3JpbmcgbWV0YSBkYXRhIGluIHRoZSB2aWRlbwotICAgICAqIGJ1ZmZlcnMsIGJ1dCBhbGwgY2FtZXJhIGhhbCBzaG91bGQgc3VwcG9ydCBzdG9yaW5nIHJlYWwgWVVWIGRhdGEKLSAgICAgKiBpbiB0aGUgdmlkZW8gYnVmZmVycy4gSWYgdGhlIGNhbWVyYSBoYWwgZG9lcyBub3Qgc3VwcG9ydCBzdG9yaW5nCi0gICAgICogdGhlIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycyB3aGVuIGl0IGlzIHJlcXVlc3RlZCB0byBkbwotICAgICAqIGRvLCBJTlZBTElEX09QRVJBVElPTiBtdXN0IGJlIHJldHVybmVkLiBJdCBpcyB2ZXJ5IHVzZWZ1bCBmb3IKLSAgICAgKiB0aGUgY2FtZXJhIGhhbCB0byBwYXNzIG1ldGEgZGF0YSByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIGZyYW1lCi0gICAgICogZGF0YSBkaXJlY3RseSB0byB0aGUgdmlkZW8gZW5jb2Rlciwgc2luY2UgdGhlIGFtb3VudCBvZiB0aGUKLSAgICAgKiB1bmNvbXByZXNzZWQgZnJhbWUgZGF0YSBjYW4gYmUgdmVyeSBsYXJnZSBpZiB2aWRlbyBzaXplIGlzIGxhcmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZSBpZiB0cnVlIHRvIGluc3RydWN0IHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlCi0gICAgICogICAgICBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnM7IGZhbHNlIHRvIGluc3RydWN0Ci0gICAgICogICAgICB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSByZWFsIFlVViBkYXRhIGluIHRoZSB2aWRlbwotICAgICAqICAgICAgYnVmZmVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gT0sgb24gc3VjY2Vzcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoYm9vbCBlbmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlPyBJTlZBTElEX09QRVJBVElPTjogT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCByZWNvcmQgbW9kZS4gV2hlbiBhIHJlY29yZCBpbWFnZSBpcyBhdmFpbGFibGUgYSBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FCi0gICAgICogbWVzc2FnZSBpcyBzZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWUuIEV2ZXJ5IHJlY29yZCBmcmFtZSBtdXN0IGJlIHJlbGVhc2VkCi0gICAgICogYnkgYSBjYW1lcmFsIGhhbCBjbGllbnQgdmlhIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpIGJlZm9yZSB0aGUgY2xpZW50IGNhbGxzCi0gICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuIEFmdGVyIHRoZSBjbGllbnQgY2FsbHMKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgaXQgaXMgY2FtZXJhIGhhbCdzIHJlc3BvbnNpYmlsaXR5Ci0gICAgICogdG8gbWFuYWdlIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB2aWRlbyByZWNvcmRpbmcgZnJhbWVzLCBhbmQgdGhlIGNsaWVudCBtdXN0Ci0gICAgICogbm90IG1vZGlmeS9hY2Nlc3MgYW55IHZpZGVvIHJlY29yZGluZyBmcmFtZXMuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydFJlY29yZGluZygpID0gMDsKLQotICAgIC8qKgotICAgICAqIFN0b3AgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcmVjb3JkaW5nLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcFJlY29yZGluZygpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiByZWNvcmRpbmcgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHJlY29yZGluZ0VuYWJsZWQoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIGEgcmVjb3JkIGZyYW1lIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ0FNRVJBX01TR19WSURFT19GUkFNRS4KLSAgICAgKgotICAgICAqIEl0IGlzIGNhbWVyYSBoYWwgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gcmVsZWFzZSB2aWRlbyByZWNvcmRpbmcKLSAgICAgKiBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYSBoYWwgYmVmb3JlIHRoZSBjYW1lcmEgaGFsIHJlY2VpdmVzCi0gICAgICogYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLiBBZnRlciBpdCByZWNlaXZlcwotICAgICAqIHRoZSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MKLSAgICAgKiByZXNwb25zaWJpbGl0eSBvZiBtYW5hZ2luZyB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nCi0gICAgICogZnJhbWVzLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pID0gMDsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGF1dG8gZm9jdXMsIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sgcm91dGluZSBpcyBjYWxsZWQKLSAgICAgKiB3aXRoIENBTUVSQV9NU0dfRk9DVVMgb25jZSB3aGVuIGZvY3VzaW5nIGlzIGNvbXBsZXRlLiBhdXRvRm9jdXMoKQotICAgICAqIHdpbGwgYmUgY2FsbGVkIGFnYWluIGlmIGFub3RoZXIgYXV0byBmb2N1cyBpcyBuZWVkZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdXRvRm9jdXMoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGF1dG8tZm9jdXMgZnVuY3Rpb24uIElmIHRoZSBhdXRvLWZvY3VzIGlzIHN0aWxsIGluIHByb2dyZXNzLAotICAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjYW5jZWwgaXQuIFdoZXRoZXIgdGhlIGF1dG8tZm9jdXMgaXMgaW4gcHJvZ3Jlc3MKLSAgICAgKiBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGZvY3VzIHBvc2l0aW9uIHRvIHRoZSBkZWZhdWx0LgotICAgICAqIElmIHRoZSBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWZvY3VzLCB0aGlzIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBjYW5jZWxBdXRvRm9jdXMoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlIGEgcGljdHVyZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHRha2VQaWN0dXJlKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIGEgcGljdHVyZSB0aGF0IHdhcyBzdGFydGVkIHdpdGggdGFrZVBpY3R1cmUuICBDYWxsaW5nIHRoaXMKLSAgICAgKiBtZXRob2Qgd2hlbiBubyBwaWN0dXJlIGlzIGJlaW5nIHRha2VuIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBjYW5jZWxQaWN0dXJlKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gVGhpcyByZXR1cm5zIEJBRF9WQUxVRSBpZiBhbnkgcGFyYW1ldGVyIGlzCi0gICAgICogaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpID0gMDsKLQotICAgIC8qKiBSZXR1cm4gdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiAqLwotICAgIHZpcnR1YWwgQ2FtZXJhUGFyYW1ldGVycyAgZ2V0UGFyYW1ldGVycygpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgb3duZWQgYnkgdGhpcyBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBpcwotICAgICAqICpub3QqIGRvbmUgaW4gdGhlIGRlc3RydWN0b3IuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBEdW1wIHN0YXRlIG9mIHRoZSBjYW1lcmEgaGFyZHdhcmUKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCA9IDA7Ci19OwotCi0vKioKLSAqIFRoZSBmdW5jdGlvbnMgbmVlZCB0byBiZSBwcm92aWRlZCBieSB0aGUgY2FtZXJhIEhBTC4KLSAqCi0gKiBJZiBnZXROdW1iZXJPZkNhbWVyYXMoKSByZXR1cm5zIE4sIHRoZSB2YWxpZCBjYW1lcmFJZCBmb3IgZ2V0Q2FtZXJhSW5mbygpCi0gKiBhbmQgb3BlbkNhbWVyYUhhcmR3YXJlKCkgaXMgMCB0byBOLTEuCi0gKi8KLWV4dGVybiAiQyIgaW50IEhBTF9nZXROdW1iZXJPZkNhbWVyYXMoKTsKLWV4dGVybiAiQyIgdm9pZCBIQUxfZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKTsKLS8qIEhBTCBzaG91bGQgcmV0dXJuIE5VTEwgaWYgaXQgZmFpbHMgdG8gb3BlbiBjYW1lcmEgaGFyZHdhcmUuICovCi1leHRlcm4gIkMiIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBIQUxfb3BlbkNhbWVyYUhhcmR3YXJlKGludCBjYW1lcmFJZCk7Ci0KLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBkYTJmMDQ5Li44M2Q0ZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0yNDcsNiArMjQ3LDQ1IEBACiAgICAgLy8gU3VwcG9ydGVkIGZvY3VzIG1vZGVzLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICJhdXRvLG1hY3JvLGZpeGVkIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfRk9DVVNfTU9ERVNbXTsKKyAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgZm9jdXMgYXJlYXMgc3VwcG9ydGVkLiBUaGlzIGlzIHRoZSBtYXhpbXVtIGxlbmd0aAorICAgIC8vIG9mIEtFWV9GT0NVU19BUkVBUy4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMCIgb3IgIjIiLiBSZWFkIG9ubHkuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX01BWF9OVU1fRk9DVVNfQVJFQVNbXTsKKyAgICAvLyBDdXJyZW50IGZvY3VzIGFyZWFzLgorICAgIC8vCisgICAgLy8gQmVmb3JlIGFjY2Vzc2luZyB0aGlzIHBhcmFtZXRlciwgYXBwcyBzaG91bGQgY2hlY2sKKyAgICAvLyBLRVlfTUFYX05VTV9GT0NVU19BUkVBUyBmaXJzdCB0byBrbm93IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmb2N1cyBhcmVhcworICAgIC8vIGZpcnN0LiBJZiB0aGUgdmFsdWUgaXMgMCwgZm9jdXMgYXJlYSBpcyBub3Qgc3VwcG9ydGVkLgorICAgIC8vCisgICAgLy8gRWFjaCBmb2N1cyBhcmVhIGlzIGEgZml2ZS1lbGVtZW50IGludCBhcnJheS4gVGhlIGZpcnN0IGZvdXIgZWxlbWVudHMgYXJlCisgICAgLy8gdGhlIHJlY3RhbmdsZSBvZiB0aGUgYXJlYSAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKS4gVGhlIGRpcmVjdGlvbiBpcworICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBzZW5zb3Igb3JpZW50YXRpb24sIHRoYXQgaXMsIHdoYXQgdGhlIHNlbnNvciBzZWVzLiBUaGUKKyAgICAvLyBkaXJlY3Rpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSByb3RhdGlvbiBvciBtaXJyb3Jpbmcgb2YKKyAgICAvLyBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OLiBDb29yZGluYXRlcyByYW5nZSBmcm9tIC0xMDAwIHRvIDEwMDAuCisgICAgLy8gKC0xMDAwLC0xMDAwKSBpcyB0aGUgdXBwZXIgbGVmdCBwb2ludC4gKDEwMDAsIDEwMDApIGlzIHRoZSBsb3dlciByaWdodAorICAgIC8vIHBvaW50LiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBmb2N1cyBhcmVhcyBjYW5ub3QgYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAvLworICAgIC8vIFRoZSBmaWZ0aCBlbGVtZW50IGlzIHRoZSB3ZWlnaHQuIFZhbHVlcyBmb3Igd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvCisgICAgLy8gMTAwMC4gIFRoZSB3ZWlnaHQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcGVyLXBpeGVsIHdlaWdodCAtIGFsbAorICAgIC8vIHBpeGVscyBpbiB0aGUgYXJlYSBoYXZlIHRoZSBzcGVjaWZpZWQgd2VpZ2h0LiBUaGlzIG1lYW5zIGEgc21hbGwgYXJlYQorICAgIC8vIHdpdGggdGhlIHNhbWUgd2VpZ2h0IGFzIGEgbGFyZ2VyIGFyZWEgd2lsbCBoYXZlIGxlc3MgaW5mbHVlbmNlIG9uIHRoZQorICAgIC8vIGZvY3VzaW5nIHRoYW4gdGhlIGxhcmdlciBhcmVhLiBGb2N1cyBhcmVhcyBjYW4gcGFydGlhbGx5IG92ZXJsYXAgYW5kIHRoZQorICAgIC8vIGRyaXZlciB3aWxsIGFkZCB0aGUgd2VpZ2h0cyBpbiB0aGUgb3ZlcmxhcCByZWdpb24uCisgICAgLy8KKyAgICAvLyBBIHNwZWNpYWwgY2FzZSBvZiBzaW5nbGUgZm9jdXMgYXJlYSAoMCwwLDAsMCwwKSBtZWFucyBkcml2ZXIgdG8gZGVjaWRlCisgICAgLy8gdGhlIGZvY3VzIGFyZWEuIEZvciBleGFtcGxlLCB0aGUgZHJpdmVyIG1heSB1c2UgbW9yZSBzaWduYWxzIHRvIGRlY2lkZQorICAgIC8vIGZvY3VzIGFyZWFzIGFuZCBjaGFuZ2UgdGhlbSBkeW5hbWljYWxseS4gQXBwcyBjYW4gc2V0ICgwLDAsMCwwLDApIGlmIHRoZXkKKyAgICAvLyB3YW50IHRoZSBkcml2ZXIgdG8gZGVjaWRlIGZvY3VzIGFyZWFzLgorICAgIC8vCisgICAgLy8gRm9jdXMgYXJlYXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcgKEtFWV9aT09NKS4gTm8KKyAgICAvLyBtYXR0ZXIgd2hhdCB0aGUgem9vbSBsZXZlbCBpcywgKC0xMDAwLC0xMDAwKSByZXByZXNlbnRzIHRoZSB0b3Agb2YgdGhlCisgICAgLy8gY3VycmVudGx5IHZpc2libGUgY2FtZXJhIGZyYW1lLiBUaGUgZm9jdXMgYXJlYSBjYW5ub3QgYmUgc2V0IHRvIGJlCisgICAgLy8gb3V0c2lkZSB0aGUgY3VycmVudCBmaWVsZCBvZiB2aWV3LCBldmVuIHdoZW4gdXNpbmcgem9vbS4KKyAgICAvLworICAgIC8vIEZvY3VzIGFyZWEgb25seSBoYXMgZWZmZWN0IGlmIHRoZSBjdXJyZW50IGZvY3VzIG1vZGUgaXMgRk9DVVNfTU9ERV9BVVRPLAorICAgIC8vIEZPQ1VTX01PREVfTUFDUk8sIG9yIEZPQ1VTX01PREVfQ09OVElOT1VTX1ZJREVPLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIoLTEwLC0xMCwwLDAsMzAwKSwoMCwwLDEwLDEwLDcwMCkiLiBSZWFkL3dyaXRlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9GT0NVU19BUkVBU1tdOwogICAgIC8vIEZvY2FsIGxlbmd0aCBpbiBtaWxsaW1ldGVyLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICI0LjMxIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9GT0NBTF9MRU5HVEhbXTsKQEAgLTI3MCw2ICszMDksOTQgQEAKICAgICAvLyAwLjMzMzMsIEVWIGlzIC0yLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIwLjMzMzMzMzMzMyIgb3IgIjAuNSIuIFJlYWQgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX1NURVBbXTsKKyAgICAvLyBUaGUgc3RhdGUgb2YgdGhlIGF1dG8tZXhwb3N1cmUgbG9jay4gInRydWUiIG1lYW5zIHRoYXQKKyAgICAvLyBhdXRvLWV4cG9zdXJlIGlzIGxvY2tlZCB0byBpdHMgY3VycmVudCB2YWx1ZSBhbmQgd2lsbCBub3QKKyAgICAvLyBjaGFuZ2UuICJmYWxzZSIgbWVhbnMgdGhlIGF1dG8tZXhwb3N1cmUgcm91dGluZSBpcyBmcmVlIHRvCisgICAgLy8gY2hhbmdlIGV4cG9zdXJlIHZhbHVlcy4gSWYgYXV0by1leHBvc3VyZSBpcyBhbHJlYWR5IGxvY2tlZCwKKyAgICAvLyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBhZ2FpbiBoYXMgbm8gZWZmZWN0ICh0aGUgZHJpdmVyIHdpbGwgbm90CisgICAgLy8gcmVjYWxjdWxhdGUgZXhwb3N1cmUgdmFsdWVzKS4gQ2hhbmdpbmcgZXhwb3N1cmUgY29tcGVuc2F0aW9uCisgICAgLy8gc2V0dGluZ3Mgd2lsbCBzdGlsbCBhZmZlY3QgdGhlIGV4cG9zdXJlIHNldHRpbmdzIHdoaWxlCisgICAgLy8gYXV0by1leHBvc3VyZSBpcyBsb2NrZWQuIFN0b3BwaW5nIHByZXZpZXcgb3IgdGFraW5nIGEgc3RpbGwKKyAgICAvLyBpbWFnZSB3aWxsIHJlbGVhc2UgdGhlIGxvY2suIEhvd2V2ZXIsIHRoZSBsb2NrIGNhbiBiZQorICAgIC8vIHJlLWVuYWJsZWQgcHJpb3IgdG8gcHJldmlldyBiZWluZyByZS1zdGFydGVkLCB0byBrZWVwIHRoZQorICAgIC8vIGV4cG9zdXJlIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBsb2NrLiBJbiBjb25qdW5jdGlvbiB3aXRoCisgICAgLy8gZXhwb3N1cmUgY29tcGVuc2F0aW9uLCB0aGlzIGFsbG93cyBmb3IgY2FwdHVyaW5nIG11bHRpLWV4cG9zdXJlCisgICAgLy8gYnJhY2tldHMgd2l0aCBrbm93biByZWxhdGl2ZSBleHBvc3VyZSB2YWx1ZXMuIExvY2tpbmcKKyAgICAvLyBhdXRvLWV4cG9zdXJlIGFmdGVyIG9wZW4gYnV0IGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0bworICAgIC8vIHN0YXJ0UHJldmlldyBtYXkgcmVzdWx0IGluIHNldmVyZWx5IG92ZXItIG9yIHVuZGVyLWV4cG9zZWQKKyAgICAvLyBpbWFnZXMuICBUaGUgZHJpdmVyIG1heSBpbmRlcGVuZGVudGx5IGVuYWJsZSB0aGUgQUUgbG9jayBhZnRlcgorICAgIC8vIGF1dG8tZm9jdXMgY29tcGxldGVzLiBJZiBpdCBkb2VzIHNvLCB0aGlzIGtleSBtdXN0IGhhdmUgaXRzCisgICAgLy8gdmFsdWUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBsb2NrJ3MgZXhpc3RlbmNlLiBBcHBsaWNhdGlvbnMgYXJlCisgICAgLy8gZnJlZSB0byByZWxlYXNlIHN1Y2ggYSBsb2NrLCB0byByZS1lbmFibGUgQUUgd2l0aG91dCByZXN0YXJ0aW5nCisgICAgLy8gcHJldmlldy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfQVVUT19FWFBPU1VSRV9MT0NLW107CisgICAgLy8gV2hldGhlciBsb2NraW5nIHRoZSBhdXRvLWV4cG9zdXJlIGlzIHN1cHBvcnRlZC4gInRydWUiIG1lYW5zIGl0IGlzLCBhbmQKKyAgICAvLyAiZmFsc2UiIG9yIHRoaXMga2V5IG5vdCBleGlzdGluZyBtZWFucyBpdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9BVVRPX0VYUE9TVVJFX0xPQ0tfU1VQUE9SVEVEW107CisgICAgLy8gVGhlIHN0YXRlIG9mIHRoZSBhdXRvLXdoaXRlIGJhbGFuY2UgbG9jay4gInRydWUiIG1lYW5zIHRoYXQKKyAgICAvLyBhdXRvLXdoaXRlIGJhbGFuY2UgaXMgbG9ja2VkIHRvIGl0cyBjdXJyZW50IHZhbHVlIGFuZCB3aWxsIG5vdAorICAgIC8vIGNoYW5nZS4gImZhbHNlIiBtZWFucyB0aGUgYXV0by13aGl0ZSBiYWxhbmNlIHJvdXRpbmUgaXMgZnJlZSB0bworICAgIC8vIGNoYW5nZSB3aGl0ZSBiYWxhbmNlIHZhbHVlcy4gSWYgYXV0by13aGl0ZSBiYWxhbmNlIGlzIGFscmVhZHkKKyAgICAvLyBsb2NrZWQsIHNldHRpbmcgdGhpcyB0byB0cnVlIGFnYWluIGhhcyBubyBlZmZlY3QgKHRoZSBkcml2ZXIKKyAgICAvLyB3aWxsIG5vdCByZWNhbGN1bGF0ZSB3aGl0ZSBiYWxhbmNlIHZhbHVlcykuIFN0b3BwaW5nIHByZXZpZXcgb3IKKyAgICAvLyB0YWtpbmcgYSBzdGlsbCBpbWFnZSB3aWxsIHJlbGVhc2UgdGhlIGxvY2suIEhvd2V2ZXIsIHRoZSBsb2NrCisgICAgLy8gY2FuIGJlIHJlLWVuYWJsZWQgcHJpb3IgdG8gcHJldmlldyBiZWluZyByZS1zdGFydGVkLCB0byBrZWVwCisgICAgLy8gdGhlIHdoaXRlIGJhbGFuY2UgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGxvY2suIEluIGNvbmp1bmN0aW9uCisgICAgLy8gd2l0aCBleHBvc3VyZSBjb21wZW5zYXRpb24sIHRoaXMgYWxsb3dzIGZvciBjYXB0dXJpbmcKKyAgICAvLyBtdWx0aS1leHBvc3VyZSBicmFja2V0cyB3aXRoIGZpeGVkIHdoaXRlIGJhbGFuY2UuIExvY2tpbmcKKyAgICAvLyBhdXRvLXdoaXRlIGJhbGFuY2UgYWZ0ZXIgb3BlbiBidXQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvCisgICAgLy8gc3RhcnRQcmV2aWV3IG1heSByZXN1bHQgaW4gc2V2ZXJlbHkgaW5jb3JyZWN0IGNvbG9yLiAgVGhlCisgICAgLy8gZHJpdmVyIG1heSBpbmRlcGVuZGVudGx5IGVuYWJsZSB0aGUgQVdCIGxvY2sgYWZ0ZXIgYXV0by1mb2N1cworICAgIC8vIGNvbXBsZXRlcy4gSWYgaXQgZG9lcyBzbywgdGhpcyBrZXkgbXVzdCBoYXZlIGl0cyB2YWx1ZSB1cGRhdGVkCisgICAgLy8gdG8gcmVmbGVjdCB0aGUgbG9jaydzIGV4aXN0ZW5jZS4gQXBwbGljYXRpb25zIGFyZSBmcmVlIHRvCisgICAgLy8gcmVsZWFzZSBzdWNoIGEgbG9jaywgdG8gcmUtZW5hYmxlIEFXQiB3aXRob3V0IHJlc3RhcnRpbmcKKyAgICAvLyBwcmV2aWV3LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9BVVRPX1dISVRFQkFMQU5DRV9MT0NLW107CisgICAgLy8gV2hldGhlciBsb2NraW5nIHRoZSBhdXRvLXdoaXRlIGJhbGFuY2UgaXMgc3VwcG9ydGVkLiAidHJ1ZSIKKyAgICAvLyBtZWFucyBpdCBpcywgYW5kICJmYWxzZSIgb3IgdGhpcyBrZXkgbm90IGV4aXN0aW5nIG1lYW5zIGl0IGlzCisgICAgLy8gbm90IHN1cHBvcnRlZC4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DS19TVVBQT1JURURbXTsKKworICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXRlcmluZyBhcmVhcyBzdXBwb3J0ZWQuIFRoaXMgaXMgdGhlIG1heGltdW0KKyAgICAvLyBsZW5ndGggb2YgS0VZX01FVEVSSU5HX0FSRUFTLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIwIiBvciAiMiIuIFJlYWQgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUFYX05VTV9NRVRFUklOR19BUkVBU1tdOworICAgIC8vIEN1cnJlbnQgbWV0ZXJpbmcgYXJlYXMuIENhbWVyYSBkcml2ZXIgdXNlcyB0aGVzZSBhcmVhcyB0byBkZWNpZGUKKyAgICAvLyBleHBvc3VyZS4KKyAgICAvLworICAgIC8vIEJlZm9yZSBhY2Nlc3NpbmcgdGhpcyBwYXJhbWV0ZXIsIGFwcHMgc2hvdWxkIGNoZWNrCisgICAgLy8gS0VZX01BWF9OVU1fTUVURVJJTkdfQVJFQVMgZmlyc3QgdG8ga25vdyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWV0ZXJpbmcKKyAgICAvLyBhcmVhcyBmaXJzdC4gSWYgdGhlIHZhbHVlIGlzIDAsIG1ldGVyaW5nIGFyZWEgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAvLworICAgIC8vIEVhY2ggbWV0ZXJpbmcgYXJlYSBpcyBhIHJlY3RhbmdsZSB3aXRoIHNwZWNpZmllZCB3ZWlnaHQuIFRoZSBkaXJlY3Rpb24gaXMKKyAgICAvLyByZWxhdGl2ZSB0byB0aGUgc2Vuc29yIG9yaWVudGF0aW9uLCB0aGF0IGlzLCB3aGF0IHRoZSBzZW5zb3Igc2Vlcy4gVGhlCisgICAgLy8gZGlyZWN0aW9uIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgcm90YXRpb24gb3IgbWlycm9yaW5nIG9mCisgICAgLy8gQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTi4gQ29vcmRpbmF0ZXMgb2YgdGhlIHJlY3RhbmdsZSByYW5nZQorICAgIC8vIGZyb20gLTEwMDAgdG8gMTAwMC4gKC0xMDAwLCAtMTAwMCkgaXMgdGhlIHVwcGVyIGxlZnQgcG9pbnQuICgxMDAwLCAxMDAwKQorICAgIC8vIGlzIHRoZSBsb3dlciByaWdodCBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgbWV0ZXJpbmcgYXJlYXMgY2Fubm90CisgICAgLy8gYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAvLworICAgIC8vIFRoZSBmaWZ0aCBlbGVtZW50IGlzIHRoZSB3ZWlnaHQuIFZhbHVlcyBmb3Igd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvCisgICAgLy8gMTAwMC4gIFRoZSB3ZWlnaHQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcGVyLXBpeGVsIHdlaWdodCAtIGFsbAorICAgIC8vIHBpeGVscyBpbiB0aGUgYXJlYSBoYXZlIHRoZSBzcGVjaWZpZWQgd2VpZ2h0LiBUaGlzIG1lYW5zIGEgc21hbGwgYXJlYQorICAgIC8vIHdpdGggdGhlIHNhbWUgd2VpZ2h0IGFzIGEgbGFyZ2VyIGFyZWEgd2lsbCBoYXZlIGxlc3MgaW5mbHVlbmNlIG9uIHRoZQorICAgIC8vIG1ldGVyaW5nIHRoYW4gdGhlIGxhcmdlciBhcmVhLiBNZXRlcmluZyBhcmVhcyBjYW4gcGFydGlhbGx5IG92ZXJsYXAgYW5kCisgICAgLy8gdGhlIGRyaXZlciB3aWxsIGFkZCB0aGUgd2VpZ2h0cyBpbiB0aGUgb3ZlcmxhcCByZWdpb24uCisgICAgLy8KKyAgICAvLyBBIHNwZWNpYWwgY2FzZSBvZiBhbGwtemVybyBzaW5nbGUgbWV0ZXJpbmcgYXJlYSBtZWFucyBkcml2ZXIgdG8gZGVjaWRlCisgICAgLy8gdGhlIG1ldGVyaW5nIGFyZWEuIEZvciBleGFtcGxlLCB0aGUgZHJpdmVyIG1heSB1c2UgbW9yZSBzaWduYWxzIHRvIGRlY2lkZQorICAgIC8vIG1ldGVyaW5nIGFyZWFzIGFuZCBjaGFuZ2UgdGhlbSBkeW5hbWljYWxseS4gQXBwcyBjYW4gc2V0IGFsbC16ZXJvIGlmIHRoZXkKKyAgICAvLyB3YW50IHRoZSBkcml2ZXIgdG8gZGVjaWRlIG1ldGVyaW5nIGFyZWFzLgorICAgIC8vCisgICAgLy8gTWV0ZXJpbmcgYXJlYXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcgKEtFWV9aT09NKS4KKyAgICAvLyBObyBtYXR0ZXIgd2hhdCB0aGUgem9vbSBsZXZlbCBpcywgKC0xMDAwLC0xMDAwKSByZXByZXNlbnRzIHRoZSB0b3Agb2YgdGhlCisgICAgLy8gY3VycmVudGx5IHZpc2libGUgY2FtZXJhIGZyYW1lLiBUaGUgbWV0ZXJpbmcgYXJlYSBjYW5ub3QgYmUgc2V0IHRvIGJlCisgICAgLy8gb3V0c2lkZSB0aGUgY3VycmVudCBmaWVsZCBvZiB2aWV3LCBldmVuIHdoZW4gdXNpbmcgem9vbS4KKyAgICAvLworICAgIC8vIE5vIG1hdHRlciB3aGF0IG1ldGVyaW5nIGFyZWFzIGFyZSwgdGhlIGZpbmFsIGV4cG9zdXJlIGFyZSBjb21wZW5zYXRlZAorICAgIC8vIGJ5IEtFWV9FWFBPU1VSRV9DT01QRU5TQVRJT04uCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIigtMTAsLTEwLDAsMCwzMDApLCgwLDAsMTAsMTAsNzAwKSIuIFJlYWQvd3JpdGUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX01FVEVSSU5HX0FSRUFTW107CiAgICAgLy8gQ3VycmVudCB6b29tIHZhbHVlLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIwIiBvciAiNiIuIFJlYWQvd3JpdGUuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1pPT01bXTsKQEAgLTM0OSw2ICs0NzYsNyBAQAogCiAgICAgLy8gVmFsdWUgZm9yIEtFWV9aT09NX1NVUFBPUlRFRCBvciBLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVELgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFRSVUVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGQUxTRVtdOwogCiAgICAgLy8gVmFsdWUgZm9yIEtFWV9GT0NVU19ESVNUQU5DRVMuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgRk9DVVNfRElTVEFOQ0VfSU5GSU5JVFlbXTsKQEAgLTQyMiw2ICs1NTAsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjJJW107IC8vIFlVWTIKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIwUFtdOyAvLyBZVjEyCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1JHQjU2NVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9SR0JBODg4OFtdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9KUEVHW107CiAKICAgICAvLyBWYWx1ZXMgZm9yIGZvY3VzIG1vZGUgc2V0dGluZ3MuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggMjM0NGIzZi4uNDAwZDdmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMTAyLDEyICsxMDIsNiBAQAogICAgIC8vIHNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSA9IDA7CiAKLSAgICAvLyByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgdmlkZW8gYnVmZmVycwotICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3QgID0gMDsKLQotICAgIC8vIHJldHVybiB0aGUgaW5kaXZpZHVhbCB2aWRlbyBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOwotCiAgICAgLy8gdGVsbCB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSBtZXRhIGRhdGEgb3IgcmVhbCBZVVYgZGF0YSBpbiB2aWRlbyBidWZmZXJzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoYm9vbCBlbmFibGVkKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmggYi9pbmNsdWRlL2RybS9Ecm1JbmZvRXZlbnQuaAppbmRleCBhZGQzM2QzLi5kZmNhMjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9Ecm1JbmZvRXZlbnQuaAorKysgYi9pbmNsdWRlL2RybS9Ecm1JbmZvRXZlbnQuaApAQCAtNzcsNyArNzcsNyBAQAogICAgICAqIEBwYXJhbVtpbl0gaW5mb1R5cGUgVHlwZSBvZiBpbmZvcm1hdGlvbgogICAgICAqIEBwYXJhbVtpbl0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaXB0aW9uCiAgICAgICovCi0gICAgRHJtSW5mb0V2ZW50KGludCB1bmlxdWVJZCwgaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtZXNzYWdlKTsKKyAgICBEcm1JbmZvRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgaW5mb1R5cGUsIGNvbnN0IFN0cmluZzggbWVzc2FnZSk7CiAKICAgICAvKioKICAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1JbmZvRXZlbnQKQEAgLTEwNCwxMiArMTA0LDEyIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE1lc3NhZ2UgZGVzY3JpcHRpb24KICAgICAgKi8KLSAgICBjb25zdCBTdHJpbmc4JiBnZXRNZXNzYWdlKCkgY29uc3Q7CisgICAgY29uc3QgU3RyaW5nOCBnZXRNZXNzYWdlKCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgaW50IG1VbmlxdWVJZDsKICAgICBpbnQgbUluZm9UeXBlOwotICAgIGNvbnN0IFN0cmluZzgmIG1NZXNzYWdlOworICAgIGNvbnN0IFN0cmluZzggbU1lc3NhZ2U7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCmluZGV4IDdhMGJmNGYuLmI4ZmU0NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAorKysgYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgogICAgICAqLwotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudApAQCAtNzgsNyArNzgsNyBAQAogICAgICAqIEByZXR1cm4KICAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCiAgICAgICovCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSk7CiAKICAgICAvKioKICAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUpOwogCiAgICAgLyoqCiAgICAgICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZS4KICAgICAgKiAgICAgSW4gY2FzZSBsaWNlbnNlIGhhcyBiZWVuIGV4cGlyZWQsIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIC8qKgogICAgICAqIEluZm9ybXMgdGhlIERSTSBlbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCkBAIC0xMTMsNyArMTEzLDggQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC0xMjUsNyArMTI2LDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKICAgICAvKioKICAgICAgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdApAQCAtMTQ0LDcgKzE0NSw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwogICAgIHN0YXR1c190IGRlY3J5cHQoCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYgPSBOVUxMKTsKIAogICAgIC8qKgpAQCAtMTU1LDcgKzE1Niw4IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTE2Nyw3ICsxNjksOCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICBzc2l6ZV90IHByZWFkKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOworICAgIHNzaXplX3QgcHJlYWQoc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaAppbmRleCA5MDU3Zjk4Li4yNjMyY2JkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIApAQCAtMjU1LDcgKzI1Niw3IEBACiAvKioKICAqIERlZmluZXMgZGVjcnlwdGlvbiBoYW5kbGUKICAqLwotY2xhc3MgRGVjcnlwdEhhbmRsZSB7CitjbGFzcyBEZWNyeXB0SGFuZGxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogICAgIC8qKgogICAgICAqIERlY3J5cHRpb24gc2Vzc2lvbiBIYW5kbGUKQEAgLTMxMSwxMCArMzEyLDE1IEBACiAgICAgICAgICAgICBkZWNyeXB0SWQoSU5WQUxJRF9WQUxVRSksCiAgICAgICAgICAgICBtaW1lVHlwZSgiIiksCiAgICAgICAgICAgICBkZWNyeXB0QXBpVHlwZShJTlZBTElEX1ZBTFVFKSwKLSAgICAgICAgICAgIHN0YXR1cyhJTlZBTElEX1ZBTFVFKSB7CisgICAgICAgICAgICBzdGF0dXMoSU5WQUxJRF9WQUxVRSksCisgICAgICAgICAgICBkZWNyeXB0SW5mbyhOVUxMKSB7CiAKICAgICB9CiAKKyAgICB+RGVjcnlwdEhhbmRsZSgpIHsKKyAgICAgICAgZGVsZXRlIGRlY3J5cHRJbmZvOyBkZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgfQorCiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRGVjcnlwdEhhbmRsZSYgaGFuZGxlKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoZGVjcnlwdElkIDwgaGFuZGxlLmRlY3J5cHRJZCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IGNkYTJiZTAuLmRkOTNmZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtNDQsNTAgKzQ0LDYgQEAKIHB1YmxpYzoKIAogICAgIC8qCi0gICAgICogIFN0YXRpYyBtZXRob2RzIGZvciBlZmZlY3QgbGlicmFyaWVzIG1hbmFnZW1lbnQuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqICAgTG9hZHMgdGhlIGVmZmVjdCBsaWJyYXJ5IHdoaWNoIHBhdGggaXMgZ2l2ZW4gYXMgZmlyc3QgYXJndW1lbnQuCi0gICAgICogICBUaGlzIG11c3QgYmUgdGhlIGZ1bGwgcGF0aCBvZiBhIGR5bmFtaWMgbGlicmFyeSAoLnNvKSBpbXBsZW1lbnRpbmcgb25lIG9yCi0gICAgICogICBtb3JlIGVmZmVjdCBlbmdpbmVzIGFuZCBleHBvc2luZyB0aGUgZWZmZWN0IGxpYnJhcnkgaW50ZXJmYWNlIGRlc2NyaWJlZCBpbgotICAgICAqICAgRWZmZWN0QXBpLmguIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlIG9uIHRoZSBsaWJyYXJ5IGZvciB1c2UgYnkKLSAgICAgKiAgIGZ1cnRoZXIgY2FsbCB0byB1bmxvYWRFZmZlY3RMaWJyYXJ5KCkgdG8gdW5sb2FkIHRoZSBsaWJyYXJ5LgotICAgICAqCi0gICAgICogICBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIGxpYlBhdGg6ICAgIGZ1bGwgcGF0aCBvZiB0aGUgZHluYW1pYyBsaWJyYXJ5IGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtLgotICAgICAqICAgICAgICAgIGhhbmRsZTogICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBsaWJyYXJ5IGhhbmRsZQotICAgICAqCi0gICAgICogICBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKLSAgICAgKiAgICAgICAgICBOT19FUlJPUiAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLSAgICAgKiAgICAgICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2Ugb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY29uZmlndXJlIGF1ZGlvCi0gICAgICogICAgICAgICAgTk9fSU5JVCAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25zCi0gICAgICogICAgICAgICAgQkFEX1ZBTFVFICAgaW52YWxpZCBsaWJQYXRoIHN0cmluZyBvciBoYW5kbGUKLSAgICAgKgotICAgICAqICAgUmV0dXJuZWQgdmFsdWU6Ci0gICAgICogICAgICAgICAgKmhhbmRsZSB1cGRhdGVkIHdpdGggbGlicmFyeSBoYW5kbGUKLSAgICAgKi8KLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOwotCi0gICAgLyoKLSAgICAgKiAgIFVubG9hZHMgdGhlIGVmZmVjdCBsaWJyYXJ5IHdoaWNoIGhhbmRsZSBpcyBnaXZlbiBhcyBhcmd1bWVudC4KLSAgICAgKgotICAgICAqICAgUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBoYW5kbGU6IGxpYnJhcnkgaGFuZGxlCi0gICAgICoKLSAgICAgKiAgIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgotICAgICAqICAgICAgICAgIE5PX0VSUk9SICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotICAgICAqICAgICAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZSBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBjb25maWd1cmUgYXVkaW8KLSAgICAgKiAgICAgICAgICBOT19JTklUICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICBCQURfVkFMVUUgICBpbnZhbGlkIGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCB1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpOwotCi0gICAgLyoKICAgICAgKiAgU3RhdGljIG1ldGhvZHMgZm9yIGVmZmVjdHMgZW51bWVyYXRpb24uCiAgICAgICovCiAKQEAgLTI5OCw3ICsyNTQsNyBAQAogICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCAgICAgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KIAotICAgIC8qIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgZWZmZWN0IChzZWUgZWZmZWN0X2Rlc2NyaXB0b3JfdCBpbiBFZmZlY3RBcGkuaCkuCisgICAgLyogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlZmZlY3QgKHNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGluIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKi8KICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcigpIGNvbnN0OwogCkBAIC0zMjQsNyArMjgwLDcgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCkBAIC0zNDAsNyArMjk2LDcgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KQEAgLTM2OCw3ICszMjQsNyBAQAogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKiAgICAgICAgICBhbmQgdGhlIHJldHVybmVkIHZhbHVlIChTZWUgYXVkaW9fZWZmZWN0LmgpLgogICAgICAqCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgpAQCAtMzc5LDcgKzMzNSw3IEBACiAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICBnZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKIAogICAgICAvKiBTZW5kcyBhIGNvbW1hbmQgYW5kIHJlY2VpdmVzIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgICAgKiAgICAgU2VlIEVmZmVjdEFwaS5oIGZvciBkZXRhaWxzIG9uIGVmZmVjdCBjb21tYW5kKCkgZnVuY3Rpb24sIHZhbGlkIGNvbW1hbmQgY29kZXMKKyAgICAgICogICAgIFNlZSBhdWRpb19lZmZlY3QuaCBmb3IgZGV0YWlscyBvbiBlZmZlY3QgY29tbWFuZCgpIGZ1bmN0aW9uLCB2YWxpZCBjb21tYW5kIGNvZGVzCiAgICAgICAqICAgICBhbmQgZm9ybWF0cy4KICAgICAgICovCiAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUEFSQU1FVEVSX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9QQVJBTUVURVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUGFyYW1ldGVyIHsKKworcHVibGljOgorICAgIEF1ZGlvUGFyYW1ldGVyKCkge30KKyAgICBBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BhcmFtZXRlcigpOworCisgICAgLy8gcmVzZXJ2ZWQgcGFyYW1ldGVyIGtleXMgZm9yIGNoYW5naW5nIHN0YW5kYXJkIHBhcmFtZXRlcnMgd2l0aCBzZXRQYXJhbWV0ZXJzKCkgZnVuY3Rpb24uCisgICAgLy8gVXNpbmcgdGhlc2Uga2V5cyBpcyBtYW5kYXRvcnkgZm9yIEF1ZGlvRmxpbmdlciB0byBwcm9wZXJseSBtb25pdG9yIGF1ZGlvIG91dHB1dC9pbnB1dAorICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIC8vICBrZXlSb3V0aW5nOiB0byBjaGFuZ2UgYXVkaW8gcm91dGluZywgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAorICAgIC8vICBrZXlTYW1wbGluZ1JhdGU6IHRvIGNoYW5nZSBzYW1wbGluZyByYXRlIHJvdXRpbmcsIHZhbHVlIGlzIGFuIGludAorICAgIC8vICBrZXlGb3JtYXQ6IHRvIGNoYW5nZSBhdWRpbyBmb3JtYXQsIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19mb3JtYXRfdAorICAgIC8vICBrZXlDaGFubmVsczogdG8gY2hhbmdlIGF1ZGlvIGNoYW5uZWwgY29uZmlndXJhdGlvbiwgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2NoYW5uZWxzX3QKKyAgICAvLyAga2V5RnJhbWVDb3VudDogdG8gY2hhbmdlIGF1ZGlvIG91dHB1dCBmcmFtZSBjb3VudCwgdmFsdWUgaXMgYW4gaW50CisgICAgLy8gIGtleUlucHV0U291cmNlOiB0byBjaGFuZ2UgYXVkaW8gaW5wdXQgc291cmNlLCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fc291cmNlX3QKKyAgICAvLyAgICAgKGRlZmluZWQgaW4gbWVkaWEvbWVkaWFyZWNvcmRlci5oKQorICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlSb3V0aW5nOworICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlTYW1wbGluZ1JhdGU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZvcm1hdDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa2V5Q2hhbm5lbHM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZyYW1lQ291bnQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUlucHV0U291cmNlOworCisgICAgU3RyaW5nOCB0b1N0cmluZygpOworCisgICAgc3RhdHVzX3QgYWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworICAgIHN0YXR1c190IGFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSk7CisgICAgc3RhdHVzX3QgYWRkRmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBmbG9hdCB2YWx1ZSk7CisKKyAgICBzdGF0dXNfdCByZW1vdmUoY29uc3QgU3RyaW5nOCYga2V5KTsKKworICAgIHN0YXR1c190IGdldChjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKKyAgICBzdGF0dXNfdCBnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKTsKKyAgICBzdGF0dXNfdCBnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSk7CisgICAgc3RhdHVzX3QgZ2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKKworICAgIHNpemVfdCBzaXplKCkgeyByZXR1cm4gbVBhcmFtZXRlcnMuc2l6ZSgpOyB9CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKKyAgICBLZXllZFZlY3RvciA8U3RyaW5nOCwgU3RyaW5nOD4gbVBhcmFtZXRlcnM7Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvKkFORFJPSURfQVVESU9QQVJBTUVURVJfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDI5Mzc2NGQuLjYwNTY4MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEyNyw5ICsxMjgsOSBAQAogICAgICAqCiAgICAgICogaW5wdXRTb3VyY2U6ICAgICAgICBTZWxlY3QgdGhlIGF1ZGlvIGlucHV0IHRvIHJlY29yZCB0byAoZS5nLiBBVURJT19TT1VSQ0VfREVGQVVMVCkuCiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6LgotICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQgZm9yIHNpZ25lZAorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsczogICAgICAgICAgIENoYW5uZWwgbWFzazogc2VlIEF1ZGlvU3lzdGVtOjphdWRpb19jaGFubmVscy4KKyAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBUb3RhbCBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4KICAgICAgKiBmbGFnczogICAgICAgICAgICAgIEEgYml0bWFzayBvZiBhY291c3RpYyB2YWx1ZXMgZnJvbSBlbnVtIHJlY29yZF9mbGFncy4gIEl0IGVuYWJsZXMKQEAgLTE0MiwxNSArMTQzLDE1IEBACiAgICAgICovCiAKICAgICAgZW51bSByZWNvcmRfZmxhZ3MgewotICAgICAgICAgUkVDT1JEX0FHQ19FTkFCTEUgPSBBdWRpb1N5c3RlbTo6QUdDX0VOQUJMRSwKLSAgICAgICAgIFJFQ09SRF9OU19FTkFCTEUgID0gQXVkaW9TeXN0ZW06Ok5TX0VOQUJMRSwKLSAgICAgICAgIFJFQ09SRF9JSVJfRU5BQkxFID0gQXVkaW9TeXN0ZW06OlRYX0lJUl9FTkFCTEUKKyAgICAgICAgIFJFQ09SRF9BR0NfRU5BQkxFID0gQVVESU9fSU5fQUNPVVNUSUNTX0FHQ19FTkFCTEUsCisgICAgICAgICBSRUNPUkRfTlNfRU5BQkxFICA9IEFVRElPX0lOX0FDT1VTVElDU19OU19FTkFCTEUsCisgICAgICAgICBSRUNPUkRfSUlSX0VOQUJMRSA9IEFVRElPX0lOX0FDT1VTVElDU19UWF9JSVJfRU5BQkxFLAogICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSAwLApAQCAtMTc2LDcgKzE3Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IGlucHV0U291cmNlICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKQEAgLTM0Nyw4ICszNDgsOCBAQAogCiAgICAgICAgICAgICBib29sIHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxDbGllbnRSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwpAQCAtMzYzLDEwICszNjQsMTAgQEAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVJlc2VydmVkWzJdOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKQEAgLTM4MSw3ICszODIsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCAyZGM0YmViLi42OGNkMTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMSwxMCArMjEsMTUgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisKKy8qIFhYWDogU2hvdWxkIGJlIGluY2x1ZGUgYnkgYWxsIHRoZSB1c2VycyBpbnN0ZWFkICovCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKLXR5cGVkZWYgaW50IGF1ZGlvX2lvX2hhbmRsZV90OwogCiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKQEAgLTMzLDE1MSArMzgsNiBAQAogewogcHVibGljOgogCi0gICAgZW51bSBzdHJlYW1fdHlwZSB7Ci0gICAgICAgIERFRkFVTFQgICAgICAgICAgPS0xLAotICAgICAgICBWT0lDRV9DQUxMICAgICAgID0gMCwKLSAgICAgICAgU1lTVEVNICAgICAgICAgICA9IDEsCi0gICAgICAgIFJJTkcgICAgICAgICAgICAgPSAyLAotICAgICAgICBNVVNJQyAgICAgICAgICAgID0gMywKLSAgICAgICAgQUxBUk0gICAgICAgICAgICA9IDQsCi0gICAgICAgIE5PVElGSUNBVElPTiAgICAgPSA1LAotICAgICAgICBCTFVFVE9PVEhfU0NPICAgID0gNiwKLSAgICAgICAgRU5GT1JDRURfQVVESUJMRSA9IDcsIC8vIFNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyCi0gICAgICAgIERUTUYgICAgICAgICAgICAgPSA4LAotICAgICAgICBUVFMgICAgICAgICAgICAgID0gOSwKLSAgICAgICAgTlVNX1NUUkVBTV9UWVBFUwotICAgIH07Ci0KLSAgICAvLyBBdWRpbyBzdWIgZm9ybWF0cyAoc2VlIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQpLgotICAgIGVudW0gcGNtX3N1Yl9mb3JtYXQgewotICAgICAgICBQQ01fU1VCXzE2X0JJVCAgICAgICAgICA9IDB4MSwgLy8gbXVzdCBiZSAxIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFBDTV9TVUJfOF9CSVQgICAgICAgICAgID0gMHgyLCAvLyBtdXN0IGJlIDIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICB9OwotCi0gICAgLy8gTVAzIHN1YiBmb3JtYXQgZmllbGQgZGVmaW5pdGlvbiA6IGNhbiB1c2UgMTEgTFNCcyBpbiB0aGUgc2FtZSB3YXkgYXMgTVAzIGZyYW1lIGhlYWRlciB0byBzcGVjaWZ5Ci0gICAgLy8gYml0IHJhdGUsIHN0ZXJlbyBtb2RlLCB2ZXJzaW9uLi4uCi0gICAgZW51bSBtcDNfc3ViX2Zvcm1hdCB7Ci0gICAgICAgIC8vVE9ETwotICAgIH07Ci0KLSAgICAvLyBBTVIgTkIvV0Igc3ViIGZvcm1hdCBmaWVsZCBkZWZpbml0aW9uOiBzcGVjaWZ5IGZyYW1lIGJsb2NrIGludGVybGVhdmluZywgYmFuZHdpZHRoIGVmZmljaWVudCBvciBvY3RldCBhbGlnbmVkLAotICAgIC8vIGVuY29kaW5nIG1vZGUgZm9yIHJlY29yZGluZy4uLgotICAgIGVudW0gYW1yX3N1Yl9mb3JtYXQgewotICAgICAgICAvL1RPRE8KLSAgICB9OwotCi0gICAgLy8gQUFDIHN1YiBmb3JtYXQgZmllbGQgZGVmaW5pdGlvbjogc3BlY2lmeSBwcm9maWxlIG9yIGJpdHJhdGUgZm9yIHJlY29yZGluZy4uLgotICAgIGVudW0gYWFjX3N1Yl9mb3JtYXQgewotICAgICAgICAvL1RPRE8KLSAgICB9OwotCi0gICAgLy8gVk9SQklTIHN1YiBmb3JtYXQgZmllbGQgZGVmaW5pdGlvbjogc3BlY2lmeSBxdWFsaXR5IGZvciByZWNvcmRpbmcuLi4KLSAgICBlbnVtIHZvcmJpc19zdWJfZm9ybWF0IHsKLSAgICAgICAgLy9UT0RPCi0gICAgfTsKLQotICAgIC8vIEF1ZGlvIGZvcm1hdCBjb25zaXN0cyBpbiBhIG1haW4gZm9ybWF0IGZpZWxkICh1cHBlciA4IGJpdHMpIGFuZCBhIHN1YiBmb3JtYXQgZmllbGQgKGxvd2VyIDI0IGJpdHMpLgotICAgIC8vIFRoZSBtYWluIGZvcm1hdCBpbmRpY2F0ZXMgdGhlIG1haW4gY29kZWMgdHlwZS4gVGhlIHN1YiBmb3JtYXQgZmllbGQgaW5kaWNhdGVzIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAvLyBmb3IgZWFjaCBmb3JtYXQuIFRoZSBzdWIgZm9ybWF0IGlzIG1haW5seSB1c2VkIGZvciByZWNvcmQgdG8gaW5kaWNhdGUgZm9yIGluc3RhbmNlIHRoZSByZXF1ZXN0ZWQgYml0cmF0ZQotICAgIC8vIG9yIHByb2ZpbGUuIEl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGNlcnRhaW4gZm9ybWF0cyB0byBnaXZlIGluZm9ybWF0aW9ucyBub3QgcHJlc2VudCBpbiB0aGUgZW5jb2RlZAotICAgIC8vIGF1ZGlvIHN0cmVhbSAoZS5nLiBvY3RldCBhbGlnbmVtZW50IGZvciBBTVIpLgotICAgIGVudW0gYXVkaW9fZm9ybWF0IHsKLSAgICAgICAgSU5WQUxJRF9GT1JNQVQgICAgICA9IC0xLAotICAgICAgICBGT1JNQVRfREVGQVVMVCAgICAgID0gMCwKLSAgICAgICAgUENNICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsIC8vIG11c3QgYmUgMCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBNUDMgICAgICAgICAgICAgICAgID0gMHgwMTAwMDAwMCwKLSAgICAgICAgQU1SX05CICAgICAgICAgICAgICA9IDB4MDIwMDAwMDAsCi0gICAgICAgIEFNUl9XQiAgICAgICAgICAgICAgPSAweDAzMDAwMDAwLAotICAgICAgICBBQUMgICAgICAgICAgICAgICAgID0gMHgwNDAwMDAwMCwKLSAgICAgICAgSEVfQUFDX1YxICAgICAgICAgICA9IDB4MDUwMDAwMDAsCi0gICAgICAgIEhFX0FBQ19WMiAgICAgICAgICAgPSAweDA2MDAwMDAwLAotICAgICAgICBWT1JCSVMgICAgICAgICAgICAgID0gMHgwNzAwMDAwMCwKLSAgICAgICAgTUFJTl9GT1JNQVRfTUFTSyAgICA9IDB4RkYwMDAwMDAsCi0gICAgICAgIFNVQl9GT1JNQVRfTUFTSyAgICAgPSAweDAwRkZGRkZGLAotICAgICAgICAvLyBBbGlhc2VzCi0gICAgICAgIFBDTV8xNl9CSVQgICAgICAgICAgPSAoUENNfFBDTV9TVUJfMTZfQklUKSwKLSAgICAgICAgUENNXzhfQklUICAgICAgICAgID0gKFBDTXxQQ01fU1VCXzhfQklUKQotICAgIH07Ci0KLQotICAgIC8vIENoYW5uZWwgbWFzayBkZWZpbml0aW9ucyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIEpBVkEgdmFsdWVzIGluIC9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQotICAgIGVudW0gYXVkaW9fY2hhbm5lbHMgewotICAgICAgICAvLyBvdXRwdXQgY2hhbm5lbHMKLSAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCA9IDB4NCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgPSAweDgsCi0gICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiA9IDB4MTAsCi0gICAgICAgIENIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgPSAweDIwLAotICAgICAgICBDSEFOTkVMX09VVF9CQUNLX0xFRlQgPSAweDQwLAotICAgICAgICBDSEFOTkVMX09VVF9CQUNLX1JJR0hUID0gMHg4MCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgPSAweDEwMCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSID0gMHgyMDAsCi0gICAgICAgIENIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSID0gMHg0MDAsCi0gICAgICAgIENIQU5ORUxfT1VUX01PTk8gPSBDSEFOTkVMX09VVF9GUk9OVF9MRUZULAotICAgICAgICBDSEFOTkVMX09VVF9TVEVSRU8gPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUKSwKLSAgICAgICAgQ0hBTk5FTF9PVVRfUVVBRCA9IChDSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfT1VUX0JBQ0tfTEVGVCB8IENIQU5ORUxfT1VUX0JBQ0tfUklHSFQpLAotICAgICAgICBDSEFOTkVMX09VVF9TVVJST1VORCA9IChDSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSwKLSAgICAgICAgQ0hBTk5FTF9PVVRfNVBPSU5UMSA9IChDSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBDSEFOTkVMX09VVF9CQUNLX0xFRlQgfCBDSEFOTkVMX09VVF9CQUNLX1JJR0hUKSwKLSAgICAgICAgQ0hBTk5FTF9PVVRfN1BPSU5UMSA9IChDSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBDSEFOTkVMX09VVF9CQUNLX0xFRlQgfCBDSEFOTkVMX09VVF9CQUNLX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiksCi0gICAgICAgIENIQU5ORUxfT1VUX0FMTCA9IChDSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBDSEFOTkVMX09VVF9CQUNLX0xFRlQgfCBDSEFOTkVMX09VVF9CQUNLX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiB8IENIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSwKLQotICAgICAgICAvLyBpbnB1dCBjaGFubmVscwotICAgICAgICBDSEFOTkVMX0lOX0xFRlQgPSAweDQsCi0gICAgICAgIENIQU5ORUxfSU5fUklHSFQgPSAweDgsCi0gICAgICAgIENIQU5ORUxfSU5fRlJPTlQgPSAweDEwLAotICAgICAgICBDSEFOTkVMX0lOX0JBQ0sgPSAweDIwLAotICAgICAgICBDSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEID0gMHg0MCwKLSAgICAgICAgQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQgPSAweDgwLAotICAgICAgICBDSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCA9IDB4MTAwLAotICAgICAgICBDSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEID0gMHgyMDAsCi0gICAgICAgIENIQU5ORUxfSU5fUFJFU1NVUkUgPSAweDQwMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9YX0FYSVMgPSAweDgwMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9ZX0FYSVMgPSAweDEwMDAsCi0gICAgICAgIENIQU5ORUxfSU5fWl9BWElTID0gMHgyMDAwLAotICAgICAgICBDSEFOTkVMX0lOX1ZPSUNFX1VQTElOSyA9IDB4NDAwMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTksgPSAweDgwMDAsCi0gICAgICAgIENIQU5ORUxfSU5fTU9OTyA9IENIQU5ORUxfSU5fRlJPTlQsCi0gICAgICAgIENIQU5ORUxfSU5fU1RFUkVPID0gKENIQU5ORUxfSU5fTEVGVCB8IENIQU5ORUxfSU5fUklHSFQpLAotICAgICAgICBDSEFOTkVMX0lOX0FMTCA9IChDSEFOTkVMX0lOX0xFRlQgfCBDSEFOTkVMX0lOX1JJR0hUIHwgQ0hBTk5FTF9JTl9GUk9OVCB8IENIQU5ORUxfSU5fQkFDS3wKLSAgICAgICAgICAgICAgICBDSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEIHwgQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQgfCBDSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCB8IENIQU5ORUxfSU5fQkFDS19QUk9DRVNTRUR8Ci0gICAgICAgICAgICAgICAgQ0hBTk5FTF9JTl9QUkVTU1VSRSB8IENIQU5ORUxfSU5fWF9BWElTIHwgQ0hBTk5FTF9JTl9ZX0FYSVMgfCBDSEFOTkVMX0lOX1pfQVhJUyB8Ci0gICAgICAgICAgICAgICAgQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBDSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykKLSAgICB9OwotCi0gICAgZW51bSBhdWRpb19tb2RlIHsKLSAgICAgICAgTU9ERV9JTlZBTElEID0gLTIsCi0gICAgICAgIE1PREVfQ1VSUkVOVCA9IC0xLAotICAgICAgICBNT0RFX05PUk1BTCA9IDAsCi0gICAgICAgIE1PREVfUklOR1RPTkUsCi0gICAgICAgIE1PREVfSU5fQ0FMTCwKLSAgICAgICAgTU9ERV9JTl9DT01NVU5JQ0FUSU9OLAotICAgICAgICBOVU1fTU9ERVMgIC8vIG5vdCBhIHZhbGlkIGVudHJ5LCBkZW5vdGVzIGVuZC1vZi1saXN0Ci0gICAgfTsKLQotICAgIGVudW0gYXVkaW9faW5fYWNvdXN0aWNzIHsKLSAgICAgICAgQUdDX0VOQUJMRSAgICA9IDB4MDAwMSwKLSAgICAgICAgQUdDX0RJU0FCTEUgICA9IDAsCi0gICAgICAgIE5TX0VOQUJMRSAgICAgPSAweDAwMDIsCi0gICAgICAgIE5TX0RJU0FCTEUgICAgPSAwLAotICAgICAgICBUWF9JSVJfRU5BQkxFID0gMHgwMDA0LAotICAgICAgICBUWF9ESVNBQkxFICAgID0gMAotICAgIH07Ci0KLSAgICAvLyBzcGVjaWFsIGF1ZGlvIHNlc3Npb24gdmFsdWVzCi0gICAgZW51bSBhdWRpb19zZXNzaW9ucyB7Ci0gICAgICAgIFNFU1NJT05fT1VUUFVUX1NUQUdFID0gLTEsIC8vIHNlc3Npb24gZm9yIGVmZmVjdHMgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyIG91dHB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIDApCi0gICAgICAgIFNFU1NJT05fT1VUUFVUX01JWCA9IDAsICAgIC8vIHNlc3Npb24gZm9yIGVmZmVjdHMgYXBwbGllZCB0byBvdXRwdXQgbWl4LiBUaGVzZSBlZmZlY3RzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBtb3ZlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhbm90aGVyIG91dHB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHZhbHVlIG11c3QgYmUgMCkKLSAgICB9OwotCiAgICAgLyogVGhlc2UgYXJlIHN0YXRpYyBtZXRob2RzIHRvIGNvbnRyb2wgdGhlIHN5c3RlbS13aWRlIEF1ZGlvRmxpbmdlcgogICAgICAqIG9ubHkgcHJpdmlsZWdlZCBwcm9jZXNzZXMgY2FuIGhhdmUgYWNjZXNzIHRvIHRoZW0KICAgICAgKi8KQEAgLTE4OSw2ICs0OSw3IEBACiAgICAgLy8gc2V0L2dldCBtYXN0ZXIgdm9sdW1lCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCogdm9sdW1lKTsKKwogICAgIC8vIG11dGUvdW5tdXRlIGF1ZGlvIG91dHB1dHMKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIG11dGUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wqIG11dGUpOwpAQCAtMjAxLDcgKzYyLDcgQEAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3RyZWFtTXV0ZShpbnQgc3RyZWFtLCBib29sIG11dGUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTdHJlYW1NdXRlKGludCBzdHJlYW0sIGJvb2wqIG11dGUpOwogCi0gICAgLy8gc2V0IGF1ZGlvIG1vZGUgaW4gYXVkaW8gaGFyZHdhcmUgKHNlZSBBdWRpb1N5c3RlbTo6YXVkaW9fbW9kZSkKKyAgICAvLyBzZXQgYXVkaW8gbW9kZSBpbiBhdWRpbyBoYXJkd2FyZSAoc2VlIGF1ZGlvX21vZGVfdCkKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TW9kZShpbnQgbW9kZSk7CiAKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIHRyYWNrcyBhcmUgYWN0aXZlIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhcyBiZWVuIGFjdGl2ZQpAQCAtMjIyLDkgKzgzLDkgQEAKICAgICBzdGF0aWMgZmxvYXQgbGluZWFyVG9Mb2coaW50IHZvbHVtZSk7CiAgICAgc3RhdGljIGludCBsb2dUb0xpbmVhcihmbG9hdCB2b2x1bWUpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZShpbnQqIHNhbXBsaW5nUmF0ZSwgaW50IHN0cmVhbSA9IERFRkFVTFQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGcmFtZUNvdW50KGludCogZnJhbWVDb3VudCwgaW50IHN0cmVhbSA9IERFRkFVTFQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LCBpbnQgc3RyZWFtID0gREVGQVVMVCk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZShpbnQqIHNhbXBsaW5nUmF0ZSwgaW50IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChpbnQqIGZyYW1lQ291bnQsIGludCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dExhdGVuY3kodWludDMyX3QqIGxhdGVuY3ksIGludCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CiAKICAgICBzdGF0aWMgYm9vbCByb3V0ZWRUb0EyZHBPdXRwdXQoaW50IHN0cmVhbVR5cGUpOwogCkBAIC0yMzQsNyArOTUsNyBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCiAgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgQXVkaW9GbGluZ2VyIHRvIGF1ZGlvIEhBTCBhbmQKLSAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBvdXRwdXQgb24gd2hpY2ggdGhlIHNwZWNpZmljZWQgc3RyZWFtIGlzIHBsYXlpbmcKKyAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBvdXRwdXQgb24gd2hpY2ggdGhlIHNwZWNpZmllZCBzdHJlYW0gaXMgcGxheWluZwogICAgIC8vIGhhcyBleGl0ZWQgc3RhbmRieS4KICAgICAvLyByZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAvLyAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbiwgaGFsRnJhbWVzIGFuZCBkc3BGcmFtZXMgcG9pbnQgdG8gdmFsaWQgZGF0YQpAQCAtMjQyLDkzICsxMDMsMTEgQEAKICAgICAvLyAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIKICAgICAvLyBOT1RFOiB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgaGFyZHdhcmUgcGxhdGZvcm1zIGFuZCBpdCBpcwogICAgIC8vIG5lY2Vzc2FyeSB0byBjaGVjayByZXR1cm5lZCBzdGF0dXMgYmVmb3JlIHVzaW5nIHRoZSByZXR1cm5lZCB2YWx1ZXMuCi0gICAgc3RhdGljIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsIGludCBzdHJlYW0gPSBERUZBVUxUKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywgaW50IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKIAogICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CiAKICAgICBzdGF0aWMgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgLy8KLSAgICAvLyBBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlCi0gICAgLy8KLQotICAgIGVudW0gYXVkaW9fZGV2aWNlcyB7Ci0gICAgICAgIC8vIG91dHB1dCBkZXZpY2VzCi0gICAgICAgIERFVklDRV9PVVRfRUFSUElFQ0UgPSAweDEsCi0gICAgICAgIERFVklDRV9PVVRfU1BFQUtFUiA9IDB4MiwKLSAgICAgICAgREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUID0gMHg0LAotICAgICAgICBERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSA9IDB4OCwKLSAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPID0gMHgxMCwKLSAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgPSAweDIwLAotICAgICAgICBERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUID0gMHg0MCwKLSAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODAsCi0gICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyA9IDB4MTAwLAotICAgICAgICBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMCwKLSAgICAgICAgREVWSUNFX09VVF9BVVhfRElHSVRBTCA9IDB4NDAwLAotICAgICAgICBERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUID0gMHg4MDAsCi0gICAgICAgIERFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQgPSAweDEwMDAsCi0gICAgICAgIERFVklDRV9PVVRfREVGQVVMVCA9IDB4ODAwMCwKLSAgICAgICAgREVWSUNFX09VVF9BTEwgPSAoREVWSUNFX09VVF9FQVJQSUVDRSB8IERFVklDRV9PVVRfU1BFQUtFUiB8IERFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfCBERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfCBERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCB8IERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfCBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAotICAgICAgICAgICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiB8IERFVklDRV9PVVRfQVVYX0RJR0lUQUwgfAotICAgICAgICAgICAgICAgIERFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQgfCBERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUIHwKLSAgICAgICAgICAgICAgICBERVZJQ0VfT1VUX0RFRkFVTFQpLAotICAgICAgICBERVZJQ0VfT1VUX0FMTF9BMkRQID0gKERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfCBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAotICAgICAgICAgICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCi0KLSAgICAgICAgLy8gaW5wdXQgZGV2aWNlcwotICAgICAgICBERVZJQ0VfSU5fQ09NTVVOSUNBVElPTiA9IDB4MTAwMDAsCi0gICAgICAgIERFVklDRV9JTl9BTUJJRU5UID0gMHgyMDAwMCwKLSAgICAgICAgREVWSUNFX0lOX0JVSUxUSU5fTUlDID0gMHg0MDAwMCwKLSAgICAgICAgREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCA9IDB4ODAwMDAsCi0gICAgICAgIERFVklDRV9JTl9XSVJFRF9IRUFEU0VUID0gMHgxMDAwMDAsCi0gICAgICAgIERFVklDRV9JTl9BVVhfRElHSVRBTCA9IDB4MjAwMDAwLAotICAgICAgICBERVZJQ0VfSU5fVk9JQ0VfQ0FMTCA9IDB4NDAwMDAwLAotICAgICAgICBERVZJQ0VfSU5fQkFDS19NSUMgPSAweDgwMDAwMCwKLSAgICAgICAgREVWSUNFX0lOX0RFRkFVTFQgPSAweDgwMDAwMDAwLAotCi0gICAgICAgIERFVklDRV9JTl9BTEwgPSAoREVWSUNFX0lOX0NPTU1VTklDQVRJT04gfCBERVZJQ0VfSU5fQU1CSUVOVCB8IERFVklDRV9JTl9CVUlMVElOX01JQyB8Ci0gICAgICAgICAgICAgICAgREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8IERFVklDRV9JTl9XSVJFRF9IRUFEU0VUIHwgREVWSUNFX0lOX0FVWF9ESUdJVEFMIHwKLSAgICAgICAgICAgICAgICBERVZJQ0VfSU5fVk9JQ0VfQ0FMTCB8IERFVklDRV9JTl9CQUNLX01JQyB8IERFVklDRV9JTl9ERUZBVUxUKQotICAgIH07Ci0KLSAgICAvLyBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZXMgdXNlZCBmb3Igc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKLSAgICBlbnVtIGRldmljZV9jb25uZWN0aW9uX3N0YXRlIHsKLSAgICAgICAgREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICBERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICBOVU1fREVWSUNFX1NUQVRFUwotICAgIH07Ci0KLSAgICAvLyByZXF1ZXN0IHRvIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IHdpdGggZ2V0T3V0cHV0KCkgKGJ5IG9wcG9zaXRpb24gdG8gc2hhcmluZyBhbiBvdXRwdXQgd2l0aCBvdGhlciBBdWRpb1RyYWNrcykKLSAgICBlbnVtIG91dHB1dF9mbGFncyB7Ci0gICAgICAgIE9VVFBVVF9GTEFHX0lORElSRUNUID0gMHgwLAotICAgICAgICBPVVRQVVRfRkxBR19ESVJFQ1QgPSAweDEKLSAgICB9OwotCi0gICAgLy8gZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igc2V0Rm9yY2VVc2UoKQotICAgIGVudW0gZm9yY2VkX2NvbmZpZyB7Ci0gICAgICAgIEZPUkNFX05PTkUsCi0gICAgICAgIEZPUkNFX1NQRUFLRVIsCi0gICAgICAgIEZPUkNFX0hFQURQSE9ORVMsCi0gICAgICAgIEZPUkNFX0JUX1NDTywKLSAgICAgICAgRk9SQ0VfQlRfQTJEUCwKLSAgICAgICAgRk9SQ0VfV0lSRURfQUNDRVNTT1JZLAotICAgICAgICBGT1JDRV9CVF9DQVJfRE9DSywKLSAgICAgICAgRk9SQ0VfQlRfREVTS19ET0NLLAotICAgICAgICBGT1JDRV9BTkFMT0dfRE9DSywKLSAgICAgICAgRk9SQ0VfRElHSVRBTF9ET0NLLAotICAgICAgICBOVU1fRk9SQ0VfQ09ORklHLAotICAgICAgICBGT1JDRV9ERUZBVUxUID0gRk9SQ0VfTk9ORQotICAgIH07Ci0KLSAgICAvLyB1c2FnZXMgdXNlZCBmb3Igc2V0Rm9yY2VVc2UoKQotICAgIGVudW0gZm9yY2VfdXNlIHsKLSAgICAgICAgRk9SX0NPTU1VTklDQVRJT04sCi0gICAgICAgIEZPUl9NRURJQSwKLSAgICAgICAgRk9SX1JFQ09SRCwKLSAgICAgICAgRk9SX0RPQ0ssCi0gICAgICAgIE5VTV9GT1JDRV9VU0UKLSAgICB9OwogCiAgICAgLy8gdHlwZXMgb2YgaW8gY29uZmlndXJhdGlvbiBjaGFuZ2UgZXZlbnRzIHJlY2VpdmVkIHdpdGggaW9Db25maWdDaGFuZ2VkKCkKICAgICBlbnVtIGlvX2NvbmZpZ19ldmVudCB7CkBAIC0zNTksNDAgKzEzOCw0MCBAQAogICAgIC8vCiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlcyBkZXZpY2UsIGRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLCBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgc3RhdGljIGRldmljZV9jb25uZWN0aW9uX3N0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzIGRldmljZSwgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLCBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGludCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzayk7Ci0gICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGZvcmNlX3VzZSB1c2FnZSwgZm9yY2VkX2NvbmZpZyBjb25maWcpOwotICAgIHN0YXRpYyBmb3JjZWRfY29uZmlnIGdldEZvcmNlVXNlKGZvcmNlX3VzZSB1c2FnZSk7Ci0gICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQ0hBTk5FTF9PVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncyBmbGFncyA9IE9VVFBVVF9GTEFHX0lORElSRUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfSU5ESVJFQ1QpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IENIQU5ORUxfSU5fTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPSAoYXVkaW9faW5fYWNvdXN0aWNzKTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcyA9IChhdWRpb19pbl9hY291c3RpY3NfdCkwKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCAqaW5kZXgpOwogCi0gICAgc3RhdGljIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbV90eXBlIHN0cmVhbSk7Ci0gICAgc3RhdGljIHVpbnQzMl90IGdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyB1aW50MzJfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIAogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyk7CiAgICAgc3RhdGljIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCkBAIC00MDYsMTcgKzE4NSw2IEBACiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBzdGF0aWMgdWludDMyX3QgcG9wQ291bnQodWludDMyX3QgdSk7Ci0gICAgc3RhdGljIGJvb2wgaXNPdXRwdXREZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpOwotICAgIHN0YXRpYyBib29sIGlzSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpOwotICAgIHN0YXRpYyBib29sIGlzQTJkcERldmljZShhdWRpb19kZXZpY2VzIGRldmljZSk7Ci0gICAgc3RhdGljIGJvb2wgaXNCbHVldG9vdGhTY29EZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpOwotICAgIHN0YXRpYyBib29sIGlzTG93VmlzaWJpbGl0eShzdHJlYW1fdHlwZSBzdHJlYW0pOwotICAgIHN0YXRpYyBib29sIGlzT3V0cHV0Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKLSAgICBzdGF0aWMgYm9vbCBpc0lucHV0Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKTsKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0gICAgc3RhdGljIGJvb2wgaXNMaW5lYXJQQ00odWludDMyX3QgZm9ybWF0KTsKLQogcHJpdmF0ZToKIAogICAgIGNsYXNzIEF1ZGlvRmxpbmdlckNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LCBwdWJsaWMgQm5BdWRpb0ZsaW5nZXJDbGllbnQKQEAgLTQ2OCw1MCArMjM2LDYgQEAKICAgICBzdGF0aWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBPdXRwdXREZXNjcmlwdG9yICo+IGdPdXRwdXRzOwogfTsKIAotY2xhc3MgQXVkaW9QYXJhbWV0ZXIgewotCi1wdWJsaWM6Ci0gICAgQXVkaW9QYXJhbWV0ZXIoKSB7fQotICAgIEF1ZGlvUGFyYW1ldGVyKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgfkF1ZGlvUGFyYW1ldGVyKCk7Ci0KLSAgICAvLyByZXNlcnZlZCBwYXJhbWV0ZXIga2V5cyBmb3IgY2hhbmdpbmcgc3RhbmRhcmQgcGFyYW1ldGVycyB3aXRoIHNldFBhcmFtZXRlcnMoKSBmdW5jdGlvbi4KLSAgICAvLyBVc2luZyB0aGVzZSBrZXlzIGlzIG1hbmRhdG9yeSBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb3Blcmx5IG1vbml0b3IgYXVkaW8gb3V0cHV0L2lucHV0Ci0gICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBhY3QgYWNjb3JkaW5nbHkuCi0gICAgLy8gIGtleVJvdXRpbmc6IHRvIGNoYW5nZSBhdWRpbyByb3V0aW5nLCB2YWx1ZSBpcyBhbiBpbnQgaW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMKLSAgICAvLyAga2V5U2FtcGxpbmdSYXRlOiB0byBjaGFuZ2Ugc2FtcGxpbmcgcmF0ZSByb3V0aW5nLCB2YWx1ZSBpcyBhbiBpbnQKLSAgICAvLyAga2V5Rm9ybWF0OiB0byBjaGFuZ2UgYXVkaW8gZm9ybWF0LCB2YWx1ZSBpcyBhbiBpbnQgaW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdAotICAgIC8vICBrZXlDaGFubmVsczogdG8gY2hhbmdlIGF1ZGlvIGNoYW5uZWwgY29uZmlndXJhdGlvbiwgdmFsdWUgaXMgYW4gaW50IGluIEF1ZGlvU3lzdGVtOjphdWRpb19jaGFubmVscwotICAgIC8vICBrZXlGcmFtZUNvdW50OiB0byBjaGFuZ2UgYXVkaW8gb3V0cHV0IGZyYW1lIGNvdW50LCB2YWx1ZSBpcyBhbiBpbnQKLSAgICAvLyAga2V5SW5wdXRTb3VyY2U6IHRvIGNoYW5nZSBhdWRpbyBpbnB1dCBzb3VyY2UsIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19zb3VyY2UKLSAgICAvLyAgICAgKGRlZmluZWQgaW4gbWVkaWEvbWVkaWFyZWNvcmRlci5oKQotICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlSb3V0aW5nOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlTYW1wbGluZ1JhdGU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZvcm1hdDsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqa2V5Q2hhbm5lbHM7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZyYW1lQ291bnQ7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUlucHV0U291cmNlOwotCi0gICAgU3RyaW5nOCB0b1N0cmluZygpOwotCi0gICAgc3RhdHVzX3QgYWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOwotICAgIHN0YXR1c190IGFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSk7Ci0gICAgc3RhdHVzX3QgYWRkRmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmUoY29uc3QgU3RyaW5nOCYga2V5KTsKLQotICAgIHN0YXR1c190IGdldChjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKLSAgICBzdGF0dXNfdCBnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKTsKLSAgICBzdGF0dXNfdCBnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSk7Ci0gICAgc3RhdHVzX3QgZ2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKLQotICAgIHNpemVfdCBzaXplKCkgeyByZXR1cm4gbVBhcmFtZXRlcnMuc2l6ZSgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKLSAgICBLZXllZFZlY3RvciA8U3RyaW5nOCwgU3RyaW5nOD4gbVBhcmFtZXRlcnM7Ci19OwotCiB9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvKkFORFJPSURfQVVESU9TWVNURU1fSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCAzZTM0NmRiLi5kZjMwZThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzAsOCArNjksOCBAQAogICAgICAgICAgICAgTVVURSAgICA9IDB4MDAwMDAwMDEKICAgICAgICAgfTsKICAgICAgICAgdWludDMyX3QgICAgZmxhZ3M7Ci0gICAgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudDsKICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0OworICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQ7IC8vIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBkbyBub3QgdXNlCiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7CiAgICAgICAgIHNpemVfdCAgICAgIHNpemU7CiAgICAgICAgIHVuaW9uIHsKQEAgLTEyNiwxMSArMTI1LDExIEBACiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKgogICAgICAqIHN0cmVhbVR5cGU6ICAgICAgICAgU2VsZWN0IHRoZSB0eXBlIG9mIGF1ZGlvIHN0cmVhbSB0aGlzIHRyYWNrIGlzIGF0dGFjaGVkIHRvCi0gICAgICogICAgICAgICAgICAgICAgICAgICAoZS5nLiBBdWRpb1N5c3RlbTo6TVVTSUMpLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCBmb3Igc2lnbmVkCisgICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCiAgICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxzOiAgICAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgQXVkaW9TeXN0ZW06OmF1ZGlvX2NoYW5uZWxzLgorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrOiBzZWUgYXVkaW9fY2hhbm5lbHNfdC4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIFRvdGFsIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgogICAgICAqIGZsYWdzOiAgICAgICAgICAgICAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCkBAIC0xNDQsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSAwLApAQCAtMTY0LDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsTWFzayAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSAwLApAQCAtMTg4LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IHN0cmVhbVR5cGUgICAgICA9LTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IDAsCkBAIC00MzksOCArNDM4LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3QgY3JlYXRlVHJhY2tfbChpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC00NjAsMTEgKzQ1OSwxMiBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbU11dGVkOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY2NjBjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RBUElfSF8KLSNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RBUElfSF8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gVGhlIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBpcyBleHBvc2VkIGJ5IGVhY2ggZWZmZWN0IGVuZ2luZSBpbXBsZW1lbnRhdGlvbi4gSXQgY29uc2lzdHMgb2YKLS8vIGEgc2V0IG9mIGZ1bmN0aW9ucyBjb250cm9sbGluZyB0aGUgY29uZmlndXJhdGlvbiwgYWN0aXZhdGlvbiBhbmQgcHJvY2VzcyBvZiB0aGUgZW5naW5lLgotLy8gVGhlIGZ1bmN0aW9ucyBhcmUgZ3JvdXBlZCBpbiBhIHN0cnVjdHVyZSBvZiB0eXBlIGVmZmVjdF9pbnRlcmZhY2VfczoKLS8vICAgIHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgewotLy8gICAgICAgIGVmZmVjdF9wcm9jZXNzX3QgcHJvY2VzczsKLS8vICAgICAgICBlZmZlY3RfY29tbWFuZF90IGNvbW1hbmQ7Ci0vLyAgICB9OwotCi0KLS8vIGVmZmVjdF9pbnRlcmZhY2VfdDogRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlIGhhbmRsZS4KLS8vIFRoZSBlZmZlY3RfaW50ZXJmYWNlX3Qgc2VydmVzIHR3byBwdXJwb3NlcyByZWdhcmRpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlZmZlY3QgZW5naW5lOgotLy8gLSAxIGl0IGlzIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB0byBhbiBlZmZlY3RfaW50ZXJmYWNlX3Mgc3RydWN0dXJlIHdoZXJlIHRoZSBmdW5jdGlvbnMKLS8vIG9mIHRoZSBlZmZlY3QgY29udHJvbCBBUEkgZm9yIGEgcGFydGljdWxhciBlZmZlY3QgYXJlIGxvY2F0ZWQuCi0vLyAtIDIgaXQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgb2YgYSBwYXJ0aWN1bGFyIGVmZmVjdCBpbnN0YW5jZS4KLS8vIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZWZmZWN0IGxpYnJhcnkgd291bGQgZGVmaW5lIGEgc3RydWN0dXJlIGFzIGZvbGxvd3M6Ci0vLyBzdHJ1Y3QgZWZmZWN0X21vZHVsZV9zIHsKLS8vICAgICAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwotLy8gICAgICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7Ci0vLyAgICAgICAgZWZmZWN0X2NvbnRleHRfdCBjb250ZXh0OwotLy8gfQotLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIEVmZmVjdENyZWF0ZSgpIGZ1bmN0aW9uIHdvdWxkIHRoZW4gYWxsb2NhdGUgYSBzdHJ1Y3R1cmUgb2YgdGhpcwotLy8gdHlwZSBhbmQgcmV0dXJuIGl0cyBhZGRyZXNzIGFzIGVmZmVjdF9pbnRlcmZhY2VfdAotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICoqZWZmZWN0X2ludGVyZmFjZV90OwotCi0KLS8vIEVmZmVjdCBBUEkgdmVyc2lvbiAxLjAKLSNkZWZpbmUgRUZGRUNUX0FQSV9WRVJTSU9OIDB4MDEwMCAvLyBGb3JtYXQgMHhNTW1tIE1NOiBNYWpvciB2ZXJzaW9uLCBtbTogbWlub3IgdmVyc2lvbgotCi0vLyBNYXhpbXVtIGxlbmd0aCBvZiBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBzdHJ1Y3R1cmVzIGRlZmluZXMgYnkgdGhpcyBBUEkuCi0jZGVmaW5lIEVGRkVDVF9TVFJJTkdfTEVOX01BWCA2NAotCi0vLwotLy8tLS0gRWZmZWN0IGRlc2NyaXB0b3Igc3RydWN0dXJlIGVmZmVjdF9kZXNjcmlwdG9yX3QKLS8vCi0KLS8vIFVuaXF1ZSBlZmZlY3QgSUQgKGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNpdGU6Ci0vLyAgaHR0cDovL3d3dy5pdHUuaW50L0lUVS1UL2FzbjEvdXVpZC5odG1sKQotLy8gVGhpcyBmb3JtYXQgaXMgdXNlZCBmb3IgYm90aCAidHlwZSIgYW5kICJ1dWlkIiBmaWVsZHMgb2YgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLS8vIC0gV2hlbiB1c2VkIGZvciBlZmZlY3QgdHlwZSBhbmQgdGhlIGVuZ2luZSBpcyBpbXBsZW1lbnRpbmcgYW5kIGVmZmVjdCBjb3JyZXNwb25kaW5nIHRvIGEgc3RhbmRhcmQKLS8vIE9wZW5TTCBFUyBpbnRlcmZhY2UsIHRoaXMgSUQgbXVzdCBiZSB0aGUgb25lIGRlZmluZWQgaW4gT3BlblNMRVNfSUlELmggZm9yIHRoYXQgaW50ZXJmYWNlLgotLy8gLSBXaGVuIHVzZWQgYXMgdXVpZCwgaXQgc2hvdWxkIGJlIGEgdW5pcXVlIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF91dWlkX3MgewotICAgIHVpbnQzMl90IHRpbWVMb3c7Ci0gICAgdWludDE2X3QgdGltZU1pZDsKLSAgICB1aW50MTZfdCB0aW1lSGlBbmRWZXJzaW9uOwotICAgIHVpbnQxNl90IGNsb2NrU2VxOwotICAgIHVpbnQ4X3Qgbm9kZVs2XTsKLX0gZWZmZWN0X3V1aWRfdDsKLQotLy8gTlVMTCBVVUlEIGRlZmluaXRpb24gKG1hdGNoZXMgU0xfSUlEX05VTExfKQotI2RlZmluZSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUiB7IDB4ZWM3MTc4ZWMsIDB4ZTVlMSwgMHg0NDMyLCAweGEzZjQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4NDYsIDB4NTcsIDB4ZTYsIDB4NzksIDB4NTIsIDB4MTAgfSB9Ci1zdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBFRkZFQ1RfVVVJRF9OVUxMXyA9IEVGRkVDVF9VVUlEX0lOSVRJQUxJWkVSOwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTEwgPSAmRUZGRUNUX1VVSURfTlVMTF87Ci1jb25zdCBjaGFyICogY29uc3QgRUZGRUNUX1VVSURfTlVMTF9TVFIgPSAiZWM3MTc4ZWMtZTVlMS00NDMyLWEzZjQtNDY1N2U2Nzk1MjEwIjsKLQotLy8gVGhlIGVmZmVjdCBkZXNjcmlwdG9yIGNvbnRhaW5zIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmYWNpbGl0YXRlIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZWZmZWN0Ci0vLyBlbmdpbmVzIHByZXNlbnQgaW4gYSBsaWJyYXJ5LgotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2Rlc2NyaXB0b3JfcyB7Ci0gICAgZWZmZWN0X3V1aWRfdCB0eXBlOyAgICAgLy8gVVVJRCBvZiB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdAotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsgICAgIC8vIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbgotICAgIHVpbnQxNl90IGFwaVZlcnNpb247ICAgIC8vIFZlcnNpb24gb2YgdGhlIGVmZmVjdCBBUEkgaW1wbGVtZW50ZWQ6IG1hdGNoZXMgRUZGRUNUX0FQSV9WRVJTSU9OCi0gICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgLy8gZWZmZWN0IGVuZ2luZSBjYXBhYmlsaXRpZXMvcmVxdWlyZW1lbnRzIGZsYWdzIChzZWUgYmVsb3cpCi0gICAgdWludDE2X3QgY3B1TG9hZDsgICAgICAgLy8gQ1BVIGxvYWQgaW5kaWNhdGlvbiAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IG1lbW9yeVVzYWdlOyAgIC8vIERhdGEgTWVtb3J5IHVzYWdlIChzZWUgYmVsb3cpCi0gICAgY2hhciAgICBuYW1lW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgLy8gaHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUKLSAgICBjaGFyICAgIGltcGxlbWVudG9yW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi19IGVmZmVjdF9kZXNjcmlwdG9yX3Q7Ci0KLS8vIENQVSBsb2FkIGFuZCBtZW1vcnkgdXNhZ2UgaW5kaWNhdGlvbjogZWFjaCBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGFuIGluZGljYXRpb24gb2YKLS8vIGl0cyBDUFUgYW5kIG1lbW9yeSB1c2FnZSBmb3IgdGhlIGF1ZGlvIGVmZmVjdCBmcmFtZXdvcmsgdG8gbGltaXQgdGhlIG51bWJlciBvZiBlZmZlY3RzCi0vLyBpbnN0YW50aWF0ZWQgYXQgYSBnaXZlbiB0aW1lIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uCi0vLyBUaGUgQ1BVIGxvYWQgaXMgZXhwcmVzc2VkIGluIDAuMSBNSVBTIHVuaXRzIGFzIGVzdGltYXRlZCBvbiBhbiBBUk05RSBjb3JlIChBUk12NVRFKSB3aXRoIDAgV1MuCi0vLyBUaGUgbWVtb3J5IHVzYWdlIGlzIGV4cHJlc3NlZCBpbiBLQiBhbmQgaW5jbHVkZXMgb25seSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5Ci0KLS8vIERlZmluaXRpb25zIGZvciBmbGFncyBmaWVsZCBvZiBlZmZlY3QgZGVzY3JpcHRvci4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwgYml0cyAgICAgIHwgdmFsdWVzCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgY29ubmVjdGlvbiBtb2RlICAgICAgICAgICB8IDAuLjEgICAgICB8IDAgaW5zZXJ0OiBhZnRlciB0cmFjayBwcm9jZXNzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBhdXhpbGlhcnk6IGNvbm5lY3QgdG8gdHJhY2sgYXV4aWxpYXJ5Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgIG91dHB1dCBhbmQgdXNlIHNlbmQgbGV2ZWwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcGxhY2U6IHJlcGxhY2VzIHRyYWNrIHByb2Nlc3MgZnVuY3Rpb247Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBtdXN0IGltcGxlbWVudCBTUkMsIHZvbHVtZSBhbmQgbW9ubyB0byBzdGVyZW8uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IGluc2VydGlvbiBwcmVmZXJlbmNlICAgICAgfCAyLi40ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGZpcnN0IG9mIHRoZSBjaGFpbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgbGFzdCBvZiB0aGUgY2hhaW4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIGV4Y2x1c2l2ZSAob25seSBlZmZlY3QgaW4gdGhlIGluc2VydCBjaGFpbikKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCA0Li43IHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgVm9sdW1lIG1hbmFnZW1lbnQgICAgICAgICB8IDUuLjYgICAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgaW1wbGVtZW50cyB2b2x1bWUgY29udHJvbAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgcmVxdWlyZXMgdm9sdW1lIGluZGljYXRpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRGV2aWNlIGluZGljYXRpb24gICAgICAgICB8IDcuLjggICAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgZGV2aWNlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgU2FtcGxlIGlucHV0IG1vZGUgICAgICAgICB8IDkuLjEwICAgICB8IDAgZGlyZWN0OiBwcm9jZXNzKCkgZnVuY3Rpb24gb3IgRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQgdG8gcmVxdWVzdCBpbnB1dC4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBib3RoOiBib3RoIGlucHV0IG1vZGVzIGFyZSBzdXBwb3J0ZWQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgU2FtcGxlIG91dHB1dCBtb2RlICAgICAgICB8IDExLi4xMiAgICB8IDAgZGlyZWN0OiBwcm9jZXNzKCkgZnVuY3Rpb24gb3IgRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQgdG8gcmVxdWVzdCBvdXRwdXQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBib3RoOiBib3RoIG91dHB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEhhcmR3YXJlIGFjY2VsZXJhdGlvbiAgICAgfCAxMy4uMTUgICAgfCAwIE5vIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgbm9uIHR1bm5lbGVkIGh3IGFjY2VsZXJhdGlvbjogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgcmVhZHMgdGhlIHNhbXBsZXMsIHNlbmQgdGhlbSB0byBIVyBhY2NlbGVyYXRlZAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgZWZmZWN0IHByb2Nlc3NvciwgcmVhZHMgYmFjayB0aGUgcHJvY2Vzc2VkIHNhbXBsZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGFuZCByZXR1cm5zIHRoZW0gdG8gdGhlIG91dHB1dCBidWZmZXIuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHRyYW5zcGFyZW50LiBUaGUgZWZmZWN0IGludGVyZmFjZSBpcyBvbmx5IHVzZWQgdG8KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUuIFRoaXMgbW9kZSBpcyByZWxldmFudCBmb3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGdsb2JhbCBlZmZlY3RzIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGF1ZGlvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBoYXJkd2FyZSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBBdWRpbyBNb2RlIGluZGljYXRpb24gICAgIHwgMTYuLjE3ICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSByZXF1aXJlcyBhdWRpbyBtb2RlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBJbnNlcnQgbW9kZQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0UgICAgICAgIDB4MDAwMDAwMDIKLQotLy8gSW5zZXJ0IHByZWZlcmVuY2UKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0sgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlkgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgICAgMHgwMDAwMDAwQwotCi0KLS8vIFZvbHVtZSBjb250cm9sCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLICAgICAgICAgMHgwMDAwMDA2MAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FICAgICAgICAgMHgwMDAwMDAwMAotCi0vLyBEZXZpY2UgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSyAgICAgICAgIDB4MDAwMDAxODAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9OT05FICAgICAgICAgMHgwMDAwMDAwMAotCi0vLyBTYW1wbGUgaW5wdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfTUFTSyAgICAgICAgICAweDAwMDAwNjAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9QUk9WSURFUiAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USCAgICAgICAgICAweDAwMDAwNDAwCi0KLS8vIFNhbXBsZSBvdXRwdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX01BU0sgICAgICAgICAgMHgwMDAwMTgwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfRElSRUNUICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUiAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEggICAgICAgICAgMHgwMDAwMTAwMAotCi0vLyBIYXJkd2FyZSBhY2NlbGVyYXRpb24gbW9kZQotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSyAgICAgICAgICAweDAwMDA2MDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEUgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCAgICAgICAgMHgwMDAwNDAwMAotCi0vLyBBdWRpbyBtb2RlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLICAgICAgMHgwMDAxODAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTk9ORSAgICAgIDB4MDAwMDAwMDAKLQotLy8gRm9yd2FyZCBkZWZpbml0aW9uIG9mIHR5cGUgYXVkaW9fYnVmZmVyX3QKLXR5cGVkZWYgc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIGF1ZGlvX2J1ZmZlcl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBwcm9jZXNzCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLiBUYWtlcyBpbnB1dCBzYW1wbGVzIGFzIHNwZWNpZmllZAotLy8gICAgICAgICAgKGNvdW50IGFuZCBsb2NhdGlvbikgaW4gaW5wdXQgYnVmZmVyIGRlc2NyaXB0b3IgYW5kIG91dHB1dCBwcm9jZXNzZWQKLS8vICAgICAgICAgIHNhbXBsZXMgYXMgc3BlY2lmaWVkIGluIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvci4gSWYgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yCi0vLyAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIHRoZSBmdW5jdGlvbiBtdXN0IHVzZSBlaXRoZXIgdGhlIGJ1ZmZlciBvciB0aGUKLS8vICAgICAgICAgIGJ1ZmZlciBwcm92aWRlciBmdW5jdGlvbiBpbnN0YWxsZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCi0vLyAgICAgICAgICBUaGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGNhbGwgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBhZnRlciB0aGUgRUZGRUNUX0NNRF9FTkFCTEUKLS8vICAgICAgICAgIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIHVudGlsIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgaXMgcmVjZWl2ZWQuIFdoZW4gdGhlIGVuZ2luZQotLy8gICAgICAgICAgcmVjZWl2ZXMgdGhlIEVGRkVDVF9DTURfRElTQUJMRSBjb21tYW5kIGl0IHNob3VsZCB0dXJuIG9mZiB0aGUgZWZmZWN0IGdyYWNlZnVsbHkKLS8vICAgICAgICAgIGFuZCB3aGVuIGRvbmUgaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byBzdG9wIGNhbGxpbmcgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBieQotLy8gICAgICAgICAgcmV0dXJuaW5nIHRoZSAtRU5PREFUQSBzdGF0dXMuCi0vLwotLy8gICAgTk9URTogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgInJlYWwtdGltZSBzYWZlIiB0aGF0IGlzCi0vLyAgICAgIGl0IHNob3VsZCBub3QgcGVyZm9ybSBibG9ja2luZyBjYWxsczogbWFsbG9jL2ZyZWUsIHNsZWVwLCByZWFkL3dyaXRlL29wZW4vY2xvc2UsCi0vLyAgICAgIHB0aHJlYWRfY29uZF93YWl0L3B0aHJlYWRfbXV0ZXhfbG9jay4uLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90OiBoYW5kbGUgdG8gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdGhpcyBmdW5jdGlvbgotLy8gICAgICAgICAgICAgIGlzIGNhbGxlZCBvbi4KLS8vICAgICAgICAgIGluQnVmZmVyOiAgIGJ1ZmZlciBkZXNjcmlwdG9yIGluZGljYXRpbmcgd2hlcmUgdG8gcmVhZCBzYW1wbGVzIHRvIHByb2Nlc3MuCi0vLyAgICAgICAgICAgICAgSWYgTlVMTCwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBieSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotLy8KLS8vICAgICAgICAgIGluQnVmZmVyOiAgIGJ1ZmZlciBkZXNjcmlwdG9yIGluZGljYXRpbmcgd2hlcmUgdG8gd3JpdGUgcHJvY2Vzc2VkIHNhbXBsZXMuCi0vLyAgICAgICAgICAgICAgSWYgTlVMTCwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBieSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCBzdWNjZXNzZnVsIG9wZXJhdGlvbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9EQVRBIHRoZSBlbmdpbmUgaGFzIGZpbmlzaGVkIHRoZSBkaXNhYmxlIHBoYXNlIGFuZCB0aGUgZnJhbWV3b3JrCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gc3RvcCBjYWxsaW5nIHByb2Nlc3MoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGlucHV0L291dHB1dCBidWZmZXIgZGVzY3JpcHRpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfcHJvY2Vzc190KShlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBjb21tYW5kCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90OiBoYW5kbGUgdG8gdGhlIGVmZmVjdCBpbnRlcmZhY2UgdGhpcyBmdW5jdGlvbgotLy8gICAgICAgICAgICAgIGlzIGNhbGxlZCBvbi4KLS8vICAgICAgICAgIGNtZENvZGU6ICAgIGNvbW1hbmQgY29kZTogdGhlIGNvbW1hbmQgY2FuIGJlIGEgc3RhbmRhcmRpemVkIGNvbW1hbmQgZGVmaW5lZCBpbgotLy8gICAgICAgICAgICAgIGVmZmVjdF9jb21tYW5kX2UgKHNlZSBiZWxvdykgb3IgYSBwcm9wcmlldGFyeSBjb21tYW5kLgotLy8gICAgICAgICAgY21kU2l6ZTogICAgc2l6ZSBvZiBjb21tYW5kIGluIGJ5dGVzCi0vLyAgICAgICAgICBwQ21kRGF0YTogICBwb2ludGVyIHRvIGNvbW1hbmQgZGF0YQotLy8gICAgICAgICAgcFJlcGx5RGF0YTogcG9pbnRlciB0byByZXBseSBkYXRhCi0vLwotLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgcmVwbHlTaXplOiBtYXhpbXVtIHNpemUgb2YgcmVwbHkgZGF0YSBhcyBpbnB1dAotLy8gICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIHNpemUgb2YgcmVwbHkgZGF0YSBhcyBvdXRwdXQKLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgICByZXR1cm5lZCB2YWx1ZTogMCAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlIG9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGNvbW1hbmQvcmVwbHkgc2l6ZSBvciBmb3JtYXQgYWNjb3JkaW5nIHRvIGNvbW1hbmQgY29kZQotLy8gICAgICAgICAgICAgIFRoZSByZXR1cm4gY29kZSBzaG91bGQgYmUgcmVzdHJpY3RlZCB0byBpbmRpY2F0ZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSB0aGlzCi0vLyAgICAgICAgICAgICAgQVBJIHNwZWNpZmljYXRpb24uIFN0YXR1cyByZWxhdGVkIHRvIHRoZSBleGVjdXRpb24gb2YgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgc2hvdWxkIGJlCi0vLyAgICAgICAgICAgICAgaW5kaWNhdGVkIGFzIHBhcnQgb2YgdGhlIHJlcGx5IGZpZWxkLgotLy8KLS8vICAgICAgICAgICpwUmVwbHlEYXRhIHVwZGF0ZWQgd2l0aCBjb21tYW5kIHJlc3BvbnNlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9jb21tYW5kX3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKLQotCi0vLyBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgotc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyB7Ci0gICAgZWZmZWN0X3Byb2Nlc3NfdCBwcm9jZXNzOwotICAgIGVmZmVjdF9jb21tYW5kX3QgY29tbWFuZDsKLX07Ci0KLQotLy8KLS8vLS0tIFN0YW5kYXJkaXplZCBjb21tYW5kIGNvZGVzIGZvciBjb21tYW5kKCkgZnVuY3Rpb24KLS8vCi1lbnVtIGVmZmVjdF9jb21tYW5kX2UgewotICAgRUZGRUNUX0NNRF9JTklULCAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSwgICAgICAgICAgICAvLyBjb25maWd1cmUgZWZmZWN0IGVuZ2luZSAoc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfUkVTRVQsICAgICAgICAgICAgICAgIC8vIHJlc2V0IGVmZmVjdCBlbmdpbmUKLSAgIEVGRkVDVF9DTURfRU5BQkxFLCAgICAgICAgICAgICAgIC8vIGVuYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9ESVNBQkxFLCAgICAgICAgICAgICAgLy8gZGlzYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0sICAgICAgICAgICAgLy8gc2V0IHBhcmFtZXRlciBpbW1lZGlhdGVseSAoc2VlIGVmZmVjdF9wYXJhbV90KQotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQsICAgLy8gc2V0IHBhcmFtZXRlciBkZWZlcnJlZAotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULCAgICAgLy8gY29tbWl0IHByZXZpb3VzIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfR0VUX1BBUkFNLCAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXIKLSAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwgICAgICAgICAgIC8vIHNldCBhdWRpbyBkZXZpY2UgKHNlZSBhdWRpb19kZXZpY2VfZSkKLSAgIEVGRkVDVF9DTURfU0VUX1ZPTFVNRSwgICAgICAgICAgIC8vIHNldCB2b2x1bWUKLSAgIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREUsICAgICAgIC8vIHNldCB0aGUgYXVkaW8gbW9kZSAobm9ybWFsLCByaW5nLCAuLi4pCi0gICBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZID0gMHgxMDAwMCAvLyBmaXJzdCBwcm9wcmlldGFyeSBjb21tYW5kIGNvZGUKLX07Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfSU5JVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgSW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lOiBBbGwgY29uZmlndXJhdGlvbnMgcmV0dXJuIHRvIGRlZmF1bHQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IG5ldyBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0vLyAgZGF0YTogZWZmZWN0X2NvbmZpZ190Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfUkVTRVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlc2V0IHRoZSBlZmZlY3QgZW5naW5lLiBLZWVwIGNvbmZpZ3VyYXRpb24gYnV0IHJlc2V0cyBzdGF0ZSBhbmQgYnVmZmVyIGNvbnRlbnQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0VOQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRW5hYmxlIHRoZSBwcm9jZXNzLiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gcHJvY2VzcygpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRElTQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRGlzYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byBwcm9jZXNzKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCBhIHBhcmFtZXRlciBhbmQgYXBwbHkgaXQgaW1tZWRpYXRlbHkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGEgcGFyYW1ldGVyIGJ1dCBhcHBseSBpdCBvbmx5IHdoZW4gcmVjZWl2aW5nIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCBjb21tYW5kCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IGFsbCBwcmV2aW91c2x5IHJlY2VpdmVkIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEIGNvbW1hbmRzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX1BBUkFNCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBHZXQgYSBwYXJhbWV0ZXIgdmFsdWUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfREVWSUNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIHJlbmRlcmluZyBkZXZpY2UgdGhlIGF1ZGlvIG91dHB1dCBwYXRoIGlzIGNvbm5lY3RlZCB0by4gU2VlIGF1ZGlvX2RldmljZV9lIGZvciBkZXZpY2UKLS8vICB2YWx1ZXMuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIGZsYWcgaW4gaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzCi0vLyAgY29tbWFuZCB3aGVuIHRoZSBkZXZpY2UgY2hhbmdlcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IGF1ZGlvX2RldmljZV9lCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfVk9MVU1FCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYW5kIGdldCB2b2x1bWUuIFVzZWQgYnkgYXVkaW8gZnJhbWV3b3JrIHRvIGRlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBlbmdpbmUuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIG9yIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGZsYWcgaW4KLS8vICBpdHMgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCBiZWZvcmUgZXZlcnkgY2FsbCB0byBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICBJZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGlzIHNldCBpbiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IsIHRoZSBlZmZlY3QgZW5naW5lIG11c3QgcmV0dXJuCi0vLyAgdGhlIHZvbHVtZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgZWZmZWN0IGlzIHByb2Nlc3NlZC4gVGhlIG92ZXJhbGwgdm9sdW1lICh0aGUgdm9sdW1lCi0vLyAgYWN0dWFsbHkgYXBwbGllZCBieSB0aGUgZWZmZWN0IGVuZ2luZSBtdWx0aXBsaWVkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSkgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZQotLy8gIGluZGljYXRlZCBpbiB0aGUgY29tbWFuZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogbiAqIHNpemVvZih1aW50MzJfdCkgLyAwCi0vLyAgZGF0YTogLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgICAgICAgICAgOC4yNCBmaXhlZCBwb2ludCBmb3JtYXQKLS8vICAgICAgICAtIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGlzIG5vdCBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgTi9BCi0vLyAgSXQgaXMgbGVnYWwgdG8gcmVjZWl2ZSBhIG51bGwgcG9pbnRlciBhcyBwUmVwbHlEYXRhIGluIHdoaWNoIGNhc2UgdGhlIGVmZmVjdCBmcmFtZXdvcmsgaGFzCi0vLyAgZGVsZWdhdGVkIHZvbHVtZSBjb250cm9sIHRvIGFub3RoZXIgZWZmZWN0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGF1ZGlvIG1vZGUuIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgZmxhZyBpbiBpdHMKLS8vICBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcyBjb21tYW5kIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiBhdWRpb19tb2RlX2UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBBbGwgcHJvcHJpZXRhcnkgZWZmZWN0IGNvbW1hbmRzIG11c3QgdXNlIGNvbW1hbmQgY29kZXMgYWJvdmUgdGhpcyB2YWx1ZS4gVGhlIHNpemUgYW5kIGZvcm1hdCBvZgotLy8gIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGZpZWxkcyBpcyBmcmVlIGluIHRoaXMgY2FzZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vIEF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9yIHVzZWQgYnkgcHJvY2VzcygpLCBidWZmZXJQcm92aWRlcigpIGZ1bmN0aW9ucyBhbmQgYnVmZmVyX2NvbmZpZ190Ci0vLyBzdHJ1Y3R1cmUuIE11bHRpLWNoYW5uZWwgYXVkaW8gaXMgYWx3YXlzIGludGVybGVhdmVkLiBUaGUgY2hhbm5lbCBvcmRlciBpcyBmcm9tIExTQiB0byBNU0Igd2l0aAotLy8gcmVnYXJkIHRvIHRoZSBjaGFubmVsIG1hc2sgZGVmaW5pdGlvbiBpbiBhdWRpb19jaGFubmVsc19lIGUuZyA6Ci0vLyBTdGVyZW86IGxlZnQsIHJpZ2h0Ci0vLyA1IHBvaW50IDE6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBmcm9udCBjZW50ZXIsIGxvdyBmcmVxdWVuY3ksIGJhY2sgbGVmdCwgYmFjayByaWdodAotLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGV4cHJlc3NlZCBpbiBmcmFtZSBjb3VudCwgYSBmcmFtZSBiZWluZyBjb21wb3NlZCBvZiBzYW1wbGVzIGZvciBhbGwKLS8vIGNoYW5uZWxzIGF0IGEgZ2l2ZW4gdGltZS4gRnJhbWUgc2l6ZSBmb3IgdW5zcGVjaWZpZWQgZm9ybWF0IChBVURJT19GT1JNQVRfT1RIRVIpIGlzIDggYml0IGJ5Ci0vLyBkZWZpbml0aW9uCi1zdHJ1Y3QgYXVkaW9fYnVmZmVyX3MgewotICAgIHNpemVfdCAgIGZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIGJ1ZmZlcgotICAgIHVuaW9uIHsKLSAgICAgICAgdm9pZCogICAgICAgcmF3OyAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIGludDMyX3QqICAgIHMzMjsgICAgICAgIC8vIHBvaW50ZXIgdG8gc2lnbmVkIDMyIGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQxNl90KiAgICBzMTY7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAxNiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgdWludDhfdCogICAgdTg7ICAgICAgICAgLy8gcG9pbnRlciB0byB1bnNpZ25lZCA4IGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgIH07Ci19OwotCi0vLyBUaGUgYnVmZmVyX3Byb3ZpZGVyX3Mgc3RydWN0dXJlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkCi0vLyBieSB0aGUgZWZmZWN0IGVuZ2luZSBwcm9jZXNzKCkgZnVuY3Rpb24gdG8gcXVlcnkgYW5kIHJlbGVhc2UgaW5wdXQKLS8vIG9yIG91dHB1dCBhdWRpbyBidWZmZXIuCi0vLyBUaGUgZ2V0QnVmZmVyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIGEgYnVmZmVyIHdoZXJlIGRhdGEKLS8vIHNob3VsZCByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBieSBwcm9jZXNzKCkgZnVuY3Rpb24uCi0vLyBUaGUgcmVsZWFzZUJ1ZmZlcigpIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciByZXRyaWV2ZWQKLS8vIHdpdGggZ2V0QnVmZmVyKCkgaXMgbm90IG5lZWRlZCBhbnltb3JlLgotLy8gVGhlIHByb2Nlc3MgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnVmZmVyIHByb3ZpZGVyIG1lY2hhbmlzbSB0byByZXRyaWV2ZQotLy8gaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBpZiB0aGUgaW5CdWZmZXIgb3Igb3V0QnVmZmVyIHBhc3NlZCBhcyBhcmd1bWVudCBpcyBOVUxMCi0vLyBhbmQgdGhlIGJ1ZmZlciBjb25maWd1cmF0aW9uIChidWZmZXJfY29uZmlnX3QpIGdpdmVuIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRQotLy8gY29tbWFuZCBkaWQgbm90IHNwZWNpZnkgYW4gYXVkaW8gYnVmZmVyLgotCi10eXBlZGVmIGludDMyX3QgKCogYnVmZmVyX2Z1bmN0aW9uX3QpKHZvaWQgKmNvb2tpZSwgYXVkaW9fYnVmZmVyX3QgKmJ1ZmZlcik7Ci0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcl9wcm92aWRlcl9zIHsKLSAgICBidWZmZXJfZnVuY3Rpb25fdCBnZXRCdWZmZXI7ICAgICAgIC8vIHJldHJpZXZlIG5leHQgYnVmZmVyCi0gICAgYnVmZmVyX2Z1bmN0aW9uX3QgcmVsZWFzZUJ1ZmZlcjsgICAvLyByZWxlYXNlIHVzZWQgYnVmZmVyCi0gICAgdm9pZCAgICAgICAqY29va2llOyAgICAgICAgICAgICAgICAvLyBmb3IgdXNlIGJ5IGNsaWVudCBvZiBidWZmZXIgcHJvdmlkZXIgZnVuY3Rpb25zCi19IGJ1ZmZlcl9wcm92aWRlcl90OwotCi0KLS8vIFRoZSBidWZmZXJfY29uZmlnX3Mgc3RydWN0dXJlIHNwZWNpZmllcyB0aGUgaW5wdXQgb3Igb3V0cHV0IGF1ZGlvIGZvcm1hdAotLy8gdG8gYmUgdXNlZCBieSB0aGUgZWZmZWN0IGVuZ2luZS4gSXQgaXMgcGFydCBvZiB0aGUgZWZmZWN0X2NvbmZpZ190Ci0vLyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgY29uZmlndXJhdGlvbnMgYW5kIGlzCi0vLyBwYXNzZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfY29uZmlnX3MgewotICAgIGF1ZGlvX2J1ZmZlcl90ICBidWZmZXI7ICAgICAvLyBidWZmZXIgZm9yIHVzZSBieSBwcm9jZXNzKCkgZnVuY3Rpb24gaWYgbm90IHBhc3NlZCBleHBsaWNpdGx5Ci0gICAgdWludDMyX3QgICBzYW1wbGluZ1JhdGU7ICAgIC8vIHNhbXBsaW5nIHJhdGUKLSAgICB1aW50MzJfdCAgIGNoYW5uZWxzOyAgICAgICAgLy8gY2hhbm5lbCBtYXNrIChzZWUgYXVkaW9fY2hhbm5lbHNfZSkKLSAgICBidWZmZXJfcHJvdmlkZXJfdCBidWZmZXJQcm92aWRlcjsgICAvLyBidWZmZXIgcHJvdmlkZXIKLSAgICB1aW50OF90ICAgIGZvcm1hdDsgICAgICAgICAgLy8gQXVkaW8gZm9ybWF0ICAoc2VlIGF1ZGlvX2Zvcm1hdF9lKQotICAgIHVpbnQ4X3QgICAgYWNjZXNzTW9kZTsgICAgICAvLyByZWFkL3dyaXRlIG9yIGFjY3VtdWxhdGUgaW4gYnVmZmVyIChlZmZlY3RfYnVmZmVyX2FjY2Vzc19lKQotICAgIHVpbnQxNl90ICAgbWFzazsgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGFib3ZlIGZpZWxkcyBpcyB2YWxpZAotfSBidWZmZXJfY29uZmlnX3Q7Ci0KLS8vIFNhbXBsZSBmb3JtYXQKLWVudW0gYXVkaW9fZm9ybWF0X2UgewotICAgIFNBTVBMRV9GT1JNQVRfUENNX1MxNSwgICAvLyBQQ00gc2lnbmVkIDE2IGJpdHMKLSAgICBTQU1QTEVfRk9STUFUX1BDTV9VOCwgICAgLy8gUENNIHVuc2lnbmVkIDggYml0cwotICAgIFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0LCAvLyBQQ00gc2lnbmVkIDcuMjQgZml4ZWQgcG9pbnQgcmVwcmVzZW50YXRpb24KLSAgICBTQU1QTEVfRk9STUFUX09USEVSICAgICAgLy8gb3RoZXIgZm9ybWF0IChlLmcuIGNvbXByZXNzZWQpCi19OwotCi0vLyBDaGFubmVsIG1hc2sKLWVudW0gYXVkaW9fY2hhbm5lbHNfZSB7Ci0gICAgQ0hBTk5FTF9GUk9OVF9MRUZUID0gMHgxLCAgICAgICAgICAgICAgICAgICAvLyBmcm9udCBsZWZ0IGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX1JJR0hUID0gMHgyLCAgICAgICAgICAgICAgICAgIC8vIGZyb250IHJpZ2h0IGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiA9IDB4NCwgICAgICAgICAgICAgICAgLy8gZnJvbnQgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0xPV19GUkVRVUVOQ1kgPSAweDgsICAgICAgICAgICAgICAgLy8gbG93IGZyZXF1ZW5jeSBjaGFubmVsCi0gICAgQ0hBTk5FTF9CQUNLX0xFRlQgPSAweDEwLCAgICAgICAgICAgICAgICAgICAvLyBiYWNrIGxlZnQgY2hhbm5lbAotICAgIENIQU5ORUxfQkFDS19SSUdIVCA9IDB4MjAsICAgICAgICAgICAgICAgICAgLy8gYmFjayByaWdodCBjaGFubmVsCi0gICAgQ0hBTk5FTF9GUk9OVF9MRUZUX09GX0NFTlRFUiA9IDB4NDAsICAgICAgIC8vIGZyb250IGxlZnQgb2YgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4ODAsICAgICAgLy8gZnJvbnQgcmlnaHQgb2YgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX0JBQ0tfQ0VOVEVSID0gMHgxMDAsICAgICAgICAgICAgICAgIC8vIGJhY2sgY2VudGVyIGNoYW5uZWwKLSAgICBDSEFOTkVMX01PTk8gPSBDSEFOTkVMX0ZST05UX0xFRlQsCi0gICAgQ0hBTk5FTF9TVEVSRU8gPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCksCi0gICAgQ0hBTk5FTF9RVUFEID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQpLAotICAgIENIQU5ORUxfU1VSUk9VTkQgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfQkFDS19DRU5URVIpLAotICAgIENIQU5ORUxfNVBPSU5UMSA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfQ0VOVEVSIHwgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQpLAotICAgIENIQU5ORUxfN1BPSU5UMSA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfQ0VOVEVSIHwgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9CQUNLX0xFRlQgfCBDSEFOTkVMX0JBQ0tfUklHSFQgfAotICAgICAgICAgICAgQ0hBTk5FTF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IENIQU5ORUxfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSwKLX07Ci0KLS8vIFJlbmRlciBkZXZpY2UKLWVudW0gYXVkaW9fZGV2aWNlX2UgewotICAgIERFVklDRV9FQVJQSUVDRSA9IDB4MSwgICAgICAgICAgICAgICAgICAgICAgLy8gZWFycGllY2UKLSAgICBERVZJQ0VfU1BFQUtFUiA9IDB4MiwgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWFrZXIKLSAgICBERVZJQ0VfV0lSRURfSEVBRFNFVCA9IDB4NCwgICAgICAgICAgICAgICAgIC8vIHdpcmVkIGhlYWRzZXQsIHdpdGggbWljcm9waG9uZQotICAgIERFVklDRV9XSVJFRF9IRUFEUEhPTkUgPSAweDgsICAgICAgICAgICAgICAgLy8gd2lyZWQgaGVhZHBob25lLCB3aXRob3V0IG1pY3JvcGhvbmUKLSAgICBERVZJQ0VfQkxVRVRPT1RIX1NDTyA9IDB4MTAsICAgICAgICAgICAgICAgIC8vIGdlbmVyaWMgYmx1ZXRvb3RoIFNDTwotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0hFQURTRVQgPSAweDIwLCAgICAgICAgLy8gYmx1ZXRvb3RoIFNDTyBoZWFkc2V0Ci0gICAgREVWSUNFX0JMVUVUT09USF9TQ09fQ0FSS0lUID0gMHg0MCwgICAgICAgICAvLyBibHVldG9vdGggU0NPIGNhciBraXQKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFAgPSAweDgwLCAgICAgICAgICAgICAgIC8vIGdlbmVyaWMgYmx1ZXRvb3RoIEEyRFAKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyA9IDB4MTAwLCAgIC8vIGJsdWV0b290aCBBMkRQIGhlYWRwaG9uZXMKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwLCAgICAgIC8vIGJsdWV0b290aCBBMkRQIHNwZWFrZXJzCi0gICAgREVWSUNFX0FVWF9ESUdJVEFMID0gMHg0MDAsICAgICAgICAgICAgICAgICAvLyBkaWdpdGFsIG91dHB1dAotICAgIERFVklDRV9FWFRFUk5BTF9TUEVBS0VSID0gMHg4MDAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgc3BlYWtlciAoc3RlcmVvIGFuZCBIaWdoIHF1YWxpdHkpCi19OwotCi0vLyBBdWRpbyBtb2RlCi1lbnVtIGF1ZGlvX21vZGVfZSB7Ci0gICAgQVVESU9fRUZGRUNUX01PREVfTk9STUFMLCAgIC8vIGRldmljZSBpZGxlCi0gICAgQVVESU9fRUZGRUNUX01PREVfUklOR1RPTkUsIC8vIGRldmljZSByaW5naW5nCi0gICAgQVVESU9fRUZGRUNUX01PREVfSU5fQ0FMTCAgIC8vIGF1ZGlvIGNhbGwgY29ubmVjdGVkIChWb0lQIG9yIHRlbGVwaG9ueSkKLX07Ci0KLS8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKLS8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQotZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAotICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKLQotfTsKLQotLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAotLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kCi0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQlVGRkVSICAgIDB4MDAwMSAgLy8gYnVmZmVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfU01QX1JBVEUgIDB4MDAwMiAgLy8gc2FtcGxpbmdSYXRlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgIDB4MDAwNCAgLy8gY2hhbm5lbHMgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19GT1JNQVQgICAgMHgwMDA4ICAvLyBmb3JtYXQgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERSAgMHgwMDEwICAvLyBhY2Nlc3NNb2RlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfUFJPVklERVIgIDB4MDAyMCAgLy8gYnVmZmVyUHJvdmlkZXIgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19BTEwgKEVGRkVDVF9DT05GSUdfQlVGRkVSIHwgRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQUNDX01PREUgfCBFRkZFQ1RfQ09ORklHX1BST1ZJREVSKQotCi0KLS8vIGVmZmVjdF9jb25maWdfcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfQ09ORklHVVJFCi0vLyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhdWRpbyBwYXJhbWV0ZXJzIGFuZCBidWZmZXJzIGZvciBlZmZlY3QgZW5naW5lIGlucHV0IGFuZCBvdXRwdXQuCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfY29uZmlnX3MgewotICAgIGJ1ZmZlcl9jb25maWdfdCAgIGlucHV0Q2ZnOwotICAgIGJ1ZmZlcl9jb25maWdfdCAgIG91dHB1dENmZzs7Ci19IGVmZmVjdF9jb25maWdfdDsKLQotCi0vLyBlZmZlY3RfcGFyYW1fcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfU0VUX1BBUkFNCi0vLyBjb21tYW5kIGFuZCBwQ21kRGF0YSBhbmQgcFJlcGx5RGF0YSBvZiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBjb21tYW5kLgotLy8gcHNpemUgYW5kIHZzaXplIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNpemUgb2YgcGFyYW1ldGVyIGFuZCB2YWx1ZS4KLS8vCi0vLyBOT1RFOiB0aGUgc3RhcnQgb2YgdmFsdWUgZmllbGQgaW5zaWRlIHRoZSBkYXRhIGZpZWxkIGlzIGFsd2F5cyBvbiBhIDMyIGJpdCBib3VuZGFyeToKLS8vCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgc3RhdHVzICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCBwc2l6ZSAgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHZzaXplICAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8Ci0vLyAgfiBwYXJhbWV0ZXIgfiAgID4gcHNpemUgICAgIHwKLS8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgPiAgKChwc2l6ZSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICB8Ci0vLyAgfCBwYWRkaW5nICAgfCAgICAgICAgICAgICAgIHwKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCAgICAgICAgICAgfCAgIHwKLS8vICB+IHZhbHVlICAgICB+ICAgPiB2c2l6ZQotLy8gIHwgICAgICAgICAgIHwgICB8Ci0vLyAgKy0tLS0tLS0tLS0tKwotCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfcGFyYW1fcyB7Ci0gICAgaW50MzJfdCAgICAgc3RhdHVzOyAgICAgLy8gVHJhbnNhY3Rpb24gc3RhdHVzICh1bnVzZWQgZm9yIGNvbW1hbmQsIHVzZWQgZm9yIHJlcGx5KQotICAgIHVpbnQzMl90ICAgIHBzaXplOyAgICAgIC8vIFBhcmFtZXRlciBzaXplCi0gICAgdWludDMyX3QgICAgdnNpemU7ICAgICAgLy8gVmFsdWUgc2l6ZQotICAgIGNoYXIgICAgICAgIGRhdGFbXTsgICAgIC8vIFN0YXJ0IG9mIFBhcmFtZXRlciArIFZhbHVlIGRhdGEKLX0gZWZmZWN0X3BhcmFtX3Q7Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gQW4gZWZmZWN0IGxpYnJhcnkgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGFuZCBleHBvc2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKLS8vIHRvIGVuYWJsZSBlZmZlY3QgZW51bWVyYXRpb24gYW5kIGluc3RhbnRpYXRpb24uIFRoZSBuYW1lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFzCi0vLyBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcyB3aXRoIGRsc3ltKCk6Ci0vLwotLy8gLSBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzOwotLy8gLSBlZmZlY3RfUXVlcnlFZmZlY3RfdCBFZmZlY3RRdWVyeUVmZmVjdDsKLS8vIC0gZWZmZWN0X0NyZWF0ZUVmZmVjdF90IEVmZmVjdENyZWF0ZTsKLS8vIC0gZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCBFZmZlY3RSZWxlYXNlOwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cwotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgZXhwb3NlZCBieSB0aGUKLS8vICAgICAgICAgIGxpYnJhcnkuIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIHVuaXF1ZSBlZmZlY3QgdXVpZCAoc2VlCi0vLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKLS8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkuCi0vLwotLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgcE51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcE51bUVmZmVjdHMKLS8vICAgICAgICAqcE51bUVmZmVjdHM6ICAgICB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGVmZmVjdHMgaW4gbGlicmFyeQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QpKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0Ci0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hpY2ggaW5kZXggaXMKLS8vICAgICAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgotLy8gICAgICAgICAgU2VlIGVmZmVjdF9kZXNjcmlwdG9yX3QgZm9yIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3JzLgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbAotLy8gICAgICAgICAgZWZmZWN0cyBwcmVzZW50IGluIHRoZSBsaWJyYXJ5LiBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgaXM6Ci0vLyAgICAgICAgICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1fZWZmZWN0cyk7Ci0vLyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCi0vLyAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0KGksLi4uKTsKLS8vCi0vLyAgICBJbnB1dC9PdXRwdXQ6Ci0vLyAgICAgICAgICBpbmRleDogICAgICAgICAgaW5kZXggb2YgdGhlIGVmZmVjdAotLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcERlc2NyaXB0b3Igb3IgaW5kZXgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PU1lTICAgICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gbW9yZSBlZmZlY3QgYXZhaWxhYmxlCi0vLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KLS8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCi0vLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCi0vLyAgICAgICAgICBhIGhhbmRsZSBvbiB0aGUgZWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlLgotLy8KLS8vICAgIElucHV0OgotLy8gICAgICAgICAgdXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCi0vLyAgICAgICAgICBzZXNzaW9uSWQ6ICBhdWRpbyBzZXNzaW9uIHRvIHdoaWNoIHRoaXMgZWZmZWN0IGluc3RhbmNlIHdpbGwgYmUgYXR0YWNoZWQuIEFsbCBlZmZlY3RzCi0vLyAgICAgICAgICAgICAgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgYXJlIGNvbm5lY3RlZCBpbiBzZXJpZXMgYW5kIHByb2Nlc3MgdGhlIHNhbWUgc2lnbmFsCi0vLyAgICAgICAgICAgICAgc3RyZWFtLiBLbm93aW5nIHRoYXQgdHdvIGVmZmVjdHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgZWZmZWN0IGNoYWluIGNhbiBoZWxwIHRoZQotLy8gICAgICAgICAgICAgIGxpYnJhcnkgaW1wbGVtZW50IHNvbWUga2luZCBvZiBvcHRpbWl6YXRpb25zLgotLy8gICAgICAgICAgaW9JZDogICBpZGVudGlmaWVzIHRoZSBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRoaXMgZWZmZWN0IGlzIGRpcmVjdGVkIHRvIGF0IGF1ZGlvIEhBTC4KLS8vICAgICAgICAgICAgICBGb3IgZnV0dXJlIHVzZSBlc3BlY2lhbGx5IHdpdGggdHVubmVsZWQgSFcgYWNjZWxlcmF0ZWQgZWZmZWN0cwotLy8KLS8vICAgIElucHV0L091dHB1dDoKLS8vICAgICAgICAgIHBJbnRlcmZhY2U6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwRWZmZWN0VXVpZCBvciBwSW50ZXJmYWNlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCi0vLyAgICAgICAgKnBJbnRlcmZhY2U6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBpbnRlcmZhY2UgaGFuZGxlLgotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfQ3JlYXRlRWZmZWN0X3QpKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFJlbGVhc2UKLS8vCi0vLyAgICBEZXNjcmlwdGlvbjogICAgUmVsZWFzZXMgdGhlIGVmZmVjdCBlbmdpbmUgd2hvc2UgaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgotLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCi0vLyAgICAgICAgICByZWxlYXNlZC4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlIG9uIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRvIGJlIHJlbGVhc2VkLgotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOwotCi0KLSNpZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLQotI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKaW5kZXggNzVmOGQ3OC4uNTYxMTllYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdEJhc3NCb29zdEFwaS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUQkFTU0JPT1NUQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUQkFTU0JPT1NUQVBJX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KIAogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0RW52aXJvbm1lbnRhbFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKaW5kZXggMzZhY2NkOC4uZjExYzVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaAppbmRleCAwNDkyZWEwLi45NTBkMTM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0RXF1YWxpemVyQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWZuZGVmIE9QRU5TTF9FU19IXwogc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX0VRVUFMSVpFUl8gPSB7IDB4MGJlZDQzMDAsIDB4ZGRkNiwgMHgxMWRiLCAweDhmMzQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaAppbmRleCBhM2YwOTRjLi5lNWIxNjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RQUkVTRVRSRVZFUkJBUElfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RQUkVTRVRSRVZFUkJBUElfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCmluZGV4IGMzZDUxMzEuLjJlMjE2ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlydHVhbGl6ZXJBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXwogI2RlZmluZSBBTkRST0lEX0VGRkVDVFZJUlRVQUxJWkVSQVBJX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KIAogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmgKaW5kZXggYmVmMWE0Zi4uZTBmYTMyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUVklTVUFMSVpFUkFQSV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKaW5kZXggMGVkMWExNC4uOGFlMTNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC05OSwxNyArOTksMTcgQEAKIC8vICAgICAgICAgICAgICB1c2UgZXNwZWNpYWxseSB3aXRoIHR1bm5lbGVkIEhXIGFjY2VsZXJhdGVkIGVmZmVjdHMKIC8vCiAvLyAgICBJbnB1dC9PdXRwdXQ6Ci0vLyAgICAgICAgICBwSW50ZXJmYWNlOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGludGVyZmFjZS4KKy8vICAgICAgICAgIHBIYW5kbGU6ICAgICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGhhbmRsZS4KIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcEludGVyZmFjZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcEhhbmRsZQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAotLy8gICAgICAgICpwSW50ZXJmYWNlOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgorLy8gICAgICAgICpwSGFuZGxlOiAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGhhbmRsZS4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKTsKK2ludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSk7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpAQCAtMTIwLDcgKzEyMCw3IEBACiAvLyAgICAgICAgICByZWxlYXNlZC4KIC8vCiAvLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KKy8vICAgICAgICAgIGhhbmRsZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCkBAIC0xMjgsNTEgKzEyOCw3IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlcgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0TG9hZExpYnJhcnkKLS8vCi0vLyAgICBEZXNjcmlwdGlvbjogICAgTG9hZHMgdGhlIGVmZmVjdCBsaWJyYXJ5IHdoaWNoIHBhdGggaXMgZ2l2ZW4gYXMgZmlyc3QgYXJndW1lbnQuCi0vLyAgICAgICAgICBUaGlzIG11c3QgYmUgdGhlIGZ1bGwgcGF0aCBvZiBhIGR5bmFtaWMgbGlicmFyeSAoLnNvKSBpbXBsZW1lbnRpbmcgb25lIG9yCi0vLyAgICAgICAgICBtb3JlIGVmZmVjdCBlbmdpbmVzIGFuZCBleHBvc2luZyB0aGUgZWZmZWN0IGxpYnJhcnkgaW50ZXJmYWNlIGRlc2NyaWJlZCBpbgotLy8gICAgICAgICAgRWZmZWN0QXBpLmguIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlIG9uIHRoZSBsaWJyYXJ5IGZvciB1c2VkIGJ5Ci0vLyAgICAgICAgICBmdXJ0aGVyIGNhbGwgdG8gRWZmZWN0VW5sb2FkTGlicmFyeSgpIHRvIHVubG9hZCB0aGUgbGlicmFyeS4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGxpYlBhdGg6ICAgIGZ1bGwgcGF0aCBvZiB0aGUgZHluYW1pYyBsaWJyYXJ5IGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtLgotLy8KLS8vICAgICAgICAgIGhhbmRsZTogICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBsaWJyYXJ5IGhhbmRsZQotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQgb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbnMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIGxpYlBhdGggc3RyaW5nIG9yIGhhbmRsZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQgRWZmZWN0TG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RVbmxvYWRMaWJyYXJ5Ci0vLwotLy8gICAgRGVzY3JpcHRpb246ICBVbmxvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCi0vLwotLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgICBoYW5kbGU6IGxpYnJhcnkgaGFuZGxlCi0vLwotLy8gICAgT3V0cHV0OgotLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIGludmFsaWQgaGFuZGxlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWludCBFZmZlY3RVbmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpOwotCi0KK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggNTg5ZjdjZC4uNDAzN2M0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQ4LDggKzQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNjEsOCArNjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTczLDcgKzczLDcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoaW50IG91dHB1dCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKIApAQCAtMTM5LDEwICsxMzksNiBAQAogCiAgICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkgPSAwOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDcyMGE1NjIuLjA5YjJiZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzksNDIgKzQwLDQyIEBACiAgICAgLy8KICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwotICAgIHZpcnR1YWwgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGludCBzdGF0ZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UmluZ2VyTW9kZSh1aW50MzJfdCBtb2RlLCB1aW50MzJfdCBtYXNrKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlLCBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcpID0gMDsKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpID0gMDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpGT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncyA9IEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19JTkRJUkVDVCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19JTkRJUkVDVCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoaW50IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpGT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPSAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcykwKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgPSAoYXVkaW9faW5fYWNvdXN0aWNzX3QpMCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50ICppbmRleCkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDhlM2NkYmIuLjFjMWMyNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTE4LDEwICsxOCwxMSBAQAogI2lmbmRlZiBBTkRST0lEX0lNRURJQU1FVEFEQVRBUkVUUklFVkVSX0gKICNkZWZpbmUgQU5EUk9JRF9JTUVESUFNRVRBREFUQVJFVFJJRVZFUl9ICiAKLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCw3ICszMSwxMSBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFNZXRhZGF0YVJldHJpZXZlcik7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIqIHNyY1VybCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggNzA1MTllZi4uZDU1MmIyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yNCw3ICsyNCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFBhcmNlbDsKLWNsYXNzIElTdXJmYWNlOwogY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElTdXJmYWNlVGV4dHVyZTsKIApAQCAtNTIsNiArNTEsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpID0gMDsKIAogICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKICAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmgKaW5kZXggZWVlNmM5Ny4uZGFlYzFjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oCkBAIC0yOCw3ICsyOCw3IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVBsYXllckNsaWVudCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCAxNmE5MzQyLi4zYzY1MTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtMzMsNyArMzMsNiBAQAogY2xhc3MgSU1lbW9yeTsKIGNsYXNzIElPTVhPYnNlcnZlcjsKIGNsYXNzIElPTVhSZW5kZXJlcjsKLWNsYXNzIElTdXJmYWNlOwogY2xhc3MgU3VyZmFjZTsKIAogY2xhc3MgSU9NWCA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggMDQ0OTEyMi4uMjdiN2U0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTMwLDcgKzMwLDExIEBACiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSgpIHt9CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2UoKSB7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgPSAwOwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCogZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDExN2Q3ZWIuLjE4ZThhNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTMyLDcgKzMyLDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgUGFyY2VsOwotY2xhc3MgSVN1cmZhY2U7CiBjbGFzcyBTdXJmYWNlOwogY2xhc3MgSVN1cmZhY2VUZXh0dXJlOwogCkBAIC01Niw3ICs1NSw4IEBACiAKIAogLy8gY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBwYXNzaW5nIG1lc3NhZ2VzIHRvIE1lZGlhUGxheWVyIG9iamVjdAotdHlwZWRlZiB2b2lkICgqbm90aWZ5X2NhbGxiYWNrX2YpKHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKTsKK3R5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFja19mKSh2b2lkKiBjb29raWUsCisgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwogCiAvLyBhYnN0cmFjdCBiYXNlIGNsYXNzIC0gdXNlIE1lZGlhUGxheWVySW50ZXJmYWNlCiBjbGFzcyBNZWRpYVBsYXllckJhc2UgOiBwdWJsaWMgUmVmQmFzZQpAQCAtODUsNyArODUsNyBAQAogICAgICAgICAvLyBhdWRpbyBkYXRhLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9wZW4oCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBpbnQgZm9ybWF0PUF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAorICAgICAgICAgICAgICAgIGludCBmb3JtYXQ9QVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50PURFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAogICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IgPSBOVUxMLAogICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSA9IE5VTEwpID0gMDsKQEAgLTEzMiw2ICsxMzIsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVzZXQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRMb29waW5nKGludCBsb29wKSA9IDA7CiAgICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpID0gMDsKIAogICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKICAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgpAQCAtMTYwLDkgKzE2MiwxNCBAQAogICAgICAgICBtQ29va2llID0gY29va2llOyBtTm90aWZ5ID0gbm90aWZ5RnVuYzsKICAgICB9CiAKLSAgICB2b2lkICAgICAgICBzZW5kRXZlbnQoaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCkgeworICAgIHZvaWQgICAgICAgIHNlbmRFdmVudChpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGlmIChtTm90aWZ5KSBtTm90aWZ5KG1Db29raWUsIG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIGlmIChtTm90aWZ5KSBtTm90aWZ5KG1Db29raWUsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IGYyMTA3ZWMuLmVkMjZlNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0xNTAsNiArMTUwLDEyIEBACiAgICAgICovCiAgICAgVmVjdG9yPGludD4gZ2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0IChpbiBtcykgZm9yIHRoZSBnaXZlbiBjYW1lcmEgSWQuCisgICAgICogSWYgdGhlIGdpdmVuIGNhbWVyYSBJZCBkb2VzIG5vdCBleGlzdCwgLTEgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IGNhbWVyYUlkKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBlbnVtIHsKICAgICAgICAgLy8gQ2FtY29yZGVyIHByb2ZpbGVzIChoaWdoL2xvdykgYW5kIHRpbWVsYXBzZSBwcm9maWxlcyAoaGlnaC9sb3cpCkBAIC0zMzIsNiArMzM4LDggQEAKIAogICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhSWQoY29uc3QgY2hhciAqKmF0dHMpOwogCisgICAgdm9pZCBhZGRTdGFydFRpbWVPZmZzZXQoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cyk7CisKICAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyogZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgY29uc3Q7CiAgICAgdm9pZCBhZGRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMpOwogCkBAIC00MDgsNiArNDE2LDcgQEAKICAgICBWZWN0b3I8VmlkZW9EZWNvZGVyQ2FwKj4gIG1WaWRlb0RlY29kZXJzOwogICAgIFZlY3RvcjxvdXRwdXRfZm9ybWF0PiAgICAgbUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0czsKICAgICBWZWN0b3I8SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKj4gIG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsczsKKyAgICBLZXllZFZlY3RvcjxpbnQsIGludD4gbVN0YXJ0VGltZU9mZnNldHM7CiAKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGJvb2wgbUhhc1JlZlByb2ZpbGU7ICAgICAgLy8gUmVmZXJzIHRvIGFuIGV4aXN0aW5nIHByb2ZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCBjNDIzNDZlLi43ZTIyYTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0yMCw2ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBTdXJmYWNlOwpAQCAtMjksNyArMzEsNyBAQAogICAgIHZpcnR1YWwgfk1lZGlhUmVjb3JkZXJCYXNlKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZSBhcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlX3QgYXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU291cmNlKHZpZGVvX3NvdXJjZSB2cykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0Rm9ybWF0KG91dHB1dF9mb3JtYXQgb2YpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvRW5jb2RlcihhdWRpb19lbmNvZGVyIGFlKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaCBiL2luY2x1ZGUvbWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGI3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaApAQCAtMCwwICsxLDI4IEBACisKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIE1FTU9SWV9MRUFLX1RSQUNLX1VUSUxfSAorI2RlZmluZSBNRU1PUllfTEVBS19UUkFDS19VVElMX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLyoKKyAqIER1bXAgdGhlIG1lbW9yeSBhZGRkcmVzcyBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIHRoZSBnaXZlbiBmZC4KKyAqLworZXh0ZXJuIHZvaWQgZHVtcE1lbW9yeUFkZHJlc3NlcyhpbnQgZmQpOworCit9OworCisjZW5kaWYgIC8vIE1FTU9SWV9MRUFLX1RSQUNLX1VUSUxfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCBlOTA1MDA2Li4yOGYzMDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtNDcsNiArNDcsMTMgQEAKICAgICBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgICAgID0gMTMsCiAgICAgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSICAgICA9IDE0LAogICAgIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiAgICAgPSAxNSwKKyAgICBNRVRBREFUQV9LRVlfSEFTX0FVRElPICAgICAgID0gMTYsCisgICAgTUVUQURBVEFfS0VZX0hBU19WSURFTyAgICAgICA9IDE3LAorICAgIE1FVEFEQVRBX0tFWV9WSURFT19XSURUSCAgICAgPSAxOCwKKyAgICBNRVRBREFUQV9LRVlfVklERU9fSEVJR0hUICAgID0gMTksCisgICAgTUVUQURBVEFfS0VZX0JJVFJBVEUgICAgICAgICA9IDIwLAorICAgIE1FVEFEQVRBX0tFWV9USU1FRF9URVhUX0xBTkdVQUdFUyAgICAgID0gMjEsCisKICAgICAvLyBBZGQgbW9yZSBoZXJlLi4uCiB9OwogCkBAIC01Niw3ICs2MywxMSBAQAogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwogICAgIHZvaWQgZGlzY29ubmVjdCgpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciogZGF0YVNvdXJjZVVybCk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YVNvdXJjZVVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CisKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CiAgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEFsYnVtQXJ0KCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggNTI4ZWViOS4uZWE1YTlkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtMzcsNiArMzcsNyBAQAogICAgIE1FRElBX0JVRkZFUklOR19VUERBVEUgID0gMywKICAgICBNRURJQV9TRUVLX0NPTVBMRVRFICAgICA9IDQsCiAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUgICAgPSA1LAorICAgIE1FRElBX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUFfRVJST1IgICAgICAgICAgICAgPSAxMDAsCiAgICAgTUVESUFfSU5GTyAgICAgICAgICAgICAgPSAyMDAsCiB9OwpAQCAtOTksNiArMTAwLDkgQEAKICAgICBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCA9IDcwMSwKICAgICAvLyBNZWRpYVBsYXllciBpcyByZXN1bWluZyBwbGF5YmFjayBhZnRlciBmaWxsaW5nIGJ1ZmZlcnMuCiAgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EID0gNzAyLAorICAgIC8vIEJhbmR3aWR0aCBpbiByZWNlbnQgcGFzdAorICAgIE1FRElBX0lORk9fTkVUV09SS19CQU5EV0lEVEggPSA3MDMsCisKICAgICAvLyA4eHgKICAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAogICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCkBAIC0xMjQsMTIgKzEyOCwxOSBAQAogICAgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSAgPSAxIDw8IDcKIH07CiAKK2VudW0gbWVkaWFfc2V0X3BhcmFtZXRlcl9rZXlzIHsKKyAgICBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVggPSAxMDAwLAorICAgIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9BRERfT1VUX09GX0JBTkRfU09VUkNFID0gMTAwMSwKKworICAgIC8vIFN0cmVhbWluZy9idWZmZXJpbmcgcGFyYW1ldGVycworICAgIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLAorfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCiBjbGFzcyBNZWRpYVBsYXllckxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyIDogcHVibGljIEJuTWVkaWFQbGF5ZXJDbGllbnQsCkBAIC0xNjYsNyArMTc3LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7CiAgICAgc3RhdGljICBzcDxJTWVtb3J5PiAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KTsKICAgICBzdGF0aWMgIHNwPElNZW1vcnk+ICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CkBAIC0xNzYsNiArMTg3LDkgQEAKICAgICAgICAgICAgIGludCAgICAgICAgICAgICBnZXRBdWRpb1Nlc3Npb25JZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG9fbChpbnQgbXNlYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IGE3MTA1NDYuLjM2YmYzNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zMywyMyArMzMsNiBAQAogCiB0eXBlZGVmIHZvaWQgKCptZWRpYV9jb21wbGV0aW9uX2YpKHN0YXR1c190IHN0YXR1cywgdm9pZCAqY29va2llKTsKIAotLyogRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydHMKLSAqIGluIG1lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEhCi0gKi8KLWVudW0gYXVkaW9fc291cmNlIHsKLSAgICBBVURJT19TT1VSQ0VfREVGQVVMVCA9IDAsCi0gICAgQVVESU9fU09VUkNFX01JQyA9IDEsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyA9IDIsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LID0gMywKLSAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCA9IDQsCi0gICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiA9IDUsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OID0gNiwKLSAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDcsCi0gICAgQVVESU9fU09VUkNFX01BWCA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAotCi0gICAgQVVESU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCi19OwotCiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLApAQCAtMTA0LDM1ICs4Nyw2MiBAQAogfTsKIAogLyoKLSAqIFRoZSBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBtZWRpYV9yZWNvcmRlciB1c2VzIGEgc2V0IG9mIGRpZmZlcmVudCBzdGF0ZSBuYW1lcy4KLSAqIFRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIG1lZGlhX3JlY29yZGVyIGFuZCB0aGUgcHZhdXRob3JlbmdpbmUgaXMgc2hvd24gYmVsb3c6Ci0gKgotICogICAgbWVkaWFyZWNvcmRlciAgICAgICAgICAgICAgICAgICAgICAgIHB2YXV0aG9yZW5naW5lCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgRVJST1IKLSAqICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICBJRExFCi0gKiAgICBNRURJQV9SRUNPUkRFUl9JTklUSUFMSVpFRCAgICAgICAgICAgT1BFTkVECi0gKiAgICBNRURJQV9SRUNPUkRFUl9EQVRBU09VUkNFX0NPTkZJR1VSRUQKLSAqICAgIE1FRElBX1JFQ09SREVSX1BSRVBBUkVEICAgICAgICAgICAgICBJTklUSUFMSVpFRAotICogICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgIFJFQ09SRElORworICogVGhlIHN0YXRlIG1hY2hpbmUgb2YgdGhlIG1lZGlhX3JlY29yZGVyLgogICovCiBlbnVtIG1lZGlhX3JlY29yZGVyX3N0YXRlcyB7CisgICAgLy8gRXJyb3Igc3RhdGUuCiAgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gICAgICAwLAorCisgICAgLy8gUmVjb3JkZXIgd2FzIGp1c3QgY3JlYXRlZC4KICAgICBNRURJQV9SRUNPUkRFUl9JRExFICAgICAgICAgICAgICAgICAgPSAxIDw8IDAsCisKKyAgICAvLyBSZWNvcmRlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KICAgICBNRURJQV9SRUNPUkRFUl9JTklUSUFMSVpFRCAgICAgICAgICAgPSAxIDw8IDEsCisKKyAgICAvLyBDb25maWd1cmF0aW9uIG9mIHRoZSByZWNvcmRlciBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgTUVESUFfUkVDT1JERVJfREFUQVNPVVJDRV9DT05GSUdVUkVEID0gMSA8PCAyLAorCisgICAgLy8gUmVjb3JkZXIgaXMgcmVhZHkgdG8gc3RhcnQuCiAgICAgTUVESUFfUkVDT1JERVJfUFJFUEFSRUQgICAgICAgICAgICAgID0gMSA8PCAzLAorCisgICAgLy8gUmVjb3JkaW5nIGlzIGluIHByb2dyZXNzLgogICAgIE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAgICAgICAgICAgICA9IDEgPDwgNCwKIH07CiAKIC8vIFRoZSAibXNnIiBjb2RlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgaW4gbm90aWZ5LgogZW51bSBtZWRpYV9yZWNvcmRlcl9ldmVudF90eXBlIHsKKyAgICBNRURJQV9SRUNPUkRFUl9FVkVOVF9MSVNUX1NUQVJUICAgICAgICAgICAgICAgPSAxLAogICAgIE1FRElBX1JFQ09SREVSX0VWRU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICA9IDEsCi0gICAgTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTyAgICAgICAgICAgICAgICAgICAgID0gMgorICAgIE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8gICAgICAgICAgICAgICAgICAgICA9IDIsCisgICAgTUVESUFfUkVDT1JERVJfRVZFTlRfTElTVF9FTkQgICAgICAgICAgICAgICAgID0gOTksCisKKyAgICAvLyBUcmFjayByZWxhdGVkIGV2ZW50IHR5cGVzCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfTElTVF9TVEFSVCAgICAgICAgID0gMTAwLAorICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0VSUk9SICAgICAgICAgICAgICA9IDEwMCwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPICAgICAgICAgICAgICAgPSAxMDEsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfTElTVF9FTkQgICAgICAgICAgID0gMTAwMCwKIH07CiAKKy8qCisgKiBUaGUgKHBhcnQgb2YpICJ3aGF0IiBjb2RlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgaW4gbm90aWZ5LgorICogV2hlbiB0aGUgZXJyb3Igb3IgaW5mbyB0eXBlIGlzIHRyYWNrIHNwZWNpZmljLCB0aGUgd2hhdCBoYXMKKyAqIHRoZSBmb2xsb3dpbmcgbGF5b3V0OgorICogdGhlIGxlZnQtbW9zdCAxNi1iaXQgaXMgbWVhbnQgZm9yIGVycm9yIG9yIGluZm8gdHlwZS4KKyAqIHRoZSByaWdodC1tb3N0IDQtYml0IGlzIG1lYW50IGZvciB0cmFjayBpZC4KKyAqIHRoZSByZXN0IGlzIHJlc2VydmVkLgorICoKKyAqIHwgdHJhY2sgaWQgfCByZXNlcnZlZCB8ICAgICBlcnJvciBvciBpbmZvIHR5cGUgICAgIHwKKyAqIDMxICAgICAgICAgMjggICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAqCisgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfZXJyb3JfdHlwZSB7Ci0gICAgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgID0gMQorICAgIE1FRElBX1JFQ09SREVSX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICAgICAgPSAxLAorCisgICAgLy8gVHJhY2sgcmVsYXRlZCBlcnJvciB0eXBlCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVJST1JfTElTVF9TVEFSVCAgICAgICAgICA9IDEwMCwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FUlJPUl9HRU5FUkFMICAgICAgICAgICAgID0gMTAwLAorICAgIE1FRElBX1JFQ09SREVSX0VSUk9SX1ZJREVPX05PX1NZTkNfRlJBTUUgICAgICAgPSAyMDAsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVJST1JfTElTVF9FTkQgICAgICAgICAgICA9IDEwMDAsCiB9OwogCiAvLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKQEAgLTE0MSwxMSArMTUxLDM4IEBACiAvLwogZW51bSBtZWRpYV9yZWNvcmRlcl9pbmZvX3R5cGUgewogICAgIE1FRElBX1JFQ09SREVSX0lORk9fVU5LTk9XTiAgICAgICAgICAgICAgICAgICA9IDEsCisKICAgICBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVEICAgICAgPSA4MDAsCiAgICAgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCAgICAgID0gODAxLAotICAgIE1FRElBX1JFQ09SREVSX0lORk9fQ09NUExFVElPTl9TVEFUVVMgICAgICAgICA9IDgwMiwKLSAgICBNRURJQV9SRUNPUkRFUl9JTkZPX1BST0dSRVNTX0ZSQU1FX1NUQVRVUyAgICAgPSA4MDMsCi0gICAgTUVESUFfUkVDT1JERVJfSU5GT19QUk9HUkVTU19USU1FX1NUQVRVUyAgICAgID0gODA0LAorCisgICAgLy8gQWxsIHRyYWNrIHJlbGF0ZWQgaW5mb3JtdGlvbmFsIGV2ZW50cyBzdGFydCBoZXJlCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19MSVNUX1NUQVJUICAgICAgICAgICA9IDEwMDAsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19DT01QTEVUSU9OX1NUQVRVUyAgICA9IDEwMDAsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19QUk9HUkVTU19JTl9USU1FICAgICA9IDEwMDEsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19UWVBFICAgICAgICAgICAgICAgICA9IDEwMDIsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19EVVJBVElPTl9NUyAgICAgICAgICA9IDEwMDMsCisKKyAgICAvLyBUaGUgdGltZSB0byBtZWFzdXJlIHRoZSBtYXggY2h1bmsgZHVyYXRpb24KKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX01BWF9DSFVOS19EVVJfTVMgICAgID0gMTAwNCwKKworICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fRU5DT0RFRF9GUkFNRVMgICAgICAgPSAxMDA1LAorCisgICAgLy8gVGhlIHRpbWUgdG8gbWVhc3VyZSBob3cgd2VsbCB0aGUgYXVkaW8gYW5kIHZpZGVvCisgICAgLy8gdHJhY2sgZGF0YSBpcyBpbnRlcmxlYXZlZC4KKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTlRFUl9DSFVOS19USU1FX01TICAgICAgID0gMTAwNiwKKworICAgIC8vIFRoZSB0aW1lIHRvIG1lYXN1cmUgc3lzdGVtIHJlc3BvbnNlLiBOb3RlIHRoYXQKKyAgICAvLyB0aGUgZGVsYXkgZG9lcyBub3QgaW5jbHVkZSB0aGUgaW50ZW50aW9uYWwgZGVsYXkKKyAgICAvLyB3ZSB1c2UgdG8gZWxpbWluYXRlIHRoZSByZWNvcmRpbmcgc291bmQuCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19JTklUSUFMX0RFTEFZX01TICAgICA9IDEwMDcsCisKKyAgICAvLyBUaGUgdGltZSB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgQS9WIHN5bmMuCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19TVEFSVF9PRkZTRVRfTVMgICAgICA9IDEwMDgsCisKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIG1lZGlhIGRhdGEuCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19EQVRBX0tCWVRFUyAgICAgICAgICA9IDEwMDksCisKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0xJU1RfRU5EICAgICAgICAgICAgID0gMjAwMCwKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2FiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBQ19XUklURVJfSF8KKyNkZWZpbmUgQUFDX1dSSVRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhU291cmNlOworc3RydWN0IE1ldGFEYXRhOworCitzdHJ1Y3QgQUFDV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBBQUNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIEFBQ1dyaXRlcihpbnQgZmQpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQUNXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0FkdHNIZWFkZXJMZW5ndGggPSA3LCAgICAgLy8gIyBvZiBieXRlcyBmb3IgdGhlIGFkdHMgaGVhZGVyCisgICAgICAgIGtTYW1wbGVzUGVyRnJhbWUgID0gMTAyNCwgIC8vICMgb2Ygc2FtcGxlcyBpbiBhIGZyYW1lCisgICAgfTsKKworICAgIGludCAgIG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbUVzdGltYXRlZFNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWREdXJhdGlvblVzOworICAgIGludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIGludDMyX3QgbUZyYW1lRHVyYXRpb25VczsKKworICAgIHN0YXRpYyB2b2lkICpUaHJlYWRXcmFwcGVyKHZvaWQgKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHdyaXRlQWR0c0hlYWRlcih1aW50MzJfdCBmcmFtZUxlbmd0aCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQUNXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBQUNfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggZDEyZWU5Yy4uMGI3OTMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMTA4LDYgKzEwOCw4IEBACiAKICAgICB2b2lkIHJlc2V0KCk7CiAKKyAgICB1aW50MzJfdCBnZXROdW1GcmFtZXNQZW5kaW5nUGxheW91dCgpIGNvbnN0OworCiAgICAgQXVkaW9QbGF5ZXIoY29uc3QgQXVkaW9QbGF5ZXIgJik7CiAgICAgQXVkaW9QbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBBdWRpb1BsYXllciAmKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKaW5kZXggOWU2ZjBlMi4uMTliZDMxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaApAQCAtMjQsMTYgKzI0LDE4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBBdWRpb1JlY29yZDsKIAogc3RydWN0IEF1ZGlvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLCBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CiAgICAgLy8gTm90ZSB0aGF0IHRoZSAiY2hhbm5lbHMiIHBhcmFtZXRlciBpcyBfbm90XyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLAotICAgIC8vIGJ1dCBhIGJpdG1hc2sgb2YgQXVkaW9TeXN0ZW06OmF1ZGlvX2NoYW5uZWxzIGNvbnN0YW50cy4KKyAgICAvLyBidXQgYSBiaXRtYXNrIG9mIGF1ZGlvX2NoYW5uZWxzX3QgY29uc3RhbnRzLgogICAgIEF1ZGlvU291cmNlKAogICAgICAgICAgICAgaW50IGlucHV0U291cmNlLCB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAppbmRleCA0YTM5ZmJmLi5iYjI1YmFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKQEAgLTk5LDM0ICs5OSw2IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZpZGVvIGJ1ZmZlcnMgYXZhaWxhYmxlIGZyb20KLSAgICAgKiB0aGlzIHNvdXJjZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB0aGVzZSB2aWRlbyBidWZmZXJzIGFyZSB1c2VkCi0gICAgICogZm9yIHBhc3NpbmcgdmlkZW8gZnJhbWUgZGF0YSB0byBvdGhlciBtZWRpYSBjb21wb25lbnRzLAotICAgICAqIHN1Y2ggYXMgT01YIHZpZGVvIGVuY29kZXJzLCBpbiBvcmRlciB0byBlbGltaW5hdGUgdGhlCi0gICAgICogbWVtY3B5IG9mIHRoZSBkYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYm5lciBvZiB2aWRlbyBidWZmZXJzLiBSZXR1cm5zIDAgdG8KLSAgICAgKiAgICAgIGluZGljYXRlIHRoYXQgdGhpcyBzb3VyY2UgZG9lcyBub3QgbWFrZSB0aGUgdmlkZW8KLSAgICAgKiAgICAgIGJ1ZmZlciBpbmZvcm1hdGlvbiBhdmFpbGFsYmxlLgotICAgICAqLwotICAgIHNpemVfdCBnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGluZGl2aWR1YWwgdmlkZW8gYnVmZmVyIGF2YWlsYWJsZSBmcm9tCi0gICAgICogdGhpcyBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZGVvIGJ1ZmZlci4KLSAgICAgKiAgICAgIFZhbGlkIHJhbmdlIG9mIHRoZSBpbmRleCBpcyBbMCwgbl0sIHdoZXJlIG4gPQotICAgICAqICAgICAgZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSAtIDEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2aWRlbyBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICogICAgICBJZiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIDAgc2hvdWxkIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHNwPElNZW1vcnk+IGdldFZpZGVvQnVmZmVyKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSAgICAvKioKICAgICAgKiBUZWxsIHdoZXRoZXIgdGhpcyBjYW1lcmEgc291cmNlIHN0b3JlcyBtZXRhIGRhdGEgb3IgcmVhbCBZVVYKICAgICAgKiBmcmFtZSBkYXRhIGluIHZpZGVvIGJ1ZmZlcnMuCiAgICAgICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggZjk1ZTU2YS4uNDhkMTQ2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCiAgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAogICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKApAQCAtNzUsMTUgKzc2LDE3IEBACiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKIAogICAgIC8vIGZvciBEUk0KLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKCkgeworICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7fTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7fTsKIAogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CiAgICAgfQogCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA1MWE0MzQzLi42Y2Y4NmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMzgsOSArMzgsOSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBEcm1Jbml0aWFsaXphdGlvbigpOworICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oKTsKIAotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKERlY3J5cHRIYW5kbGUgKipoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOworICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RmlsZVNvdXJjZSgpOwpAQCAtNTIsNyArNTIsNyBAQAogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgLypmb3IgRFJNKi8KLSAgICBEZWNyeXB0SGFuZGxlICptRGVjcnlwdEhhbmRsZTsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKICAgICBpbnQ2NF90IG1Ecm1CdWZPZmZzZXQ7CiAgICAgaW50NjRfdCBtRHJtQnVmU2l6ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAppbmRleCBkMWVjYWFmLi45NDZhMGFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCkBAIC04NCw3ICs4NCw3IEBACiAgICAgT01YX1UzMiBuUG9ydEluZGV4OwogICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7CiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZWFkZXI7Ci0gICAgY29uc3Qgc3A8YW5kcm9pZF9uYXRpdmVfYnVmZmVyX3Q+JiBuYXRpdmVCdWZmZXI7CisgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4mIG5hdGl2ZUJ1ZmZlcjsKIH07CiAKIC8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX0dldFBhcmFtZXRlciB3aGVuIHRoZSBleHRlbnNpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCA1YzUyMjlkLi45MDRjZTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC01NSw2ICs1NSwxMCBAQAogICAgIHN0YXR1c190IHNldEludGVybGVhdmVEdXJhdGlvbih1aW50MzJfdCBkdXJhdGlvbik7CiAgICAgaW50MzJfdCBnZXRUaW1lU2NhbGUoKSBjb25zdCB7IHJldHVybiBtVGltZVNjYWxlOyB9CiAKKyAgICBzdGF0dXNfdCBzZXRHZW9EYXRhKGludCBsYXRpdHVkZXgxMDAwMCwgaW50IGxvbmdpdHVkZXgxMDAwMCk7CisgICAgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwogCkBAIC03OSw2ICs4MywxMCBAQAogICAgIHVpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICBpbnQgbUxhdGl0dWRleDEwMDAwOworICAgIGludCBtTG9uZ2l0dWRleDEwMDAwOworICAgIGJvb2wgbUFyZUdlb1RhZ3NBdmFpbGFibGU7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAKICAgICBNdXRleCBtTG9jazsKIApAQCAtMTA4LDYgKzExNiwxMyBAQAogICAgIHN0cnVjdCBDaHVua0luZm8gewogICAgICAgICBUcmFjayAgICAgICAgICAgICAgICptVHJhY2s7ICAgICAgICAvLyBPd25lcgogICAgICAgICBMaXN0PENodW5rPiAgICAgICAgIG1DaHVua3M7ICAgICAgICAvLyBSZW1haW5pbmcgY2h1bmtzIHRvIGJlIHdyaXR0ZW4KKworICAgICAgICAvLyBQcmV2aW91cyBjaHVuayB0aW1lc3RhbXAgdGhhdCBoYXMgYmVlbiB3cml0dGVuCisgICAgICAgIGludDY0X3QgbVByZXZDaHVua1RpbWVzdGFtcFVzOworCisgICAgICAgIC8vIE1heCB0aW1lIGludGVydmFsIGJldHdlZW4gbmVpZ2hib3JpbmcgY2h1bmtzCisgICAgICAgIGludDY0X3QgbU1heEludGVyQ2h1bmtEdXJVczsKKwogICAgIH07CiAKICAgICBib29sICAgICAgICAgICAgbUlzRmlyc3RDaHVuazsKQEAgLTE1Nyw4ICsxNzIsMTYgQEAKICAgICBib29sIHVzZTMyQml0RmlsZU9mZnNldCgpIGNvbnN0OwogICAgIGJvb2wgZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCk7CiAgICAgYm9vbCBpc0ZpbGVTdHJlYW1hYmxlKCkgY29uc3Q7Ci0gICAgdm9pZCB0cmFja1Byb2dyZXNzU3RhdHVzKGNvbnN0IFRyYWNrKiB0cmFjaywgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVyciA9IE9LKTsKKyAgICB2b2lkIHRyYWNrUHJvZ3Jlc3NTdGF0dXMoc2l6ZV90IHRyYWNrSWQsIGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CiAgICAgdm9pZCB3cml0ZUNvbXBvc2l0aW9uTWF0cml4KGludDMyX3QgZGVncmVlcyk7CisgICAgdm9pZCB3cml0ZU12aGRCb3goaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIHdyaXRlTW9vdkJveChpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgd3JpdGVGdHlwQm94KE1ldGFEYXRhICpwYXJhbSk7CisgICAgdm9pZCB3cml0ZVVkdGFCb3goKTsKKyAgICB2b2lkIHdyaXRlR2VvRGF0YUJveCgpOworICAgIHZvaWQgd3JpdGVMYXRpdHVkZShpbnQgZGVncmVleDEwMDAwKTsKKyAgICB2b2lkIHdyaXRlTG9uZ2l0dWRlKGludCBkZWdyZWV4MTAwMDApOworICAgIHZvaWQgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAKICAgICBNUEVHNFdyaXRlcihjb25zdCBNUEVHNFdyaXRlciAmKTsKICAgICBNUEVHNFdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0V3JpdGVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggNjZkZmZmNi4uM2U0ODQ1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0yNiw2ICsyNiw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzI7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fUkFXOwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwpAQCAtNDUsOSArNDYsMTIgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJOwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTTsKIAorZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfM0dQUDsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRURJQV9ERUZTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggZjdmMjIzNS4uNDA0NGM1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtMTE0LDYgKzExNCw5IEBACiAKICAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCiAgICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZwogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggOTNiNWQyNC4uNzBkYWFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjE0LDYgKzIxNCw3IEBACiAKICAgICB2b2lkIHNldEFNUkZvcm1hdChib29sIGlzV0FNUiwgaW50MzJfdCBiaXRSYXRlKTsKICAgICB2b2lkIHNldEFBQ0Zvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgYml0UmF0ZSk7CisgICAgdm9pZCBzZXRHNzExRm9ybWF0KGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCmluZGV4IDRhOGJlN2IuLjEyYjRmOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKQEAgLTE0OSw2ICsxNDksNyBAQAogICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAogICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCiAgICAgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCiAgICAgT01YX0NPTE9SX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0NPTE9SX0ZPUk1BVFRZUEU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaAppbmRleCAyNzM4YmRjLi40Zjg0ODVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCkBAIC04NSw2ICs4NSw3IEBACiAgICAgT01YX1ZJREVPX0NvZGluZ1JWLCAgICAgICAgIC8qKjwgYWxsIHZlcnNpb25zIG9mIFJlYWwgVmlkZW8gKi8KICAgICBPTVhfVklERU9fQ29kaW5nQVZDLCAgICAgICAgLyoqPCBILjI2NC9BVkMgKi8KICAgICBPTVhfVklERU9fQ29kaW5nTUpQRUcsICAgICAgLyoqPCBNb3Rpb24gSlBFRyAqLworICAgIE9NWF9WSURFT19Db2RpbmdWUFgsICAgICAgICAvKio8IEdvb2dsZSBWUFgsIGZvcm1lcmx5IGtub3duIGFzIE9uMiBWUDggKi8KICAgICBPTVhfVklERU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAogICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCA0NjEwMTM1Li4yMGFiZDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jZGVmaW5lIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQgKEFORFJPSURfUFJJT1JJVFlfQVVESU8pCiAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIgdGhyZWFkCiAjZGVmaW5lIE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMgIDMwMDAgICAgLy8gTG9uZ2VyIHRpbWVvdXQgcGVyaW9kIGF0IHN0YXJ0dXAgdG8gY29wZSB3aXRoIEEyRFAgaW5pdCB0aW1lCiAjZGVmaW5lIE1BWF9SVU5fVElNRU9VVF9NUyAgICAgIDEwMDAKQEAgLTgyLDE1ICs4MSwxNSBAQAogICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlcgogCiAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgZnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBmbGFnczsKLQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIHBhZDE7CiAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgYnVmZmVyVGltZW91dE1zOyAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IGJlZm9yZSByZXN0YXJ0aW5nIGF1ZGlvZmxpbmdlcgotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHdhaXRUaW1lTXM7ICAgICAgLy8gQ3VtdWxhdGVkIHdhaXQgdGltZQogCisgICAgICAgICAgICAgICAgdWludDE2X3QgICAgd2FpdFRpbWVNczsgICAgICAvLyBDdW11bGF0ZWQgd2FpdCB0aW1lCiAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgc2VuZExldmVsOwotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHJlc2VydmVkOworICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgIGZsYWdzOworCiAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeSAoMzIgYnl0ZXMpCisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QoKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzdGVwVXNlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGVwU2VydmVyKHVpbnQzMl90IGZyYW1lQ291bnQpOwpAQCAtOTgsNiArOTcsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lc0F2YWlsYWJsZV9sKCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgZnJhbWVzUmVhZHkoKTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICB0cnlMb2NrKCk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmggYi9pbmNsdWRlL3ByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oCmluZGV4IGM3ZGI5YTYuLjZiMWZhNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaApAQCAtMjYsMTQgKzI2LDExIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY29weWJpdC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CiAKLXN0cnVjdCBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdDsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAKQEAgLTYwNCwxNCArNjAxLDYgQEAKICAgICB2b2lkICgqcmVuZGVyVHJpYW5nbGUpKEdMLCB2ZXJ0ZXhfdCosIHZlcnRleF90KiwgdmVydGV4X3QqKTsKIH07CiAKLXN0cnVjdCBjb3B5Yml0c19jb250ZXh0X3QgewotICAgIC8vIEEgaGFuZGxlIHRvIHRoZSBibGl0IGVuZ2luZSwgaWYgaXQgZXhpc3RzLCBlbHNlIE5VTEwuCi0gICAgY29weWJpdF9kZXZpY2VfdCogICAgICAgYmxpdEVuZ2luZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtaW5TY2FsZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtYXhTY2FsZTsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogZHJhd1N1cmZhY2VCdWZmZXI7Ci19OwotCiBzdHJ1Y3Qgb2dsZXNfY29udGV4dF90IHsKICAgICBjb250ZXh0X3QgICAgICAgICAgICAgICByYXN0ZXJpemVyOwogICAgIGFycmF5X21hY2hpbmVfdCAgICAgICAgIGFycmF5cyAgICAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CkBAIC02MzYsMTMgKzYyNSw2IEBACiAgICAgRUdMU3VyZmFjZU1hbmFnZXIqICAgICAgc3VyZmFjZU1hbmFnZXI7CiAgICAgRUdMQnVmZmVyT2JqZWN0TWFuYWdlciogYnVmZmVyT2JqZWN0TWFuYWdlcjsKIAotICAgIC8vIGNvcHliaXRzIGlzIG9ubHkgdXNlZCBpZiBMSUJBR0xfVVNFX0dSQUxMT0NfQ09QWUJJVFMgaXMKLSAgICAvLyBkZWZpbmVkLCBidXQgaXQgaXMgYWx3YXlzIHByZXNlbnQgYmVjYXVzZSBvZ2xlc19jb250ZXh0X3QgaXMgYSBwdWJsaWMKLSAgICAvLyBzdHJ1Y3QgdGhhdCBpcyB1c2VkIGJ5IGNsaWVudHMgb2YgbGliYWdsLiBXZSB3YW50IHRoZSBzaXplIGFuZCBvZmZzZXRzCi0gICAgLy8gdG8gc3RheSB0aGUgc2FtZSwgd2hldGhlciBvciBub3QgTElCQUdMX1VTRV9HUkFMTE9DX0NPUFlCSVRTIGlzIGRlZmluZWQuCi0KLSAgICBjb3B5Yml0c19jb250ZXh0X3QgICAgICBjb3B5Yml0czsKLQogICAgIEdMZW51bSAgICAgICAgICAgICAgICAgIGVycm9yOwogCiAgICAgc3RhdGljIGlubGluZSBvZ2xlc19jb250ZXh0X3QqIGdldCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTdiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCkBAIC0wLDAgKzEsNTcgQEAKKyMgTGlzdCBvZiBlZmZlY3QgbGlicmFyaWVzIHRvIGxvYWQuIEVhY2ggbGlicmFyeSBlbGVtZW50IG11c3QgY29udGFpbiBhICJwYXRoIiBlbGVtZW50CisjIGdpdmluZyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBsaWJyYXJ5IC5zbyBmaWxlLgorbGlicmFyaWVzIHsKKyAgYnVuZGxlIHsKKyAgICBwYXRoIC9zeXN0ZW0vbGliL3NvdW5kZngvbGliYnVuZGxld3JhcHBlci5zbworICB9CisgIHJldmVyYiB7CisgICAgcGF0aCAvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYnJldmVyYndyYXBwZXIuc28KKyAgfQorICB2aXN1YWxpemVyIHsKKyAgICBwYXRoIC9zeXN0ZW0vbGliL3NvdW5kZngvbGlidmlzdWFsaXplci5zbworICB9Cit9CisKKyMgbGlzdCBvZiBlZmZlY3RzIHRvIGxvYWQuIEVhY2ggZWZmZWN0IGVsZW1lbnQgbXVzdCBjb250YWluIGEgImxpYnJhcnkiIGFuZCBhICJ1dWlkIiBlbGVtZW50LgorIyBUaGUgdmFsdWUgb2YgdGhlICJsaWJyYXJ5IiBlbGVtZW50IG11c3QgY29ycmVzcG9uZCB0byB0aGUgbmFtZSBvZiBvbmUgbGlicmFyeSBlbGVtZW50IGluIHRoZQorIyAibGlicmFyaWVzIiBlbGVtZW50LgorIyBUaGUgbmFtZSBvZiB0aGUgZWZmZWN0IGVsZW1lbnQgaXMgaW5kaWNhdGl2ZSwgb25seSB0aGUgdmFsdWUgb2YgdGhlICJ1dWlkIiBlbGVtZW50CisjIGRlc2lnbmF0ZXMgdGhlIGVmZmVjdC4KK2VmZmVjdHMgeworICBiYXNzYm9vc3QgeworICAgIGxpYnJhcnkgYnVuZGxlCisgICAgdXVpZCA4NjMxZjMwMC03MmUyLTExZGYtYjU3ZS0wMDAyYTVkNWM1MWIKKyAgfQorICB2aXJ0dWFsaXplciB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIDFkNDAzM2MwLTg1NTctMTFkZi05ZjJkLTAwMDJhNWQ1YzUxYgorICB9CisgIGVxdWFsaXplciB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIGNlNzcyZjIwLTg0N2QtMTFkZi1iYjE3LTAwMDJhNWQ1YzUxYgorICB9CisgIHZvbHVtZSB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIDExOTM0MWEwLTg0NjktMTFkZi04MWY5LSAwMDAyYTVkNWM1MWIKKyAgfQorICByZXZlcmJfZW52X2F1eCB7CisgICAgbGlicmFyeSByZXZlcmIKKyAgICB1dWlkIDRhMzg3ZmMwLThhYjMtMTFkZi04YmFkLSAwMDAyYTVkNWM1MWIKKyAgfQorICByZXZlcmJfZW52X2lucyB7CisgICAgbGlicmFyeSByZXZlcmIKKyAgICB1dWlkIGM3YTUxMWEwLWEzYmItMTFkZi04NjBlLTAwMDJhNWQ1YzUxYgorICB9CisgIHJldmVyYl9wcmVfYXV4IHsKKyAgICBsaWJyYXJ5IHJldmVyYgorICAgIHV1aWQgZjI5YTE0MDAtYTNiYi0xMWRmLThkZGMtMDAwMmE1ZDVjNTFiCisgIH0KKyAgcmV2ZXJiX3ByZV9pbnMgeworICAgIGxpYnJhcnkgcmV2ZXJiCisgICAgdXVpZCAxNzJjZGYwMC1hM2JjLTExZGYtYTcyZi0wMDAyYTVkNWM1MWIKKyAgfQorICB2aXN1YWxpemVyIHsKKyAgICBsaWJyYXJ5IHZpc3VhbGl6ZXIKKyAgICB1dWlkIGQwNjlkOWUwLTgzMjktMTFkZi05MTY4LTAwMDJhNWQ1YzUxYgorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IGMxOWE1MDUuLmIwZTg1ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdFZmZlY3RMaXN0OyAvLyBsaXN0IG9mIGVmZmVjdF9lbnRyeV90OiBhbGwgY3VycmVudGx5IGNyZWF0ZWQgZWZmZWN0cwogc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcwpAQCAtMzAsMzAgKzMyLDM5IEBACiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJMaWI7ICAgIC8vIGN1cnJlbnQgbGlicmFyeSBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJFZmZlY3Q7IC8vIGN1cnJlbnQgZWZmZWN0IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyB1aW50MzJfdCBnQ3VyRWZmZWN0SWR4OyAgICAgICAvLyBjdXJyZW50IGVmZmVjdCBpbmRleCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCitzdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQogCi1jb25zdCBjaGFyICogY29uc3QgZ0VmZmVjdExpYlBhdGggPSAiL3N5c3RlbS9saWIvc291bmRmeCI7IC8vIHBhdGggdG8gYnVpbHQtaW4gZWZmZWN0IGxpYnJhcmllcwogc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAotc3RhdGljIGludCBnTmV4dExpYklkOyAvLyB1c2VkIGJ5IGxvYWRMaWJyYXJ5KCkgdG8gYWxsb2NhdGUgdW5pcXVlIGxpYnJhcnkgaGFuZGxlcwogc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKIAorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyAgICAgIExvY2FsIGZ1bmN0aW9ucyBwcm90b3R5cGVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyBpbnQgaW5pdCgpOwotc3RhdGljIGludCBsb2FkTGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSk7Ci1zdGF0aWMgaW50IHVubG9hZExpYnJhcnkoaW50IGhhbmRsZSk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworc3RhdGljIGludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIGludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3QoY25vZGUgKm5vZGUpOworc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwogc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOwogc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKLXN0YXRpYyBpbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp1dWlkLCBsaWJfZW50cnlfdCAqKmxpYiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOworc3RhdGljIGludCBmaW5kRWZmZWN0KGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7CiBzdGF0aWMgdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOworc3RhdGljIGludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKTsKK3N0YXRpYyBpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIGZ1bmN0aW9ucwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1pbnQgRWZmZWN0X1Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKK2ludCBFZmZlY3RfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQogewogICAgIGludCByZXQgPSBpbml0KCk7CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTczLDcgKzg0LDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgRWZmZWN0X0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCitpbnQgRWZmZWN0X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLApAQCAtOTgsOSArMTA5LDMxIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAoraW50IEVmZmVjdF9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlZmZlY3RfZW50cnlfdCAqZnggPSAoZWZmZWN0X2VudHJ5X3QgKilzZWxmOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FUElQRTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworCisgICAgcmV0ID0gKCpmeC0+c3ViSXRmZSktPmdldF9kZXNjcmlwdG9yKGZ4LT5zdWJJdGZlLCBkZXNjKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKwogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnSW50ZXJmYWNlID0gewogICAgICAgICBFZmZlY3RfUHJvY2VzcywKLSAgICAgICAgRWZmZWN0X0NvbW1hbmQKKyAgICAgICAgRWZmZWN0X0NvbW1hbmQsCisgICAgICAgIEVmZmVjdF9HZXREZXNjcmlwdG9yCiB9OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xODIsNyArMjE1LDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOwotICAgIHJldCA9IGZpbmRFZmZlY3QodXVpZCwgJmwsICZkKTsKKyAgICByZXQgPSBmaW5kRWZmZWN0KE5VTEwsIHV1aWQsICZsLCAmZCk7CiAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgZCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKICAgICB9CkBAIC0xOTAsMTcgKzIyMywxNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqdXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKQoraW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpCiB7CiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBpdGZlOworICAgIGVmZmVjdF9oYW5kbGVfdCBpdGZlOwogICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKICAgICBpbnQgZm91bmQgPSAwOwogICAgIGludCByZXQ7CiAKLSAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHBJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgIGlmICh1dWlkID09IE5VTEwgfHwgcEhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMjE4LDE1ICsyNTEsMTUgQEAKIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOwogCi0gICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIHJldCA9IGZpbmRFZmZlY3QoTlVMTCwgdXVpZCwgJmwsICZkKTsKICAgICBpZiAocmV0IDwgMCl7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgZWZmZWN0IGluIGxpYnJhcnkKLSAgICByZXQgPSBsLT5jcmVhdGVGeCh1dWlkLCBzZXNzaW9uSWQsIGlvSWQsICZpdGZlKTsKKyAgICBsLT5kZXNjLT5jcmVhdGVfZWZmZWN0KHV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJml0ZmUpOwogICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICBMT0dXKCJFZmZlY3RDcmVhdGUoKSBsaWJyYXJ5ICVzOiBjb3VsZCBub3QgY3JlYXRlIGZ4ICVzLCBlcnJvciAlZCIsIGwtPnBhdGgsIGQtPm5hbWUsIHJldCk7CisgICAgICAgIExPR1coIkVmZmVjdENyZWF0ZSgpIGxpYnJhcnkgJXM6IGNvdWxkIG5vdCBjcmVhdGUgZnggJXMsIGVycm9yICVkIiwgbC0+bmFtZSwgZC0+bmFtZSwgcmV0KTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIApAQCAtMjQxLDE2ICsyNzQsMTYgQEAKICAgICBlLT5uZXh0ID0gZ0VmZmVjdExpc3Q7CiAgICAgZ0VmZmVjdExpc3QgPSBlOwogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KWZ4OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClmeDsKIAotICAgIExPR1YoIkVmZmVjdENyZWF0ZSgpIGNyZWF0ZWQgZW50cnkgJXAgd2l0aCBzdWIgaXRmZSAlcCBpbiBsaWJyYXJ5ICVzIiwgKnBJbnRlcmZhY2UsIGl0ZmUsIGwtPnBhdGgpOworICAgIExPR1YoIkVmZmVjdENyZWF0ZSgpIGNyZWF0ZWQgZW50cnkgJXAgd2l0aCBzdWIgaXRmZSAlcCBpbiBsaWJyYXJ5ICVzIiwgKnBIYW5kbGUsIGl0ZmUsIGwtPm5hbWUpOwogCiBleGl0OgogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkKK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgZWZmZWN0X2VudHJ5X3QgKmZ4OwogICAgIGxpc3RfZWxlbV90ICplMTsKQEAgLTI2Niw3ICsyOTksNyBAQAogICAgIGUxID0gZ0VmZmVjdExpc3Q7CiAgICAgZTIgPSBOVUxMOwogICAgIHdoaWxlIChlMSkgewotICAgICAgICBpZiAoZTEtPm9iamVjdCA9PSBpbnRlcmZhY2UpIHsKKyAgICAgICAgaWYgKGUxLT5vYmplY3QgPT0gaGFuZGxlKSB7CiAgICAgICAgICAgICBpZiAoZTIpIHsKICAgICAgICAgICAgICAgICBlMi0+bmV4dCA9IGUxLT5uZXh0OwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI4NiwxMCArMzE5LDEwIEBACiAKICAgICAvLyByZWxlYXNlIGVmZmVjdCBpbiBsaWJyYXJ5CiAgICAgaWYgKGZ4LT5saWIgPT0gTlVMTCkgewotICAgICAgICBMT0dXKCJFZmZlY3RSZWxlYXNlKCkgZnggJXAgbGlicmFyeSBhbHJlYWR5IHVubG9hZGVkIiwgaW50ZXJmYWNlKTsKKyAgICAgICAgTE9HVygiRWZmZWN0UmVsZWFzZSgpIGZ4ICVwIGxpYnJhcnkgYWxyZWFkeSB1bmxvYWRlZCIsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmeC0+bGliLT5sb2NrKTsKLSAgICAgICAgZngtPmxpYi0+cmVsZWFzZUZ4KGZ4LT5zdWJJdGZlKTsKKyAgICAgICAgZngtPmxpYi0+ZGVzYy0+cmVsZWFzZV9lZmZlY3QoZngtPnN1Ykl0ZmUpOwogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CiAgICAgfQogICAgIGZyZWUoZngpOwpAQCAtMjk5LDMzICszMzIsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBFZmZlY3RMb2FkTGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKLXsKLSAgICBpbnQgcmV0ID0gaW5pdCgpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChsaWJQYXRoID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcmV0ID0gbG9hZExpYnJhcnkobGliUGF0aCwgaGFuZGxlKTsKLSAgICB1cGRhdGVOdW1FZmZlY3RzKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IEVmZmVjdFVubG9hZExpYnJhcnkoaW50IGhhbmRsZSkKLXsKLSAgICBpbnQgcmV0ID0gaW5pdCgpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcmV0ID0gdW5sb2FkTGlicmFyeShoYW5kbGUpOwotICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBpbnQgRWZmZWN0SXNOdWxsVXVpZChlZmZlY3RfdXVpZF90ICp1dWlkKQogewogICAgIGlmIChtZW1jbXAodXVpZCwgRUZGRUNUX1VVSURfTlVMTCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSkgewpAQCAtMzM5LDkgKzM0NSw2IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGludCBpbml0KCkgewotICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKLSAgICBESVIgKmRpciA9IE5VTEw7Ci0gICAgY2hhciBsaWJwYXRoW1BBVEhfTUFYXTsKICAgICBpbnQgaGRsOwogCiAgICAgaWYgKGdJbml0RG9uZSkgewpAQCAtMzUwLDIxNCArMzUzLDIxMCBAQAogCiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZnTGliTG9jaywgTlVMTCk7CiAKLSAgICAvLyBsb2FkIGJ1aWx0LWluIGxpYnJhcmllcwotICAgIGRpciA9IG9wZW5kaXIoZ0VmZmVjdExpYlBhdGgpOwotICAgIGlmIChkaXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7CisgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOwogICAgIH0KLSAgICB3aGlsZSAoKGVudCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotICAgICAgICBMT0dWKCJpbml0KCkgcmVhZGluZyBmaWxlICVzIiwgZW50LT5kX25hbWUpOwotICAgICAgICBpZiAoKHN0cmxlbihlbnQtPmRfbmFtZSkgPCAzKSB8fAotICAgICAgICAgICAgc3RybmNtcChlbnQtPmRfbmFtZSwgImxpYiIsIDMpICE9IDAgfHwKLSAgICAgICAgICAgIHN0cm5jbXAoZW50LT5kX25hbWUgKyBzdHJsZW4oZW50LT5kX25hbWUpIC0gMywgIi5zbyIsIDMpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmNweShsaWJwYXRoLCBnRWZmZWN0TGliUGF0aCk7Ci0gICAgICAgIHN0cmNhdChsaWJwYXRoLCAiLyIpOwotICAgICAgICBzdHJjYXQobGlicGF0aCwgZW50LT5kX25hbWUpOwotICAgICAgICBpZiAobG9hZExpYnJhcnkobGlicGF0aCwgJmhkbCkgPCAwKSB7Ci0gICAgICAgICAgICBMT0dXKCJpbml0KCkgZmFpbGVkIHRvIGxvYWQgbGlicmFyeSAlcyIsbGlicGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY2xvc2VkaXIoZGlyKTsKKwogICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKICAgICBnSW5pdERvbmUgPSAxOwogICAgIExPR1YoImluaXQoKSBkb25lIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKLQotaW50IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoraW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCiB7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisgICAgbG9hZExpYnJhcmllcyhyb290KTsKKyAgICBsb2FkRWZmZWN0cyhyb290KTsKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjbm9kZSAqbm9kZTsKICAgICB2b2lkICpoZGw7Ci0gICAgZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190IHF1ZXJ5TnVtRng7Ci0gICAgZWZmZWN0X1F1ZXJ5RWZmZWN0X3QgcXVlcnlGeDsKLSAgICBlZmZlY3RfQ3JlYXRlRWZmZWN0X3QgY3JlYXRlRng7Ci0gICAgZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCByZWxlYXNlRng7Ci0gICAgdWludDMyX3QgbnVtRng7Ci0gICAgdWludDMyX3QgZng7Ci0gICAgaW50IHJldDsKLSAgICBsaXN0X2VsZW1fdCAqZSwgKmRlc2NIZWFkID0gTlVMTDsKKyAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOworICAgIGxpc3RfZWxlbV90ICplOwogICAgIGxpYl9lbnRyeV90ICpsOwogCi0gICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBVEhfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgICpoYW5kbGUgPSAwOwotCi0gICAgaGRsID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XKTsKLSAgICBpZiAoaGRsID09IDApIHsKLSAgICAgICAgTE9HVygiY291bGQgb3BlbiBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgZnVuY3Rpb25zIGF2YWlsYWJpbGl0eQotICAgIHF1ZXJ5TnVtRnggPSAoZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190KWRsc3ltKGhkbCwgIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIpOwotICAgIGlmIChxdWVyeU51bUZ4ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0ID0gLUVOT0RFVjsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcXVlcnlGeCA9IChlZmZlY3RfUXVlcnlFZmZlY3RfdClkbHN5bShoZGwsICJFZmZlY3RRdWVyeUVmZmVjdCIpOwotICAgIGlmIChxdWVyeUZ4ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeUVmZmVjdCBmcm9tIGxpYiAlcyIsIGxpYlBhdGgpOwotICAgICAgICByZXQgPSAtRU5PREVWOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBjcmVhdGVGeCA9IChlZmZlY3RfQ3JlYXRlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0Q3JlYXRlIik7Ci0gICAgaWYgKGNyZWF0ZUZ4ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RDcmVhdGUgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0ID0gLUVOT0RFVjsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcmVsZWFzZUZ4ID0gKGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0UmVsZWFzZSIpOwotICAgIGlmIChyZWxlYXNlRnggPT0gTlVMTCkgewotICAgICAgICBMT0dXKCJjb3VsZCBub3QgZ2V0IEVmZmVjdFJlbGVhc2UgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICBoZGwgPSBkbG9wZW4obm9kZS0+dmFsdWUsIFJUTERfTk9XKTsKKyAgICBpZiAoaGRsID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIG5vZGUtPnZhbHVlKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICAvLyBsb2FkIGVmZmVjdCBkZXNjcmlwdG9ycwotICAgIHJldCA9IHF1ZXJ5TnVtRngoJm51bUZ4KTsKLSAgICBpZiAocmV0KSB7CisgICAgZGVzYyA9IChhdWRpb19lZmZlY3RfbGlicmFyeV90ICopZGxzeW0oaGRsLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOworICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGZvciAoZnggPSAwOyBmeCA8IG51bUZ4OyBmeCsrKSB7Ci0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgaWYgKGQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gcXVlcnlGeChmeCwgZCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMCkgewotI2lmIChMT0dfTkRFQlVHPT0wKQotICAgICAgICAgICAgY2hhciBzWzI1Nl07Ci0gICAgICAgICAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCAyNTYpOwotICAgICAgICAgICAgTE9HVigibG9hZExpYnJhcnkoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoZC0+YXBpVmVyc2lvbiAhPSBFRkZFQ1RfQVBJX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA0eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsaWJQYXRoKTsKLSAgICAgICAgICAgICAgICBmcmVlKGQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICAgICAgICAgIGlmIChlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKGQpOwotICAgICAgICAgICAgICAgIHJldCA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUtPm9iamVjdCA9IGQ7Ci0gICAgICAgICAgICBlLT5uZXh0ID0gZGVzY0hlYWQ7Ci0gICAgICAgICAgICBkZXNjSGVhZCA9IGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgIyAlZCBvbiBsaWIgJXMiLCBmeCwgbGliUGF0aCk7Ci0gICAgICAgIH0KKyAgICBpZiAoQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHICE9IGRlc2MtPnRhZykgeworICAgICAgICBMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQorICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgeworICAgICAgICBMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAogICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7Ci0gICAgbC0+aWQgPSArK2dOZXh0TGliSWQ7CisgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKG5vZGUtPnZhbHVlLCBQQVRIX01BWCk7CiAgICAgbC0+aGFuZGxlID0gaGRsOwotICAgIHN0cm5jcHkobC0+cGF0aCwgbGliUGF0aCwgUEFUSF9NQVgpOwotICAgIGwtPmNyZWF0ZUZ4ID0gY3JlYXRlRng7Ci0gICAgbC0+cmVsZWFzZUZ4ID0gcmVsZWFzZUZ4OwotICAgIGwtPmVmZmVjdHMgPSBkZXNjSGVhZDsKKyAgICBsLT5kZXNjID0gZGVzYzsKKyAgICBsLT5lZmZlY3RzID0gTlVMTDsKICAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOwogCiAgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OwogICAgIGUtPm9iamVjdCA9IGw7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKICAgICBnTGlicmFyeUxpc3QgPSBlOwogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgTE9HVigibG9hZExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCIsIGwpOwotCi0gICAgKmhhbmRsZSA9IGwtPmlkOworICAgIExPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIG5vZGUtPnZhbHVlKTsKIAogICAgIHJldHVybiAwOwogCiBlcnJvcjoKLSAgICBMT0dXKCJsb2FkTGlicmFyeSgpIGVycm9yOiAlZCBvbiBsaWI6ICVzIiwgcmV0LCBsaWJQYXRoKTsKLSAgICB3aGlsZSAoZGVzY0hlYWQpIHsKLSAgICAgICAgZnJlZShkZXNjSGVhZC0+b2JqZWN0KTsKLSAgICAgICAgZSA9IGRlc2NIZWFkLT5uZXh0OwotICAgICAgICBmcmVlKGRlc2NIZWFkKTsKLSAgICAgICAgZGVzY0hlYWQgPSBlOzsKKyAgICBpZiAoaGRsICE9IE5VTEwpIHsKKyAgICAgICAgZGxjbG9zZShoZGwpOwogICAgIH0KLSAgICBkbGNsb3NlKGhkbCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gLUVJTlZBTDsKIH0KIAotaW50IHVubG9hZExpYnJhcnkoaW50IGhhbmRsZSkKK2ludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKIHsKLSAgICB2b2lkICpoZGw7Ci0gICAgaW50IHJldDsKLSAgICBsaXN0X2VsZW1fdCAqZWwxLCAqZWwyOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKKyAgICBjbm9kZSAqbm9kZTsKIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOwotICAgIGVsMSA9IGdMaWJyYXJ5TGlzdDsKLSAgICBlbDIgPSBOVUxMOwotICAgIHdoaWxlIChlbDEpIHsKLSAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWVsMS0+b2JqZWN0OwotICAgICAgICBpZiAoaGFuZGxlID09IGwtPmlkKSB7Ci0gICAgICAgICAgICBpZiAoZWwyKSB7Ci0gICAgICAgICAgICAgICAgZWwyLT5uZXh0ID0gZWwxLT5uZXh0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnTGlicmFyeUxpc3QgPSBlbDEtPm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKGVsMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbDIgPSBlbDE7Ci0gICAgICAgIGVsMSA9IGVsMS0+bmV4dDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKLSAgICBpZiAoZWwxID09IE5VTEwpIHsKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQotCi0gICAgLy8gY2xlYXIgZWZmZWN0IGRlc2NyaXB0b3IgbGlzdAotICAgIGVsMSA9IGwtPmVmZmVjdHM7Ci0gICAgd2hpbGUgKGVsMSkgewotICAgICAgICBmcmVlKGVsMS0+b2JqZWN0KTsKLSAgICAgICAgZWwyID0gZWwxLT5uZXh0OwotICAgICAgICBmcmVlKGVsMSk7Ci0gICAgICAgIGVsMSA9IGVsMjsKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CiAgICAgfQotCi0gICAgLy8gZGlzYWJsZSBhbGwgZWZmZWN0cyBmcm9tIHRoaXMgbGlicmFyeQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbC0+bG9jayk7Ci0KLSAgICBlbDEgPSBnRWZmZWN0TGlzdDsKLSAgICB3aGlsZSAoZWwxKSB7Ci0gICAgICAgIGZ4ID0gKGVmZmVjdF9lbnRyeV90ICopZWwxLT5vYmplY3Q7Ci0gICAgICAgIGlmIChmeC0+bGliID09IGwpIHsKLSAgICAgICAgICAgIGZ4LT5saWIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsMSA9IGVsMS0+bmV4dDsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmwtPmxvY2spOwotCi0gICAgZGxjbG9zZShsLT5oYW5kbGUpOwotICAgIGZyZWUobCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBsb2FkRWZmZWN0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpc3RfZWxlbV90ICplOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKKyAgICBpZiAobCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisjaWYgKExPR19OREVCVUc9PTApCisgICAgY2hhciBzWzI1Nl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgMjU2KTsKKyAgICBMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IGQ7CisgICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7CisgICAgbC0+ZWZmZWN0cyA9IGU7CisKKyAgICByZXR1cm4gMDsKK30KKworbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgorICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgeworICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7CisgICAgfQorCisgICAgZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpCiB7CiAgICAgZ0N1ckxpYiA9IGdMaWJyYXJ5TGlzdDsKQEAgLTU4OSw3ICs1ODgsMTAgQEAKICAgICByZXR1cm4gY250OwogfQogCi1pbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp1dWlkLCBsaWJfZW50cnlfdCAqKmxpYiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCitpbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCiB7CiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwpAQCAtNjAyLDcgKzYwNCwxMSBAQAogICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKICAgICAgICAgd2hpbGUgKGVmeCkgewogICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7Ci0gICAgICAgICAgICBpZiAobWVtY21wKCZkLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE5VTEwgJiYgbWVtY21wKCZkLT50eXBlLCB0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXVpZCAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjE0LDkgKzYyMCwxMSBAQAogICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOwogICAgICAgICByZXQgPSAtRU5PRU5UOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPnBhdGgpOworICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZm91bmQgZWZmZWN0OiAlcyBpbiBsaWIgJXMiLCBkLT5uYW1lLCBsLT5uYW1lKTsKICAgICAgICAgKmxpYiA9IGw7Ci0gICAgICAgICpkZXNjID0gZDsKKyAgICAgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgICAgICpkZXNjID0gZDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC02MjYsMTcgKzYzNCwxMiBAQAogICAgIGNoYXIgc1syNTZdOwogCiAgICAgc25wcmludGYoc3RyLCBsZW4sICJcbkVmZmVjdCBEZXNjcmlwdG9yICVwOlxuIiwgZGVzYyk7Ci0gICAgc3ByaW50ZihzLCAiLSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLSAgICAgICAgICAgIGRlc2MtPnV1aWQudGltZUxvdywgZGVzYy0+dXVpZC50aW1lTWlkLCBkZXNjLT51dWlkLnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICBkZXNjLT51dWlkLmNsb2NrU2VxLCBkZXNjLT51dWlkLm5vZGVbMF0sIGRlc2MtPnV1aWQubm9kZVsxXSxkZXNjLT51dWlkLm5vZGVbMl0sCi0gICAgICAgICAgICBkZXNjLT51dWlkLm5vZGVbM10sZGVzYy0+dXVpZC5ub2RlWzRdLGRlc2MtPnV1aWQubm9kZVs1XSk7Ci0gICAgc3RybmNhdChzdHIsIHMsIGxlbik7Ci0gICAgc3ByaW50ZihzLCAiLSBUWVBFOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLSAgICAgICAgICAgICAgICBkZXNjLT50eXBlLnRpbWVMb3csIGRlc2MtPnR5cGUudGltZU1pZCwgZGVzYy0+dHlwZS50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgICAgIGRlc2MtPnR5cGUuY2xvY2tTZXEsIGRlc2MtPnR5cGUubm9kZVswXSwgZGVzYy0+dHlwZS5ub2RlWzFdLGRlc2MtPnR5cGUubm9kZVsyXSwKLSAgICAgICAgICAgICAgICBkZXNjLT50eXBlLm5vZGVbM10sZGVzYy0+dHlwZS5ub2RlWzRdLGRlc2MtPnR5cGUubm9kZVs1XSk7Ci0gICAgc3RybmNhdChzdHIsIHMsIGxlbik7Ci0gICAgc3ByaW50ZihzLCAiLSBhcGlWZXJzaW9uOiAlMDRYXG4tIGZsYWdzOiAlMDhYXG4iLAorICAgIHN0cm5jYXQoc3RyLCAiLSBUWVBFOiAiLCBsZW4pOworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgMjU2KTsKKyAgICBzbnByaW50ZihzdHIsIGxlbiwgIi0gVVVJRDogJXNcbiIsIHMpOworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dHlwZSwgcywgMjU2KTsKKyAgICBzbnByaW50ZihzdHIsIGxlbiwgIi0gVFlQRTogJXNcbiIsIHMpOworICAgIHNwcmludGYocywgIi0gYXBpVmVyc2lvbjogJTA4WFxuLSBmbGFnczogJTA4WFxuIiwKICAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGRlc2MtPmZsYWdzKTsKICAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKICAgICBzcHJpbnRmKHMsICItIG5hbWU6ICVzXG4iLCBkZXNjLT5uYW1lKTsKQEAgLTY0NSwzICs2NDgsNDMgQEAKICAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKIH0KIAoraW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB1dWlkLT50aW1lTG93LAorICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA4ZjU0M2NhLi5mY2MwZGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjIsMjkgKzIyLDM1IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KIAotCiAjaWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNkZWZpbmUgQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUgIi9zeXN0ZW0vZXRjL2F1ZGlvX2VmZmVjdHMuY29uZiIKKyNkZWZpbmUgQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSAiL3ZlbmRvci9ldGMvYXVkaW9fZWZmZWN0cy5jb25mIgorI2RlZmluZSBFRkZFQ1RTX1RBRyAiZWZmZWN0cyIKKyNkZWZpbmUgTElCUkFSSUVTX1RBRyAibGlicmFyaWVzIgorI2RlZmluZSBQQVRIX1RBRyAicGF0aCIKKyNkZWZpbmUgTElCUkFSWV9UQUcgImxpYnJhcnkiCisjZGVmaW5lIFVVSURfVEFHICJ1dWlkIgorCiB0eXBlZGVmIHN0cnVjdCBsaXN0X2VsZW1fcyB7CiAgICAgdm9pZCAqb2JqZWN0OwogICAgIHN0cnVjdCBsaXN0X2VsZW1fcyAqbmV4dDsKIH0gbGlzdF9lbGVtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGxpYl9lbnRyeV9zIHsKLSAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpwYXRoOwogICAgIHZvaWQgKmhhbmRsZTsKLSAgICBpbnQgaWQ7Ci0gICAgZWZmZWN0X0NyZWF0ZUVmZmVjdF90IGNyZWF0ZUZ4OwotICAgIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgcmVsZWFzZUZ4OwogICAgIGxpc3RfZWxlbV90ICplZmZlY3RzOyAvL2xpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3JfdAogICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOwogfSBsaWJfZW50cnlfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2VudHJ5X3MgewogICAgIHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7Ci0gICAgZWZmZWN0X2ludGVyZmFjZV90IHN1Ykl0ZmU7CisgICAgZWZmZWN0X2hhbmRsZV90IHN1Ykl0ZmU7CiAgICAgbGliX2VudHJ5X3QgKmxpYjsKIH0gZWZmZWN0X2VudHJ5X3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKaW5kZXggZmYzNDcwNy4uZjQ5MjY3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtdXNpY2J1bmRsZQogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICQoTE9DQUxfUEFUSCkvRXEvbGliIFwKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJyZXZlcmIKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAkKExPQ0FMX1BBVEgpL1JldmVyYi9saWIgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCmluZGV4IDJlOWI5YjQuLjk5Y2ZkZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTEzLDcgKzEzLDcgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYm11c2ljYnVuZGxlCiAKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnJldmVyYgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCAwYjA2MWRiLi4yMWM0NTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxFZmZlY3RCdW5kbGUuaD4KIAogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CiBleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZTsKIAogI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyl7XApAQCAtNzEsNyArNzEsNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQmFzc0Jvb3N0RGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKICAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECiAgICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFLApAQCAtODQsNyArODQsNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVmlydHVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgzN2NjMmMwMCwgMHhkZGRkLCAweDExZGIsIDB4ODU3NywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgezB4MWQ0MDMzYzAsIDB4ODU1NywgMHgxMWRmLCAweDlmMmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAogICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCkBAIC05Nyw3ICs5Nyw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQogICAgICAgICB7MHhjZTc3MmYyMCwgMHg4NDdkLCAweDExZGYsIDB4YmIxNywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZCBFcSBOWFAKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKQEAgLTEwOSw3ICsxMDksNyBAQAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVm9sdW1lRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKICAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwgLy91dWlkIFZPTCBOWFAKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIFZPTFVNRV9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgQlVORExFX01FTV9VU0FHRSwKQEAgLTE4Nyw3ICsxODcsNyBAQAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgKnBJbnRlcmZhY2UpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBIYW5kbGUpewogICAgIGludCByZXQgPSAwOwogICAgIGludCBzZXNzaW9uTm87CiAgICAgaW50IGk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogICAgIExPR1YoIlxuXHRFZmZlY3RDcmVhdGUgc3RhcnQgc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpewogICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CkBAIC0zNTUsMTkgKzM1NSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0OwogICAgICAgICB9Ci0gICAgICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClOVUxMOworICAgICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpcENvbnRleHQ7CisgICAgICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKICAgICB9CiAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kLi5cblxuIik7CiAgICAgcmV0dXJuIHJldDsKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpewotICAgIExPR1YoIlxuXHRFZmZlY3RSZWxlYXNlIHN0YXJ0ICVwIiwgaW50ZXJmYWNlKTsKLSAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSl7CisgICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBoYW5kbGUpOworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIHN0YXJ0IGludGVyZmFjZTogJXAsIGNvbnRleHQgJXAiLCBpbnRlcmZhY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBzdGFydCBoYW5kbGU6ICVwLCBjb250ZXh0ICVwIiwgaGFuZGxlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CiAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC00NjAsNiArNDYwLDM0IEBACiAKIH0gLyogZW5kIEVmZmVjdFJlbGVhc2UgKi8KIAorZXh0ZXJuICJDIiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBOVUxMOworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnQmFzc0Jvb3N0RGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnQmFzc0Jvb3N0RGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZpcnR1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnVmlydHVhbGl6ZXJEZXNjcmlwdG9yOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnRXF1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnRXF1YWxpemVyRGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcCh1dWlkLCAmZ1ZvbHVtZURlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgIGRlc2MgPSAmZ1ZvbHVtZURlc2NyaXB0b3I7CisgICAgfQorCisgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RHZXREZXNjcmlwdG9yICovCisKIHZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQoKXsKICAgICBMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7CiAgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKQEAgLTQ5MywxNiArNTIxLDE2IEBACiAgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOwogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC05MjgsMTAgKzk1NiwxMCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CiAKICAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKIApAQCAtMjU0NSw4ICsyNTczLDkgQEAKIH0gLy8gbmFtZXNwYWNlCiB9IC8vIG5hbWVzcGFjZQogCitleHRlcm4gIkMiIHsKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLwotZXh0ZXJuICJDIiBpbnQgRWZmZWN0X3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90ICAgICBzZWxmLAoraW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKICAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwpAQCAtMjY2Niw3ICsyNjk1LDcgQEAKIH0gICAvKiBlbmQgRWZmZWN0X3Byb2Nlc3MgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCi1leHRlcm4gIkMiIGludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3QgIHNlbGYsCitpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCkBAIC0zMDE2LDExICszMDQ1LDExIEBACiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgogICAgICAgICB7CiAgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIHN0YXJ0Iik7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VfZSBkZXZpY2UgPSAqKGF1ZGlvX2RldmljZV9lICopcENtZERhdGE7CisgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IERFVklDRV9TUEVBS0VSKXx8KGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKLSAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKKyAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX0JBU1NfQk9PU1QgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9CQVNfQk9PU1QiKTsKQEAgLTMwNTEsOCArMzA4MCw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IERFVklDRV9TUEVBS0VSKXx8KGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKLSAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpfHwKKyAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKQEAgLTMxNjQsOSArMzE5Myw1NyBAQAogICAgIHJldHVybiAwOwogfSAgICAvKiBlbmQgRWZmZWN0X2NvbW1hbmQgKi8KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWZmZWN0CisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCitpbnQgRWZmZWN0X2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HVigiRWZmZWN0X2dldERlc2NyaXB0b3IoKSBpbnZhbGlkIHBhcmFtIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaChwQ29udGV4dC0+RWZmZWN0VHlwZSkgeworICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnQmFzc0Jvb3N0RGVzY3JpcHRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWTV9WSVJUVUFMSVpFUjoKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z1ZpcnR1YWxpemVyRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWTV9FUVVBTElaRVI6CisgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdFcXVhbGl6ZXJEZXNjcmlwdG9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZNX1ZPTFVNRToKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z1ZvbHVtZURlc2NyaXB0b3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1lbWNweShwRGVzY3JpcHRvciwgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBFZmZlY3RfZ2V0RGVzY3JpcHRvciAqLworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZSA9IHsKICAgICBFZmZlY3RfcHJvY2VzcywKLSAgICBFZmZlY3RfY29tbWFuZAorICAgIEVmZmVjdF9jb21tYW5kLAorICAgIEVmZmVjdF9nZXREZXNjcmlwdG9yCiB9OyAgICAvKiBlbmQgZ0x2bUVmZmVjdEludGVyZmFjZSAqLwogCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgbmFtZSA6ICJFZmZlY3QgQnVuZGxlIExpYnJhcnkiLAorICAgIGltcGxlbWVudG9yIDogIk5YUCBTb2Z0d2FyZSBMdGQuIiwKKyAgICBxdWVyeV9udW1fZWZmZWN0cyA6IGFuZHJvaWQ6OkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cywKKyAgICBxdWVyeV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeUVmZmVjdCwKKyAgICBjcmVhdGVfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAorICAgIHJlbGVhc2VfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICBnZXRfZGVzY3JpcHRvciA6IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCit9OworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCA5MDk3ZTIwLi4yNzI3Mzc1IDEwMDc1NQotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxFZmZlY3RSZXZlcmIuaD4KICNpbmNsdWRlIDxMVlJFVi5oPgogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHJldmVyYgogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2U7CiAKICNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKQEAgLTc3LDcgKzc3LDcgQEAKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllIH0gfSwKICAgICAgICAgeyAweDRhMzg3ZmMwLCAweDhhYjMsIDB4MTFkZiwgMHg4YmFkLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKICAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIExWUkVWX01FTV9VU0FHRSwKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgezB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWV9fSwKICAgICAgICAgezB4YzdhNTExYTAsIDB4YTNiYiwgMHgxMWRmLCAweDg2MGUsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwsCiAgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCkBAIC0xMDEsNyArMTAxLDcgQEAKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgezB4ZjI5YTE0MDAsIDB4YTNiYiwgMHgxMWRmLCAweDhkZGMsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZLAogICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgTFZSRVZfTUVNX1VTQUdFLApAQCAtMTEzLDcgKzExMyw3IEBACiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDE3MmNkZjAwLCAweGEzYmMsIDB4MTFkZiwgMHhhNzJmLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMLAogICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgTFZSRVZfTUVNX1VTQUdFLApAQCAtMTkyLDcgKzE5Miw4IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgICAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcil7CitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKXsKICAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlFZmZlY3Qgc3RhcnQiKTsKICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgaW5kZXggJWQiLCBpbmRleCk7CiAgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpewpAQCAtMjExLDcgKzIxMiw3IEBACiBleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICAqcEludGVyZmFjZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKICAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKQEAgLTIxOSw3ICsyMjAsNyBAQAogCiAgICAgTE9HVigiXHRcbkVmZmVjdENyZWF0ZSBzdGFydCIpOwogCi0gICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMjcwLDcgKzI3MSw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKIAogICAgICNpZmRlZiBMVk1fUENNCiAgICAgcENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTI5NSwxMCArMjk2LDEwIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKXsKLSAgICBSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSl7CisgICAgUmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKFJldmVyYkNvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgJXAiLCBpbnRlcmZhY2UpOworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSAlcCIsIGhhbmRsZSk7CiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpewogICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMzE1LDYgKzMxNiwyOCBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaW50IGk7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAorICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLworCiAvKiBsb2NhbCBmdW5jdGlvbnMgKi8KICNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDE4LDkgKzQ0MSw5IEBACiAKIAogICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSB7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CiAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDI7Ci0gICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CiAgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC02MDgsMTIgKzYzMSwxMiBAQAogCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotICAgIENIRUNLX0FSRygocENvbnRleHQtPmF1eGlsaWFyeSAmJiBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8pIHx8Ci0gICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTyk7CisgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8CisgICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogCiAgICAgaWYocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IDQ0MTAwKXsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC03MDAsMjAgKzcyMywyMCBAQAogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKLSAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9NT05POworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCi0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC04MDAsNyArODIzLDcgQEAKICAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVk1fTU9ERV9PTjsKICAgICBwYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfNDQxMDA7CiAKLSAgICBpZihwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTyl7CisgICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKXsKICAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX01PTk87CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX1NURVJFTzsKQEAgLTE4MzIsOCArMTg1NSw5IEBACiB9IC8vIG5hbWVzcGFjZQogfSAvLyBuYW1lc3BhY2UKIAorZXh0ZXJuICJDIiB7CiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IFByb2Nlc3MgKi8KLWV4dGVybiAiQyIgaW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCAgIHNlbGYsCitpbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKICAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOwpAQCAtMTg2OCw3ICsxODkyLDcgQEAKIH0gICAvKiBlbmQgUmV2ZXJiX3Byb2Nlc3MgKi8KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCi1leHRlcm4gIkMiIGludCBSZXZlcmJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3QgIHNlbGYsCitpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCkBAIC0yMDc1LDkgKzIwOTksNTQgQEAKICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIFJldmVyYl9jb21tYW5kICovCiAKLS8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFJldmVyYiBlZmZlY3QKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KK2ludCBSZXZlcmJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCit7CisgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKilzZWxmOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIlJldmVyYl9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworICAgICAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0F1eEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0luc2VydEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgUmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewogICAgIFJldmVyYl9wcm9jZXNzLAotICAgIFJldmVyYl9jb21tYW5kCisgICAgUmV2ZXJiX2NvbW1hbmQsCisgICAgUmV2ZXJiX2dldERlc2NyaXB0b3IKIH07ICAgIC8qIGVuZCBnUmV2ZXJiSW50ZXJmYWNlICovCiAKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICBuYW1lIDogIlJldmVyYiBMaWJyYXJ5IiwKKyAgICBpbXBsZW1lbnRvciA6ICJOWFAgU29mdHdhcmUgTHRkLiIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMsCisgICAgcXVlcnlfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UXVlcnlFZmZlY3QsCisgICAgY3JlYXRlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgZ2V0X2Rlc2NyaXB0b3IgOiBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorfTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KaW5kZXggOWJhNzFlZC4uOThkNDc3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0yNSw3ICsyNSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCkBAIC02MCw3ICs2MCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaAppbmRleCBkOTNlYmU5Li40MWYxODEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Gb3JtYXRBZGFwdGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgQVVESU9GT1JNQVRBREFQVEVSX0hfCiAjZGVmaW5lIEFVRElPRk9STUFUQURBUFRFUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKIAogI2RlZmluZSBtaW4oeCx5KSAoKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkpCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzID4gMCkgewogICAgICAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlc0l0ZXIgPSBtaW4obnVtU2FtcGxlcywgbU1heFNhbXBsZXNQZXJDYWxsKTsKICAgICAgICAgICAgIHVpbnQzMl90IG5TYW1wbGVzQ2hhbm5lbHMgPSBudW1TYW1wbGVzSXRlciAqIG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0KSB7CisgICAgICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewogICAgICAgICAgICAgICAgICAgICBtcFByb2Nlc3Nvci0+cHJvY2VzcygKICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYXVkaW9fc2FtcGxlX3QgKj4gKHBJbiksCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAvLyAgICAgICAgICAgICAgc2FtcGxlLgogICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KICAgICB2b2lkIENvbnZlcnRJbnB1dChjb25zdCB2b2lkIComIHBJbiwgdWludDMyX3QgbnVtU2FtcGxlcykgewotICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHsKKyAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBwSW4xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihwSW4pOwogICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBwT3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIHdoaWxlIChudW1TYW1wbGVzLS0gPiAwKSB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAvLyAgICAgICAgICAgICAgV2hlbiBmdW5jdGlvbiBleGlzdCB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IG91dHB1dCBzYW1wbGUuCiAgICAgLy8gbnVtU2FtcGxlcyAgIFRoZSBudW1iZXIgb2Ygc2luZ2xlLWNoYW5uZWwgc2FtcGxlcyB0byBwcm9jZXNzLgogICAgIHZvaWQgQ29udmVydE91dHB1dCh2b2lkIComIHBPdXQsIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19zYW1wbGVfdCAqIHBJbiA9IG1CdWZmZXI7CiAgICAgICAgICAgICBpbnQxNl90ICogcE91dDE2ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHBPdXQpOwogICAgICAgICAgICAgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCmluZGV4IGY4ZTQzNTcuLjQzZGZhODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJBdWRpb0Zvcm1hdEFkYXB0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaD4KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdFcXVhbGl6ZXJJbnRlcmZhY2U7CiAKIGVudW0gZXF1YWxpemVyX3N0YXRlX2UgewpAQCAtNDQsMTIgKzQ0LDEyIEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQogICAgICAgICB7MHhlMjVhYTg0MCwgMHg1NDNiLCAweDExZGYsIDB4OThhNSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCksCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMSwKICAgICAgICAgIkdyYXBoaWMgRXF1YWxpemVyIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIiwKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLyBCRUdJTiBFUSBQUkVTRVRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTEyNyw3ICsxMjcsOCBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewogICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTEzOSwxNSArMTQwLDE1IEBACiB9IC8qIGVuZCBFZmZlY3RRdWVyeU5leHQgKi8KIAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwogCiAgICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTY4LDE5ICsxNjksMjAgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpcENvbnRleHQ7CisgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KXBDb250ZXh0OwogICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKIAotICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCwgc2l6ZSAlZCIsIHBDb250ZXh0LCBBdWRpb0VxdWFsaXplcjo6R2V0SW5zdGFuY2VTaXplKGtOdW1CYW5kcykrc2l6ZW9mKEVxdWFsaXplckNvbnRleHQpKTsKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLAorICAgICAgICAgcENvbnRleHQsIEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoa051bUJhbmRzKStzaXplb2YoRXF1YWxpemVyQ29udGV4dCkpOwogCiAgICAgcmV0dXJuIDA7CiAKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpIHsKLSAgICBFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoRXF1YWxpemVyQ29udGV4dCAqKWludGVyZmFjZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIEVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChFcXVhbGl6ZXJDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGludGVyZmFjZSk7CisgICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGhhbmRsZSk7CiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTkyLDYgKzE5NCwyMiBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnRXF1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuICAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLworCiAKIC8vCiAvLy0tLSBsb2NhbCBmdW5jdGlvbnMKQEAgLTIyOCwxNCArMjQ2LDE1IEBACiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotICAgIENIRUNLX0FSRygocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9NT05PKSB8fCAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcoKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8CisgICAgICAgICAgICAgIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TN18yNAotICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKIAogICAgIGludCBjaGFubmVsQ291bnQ7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgeworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CiAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY2hhbm5lbENvdW50ID0gMjsKQEAgLTI4MSwxNiArMzAwLDE2IEBACiAgICAgfQogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC00MDIsNyArNDIxLDggQEAKICAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgogICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAtOTYwMDsKICAgICAgICAgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpID0gNDgwMDsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLAorICAgICAgICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CkBAIC00MTIsNyArNDMyLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IChpbnQxNl90KXBFcXVhbGl6ZXItPmdldEdhaW4ocGFyYW0yKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwKKyAgICAgICAgICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKQEAgLTQyMiw3ICs0NDMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcEVxdWFsaXplci0+Z2V0RnJlcXVlbmN5KHBhcmFtMik7Ci0gICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKQEAgLTQzMiwxMyArNDU0LDE1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBwRXF1YWxpemVyLT5nZXRCYW5kUmFuZ2UocGFyYW0yLCAqKHVpbnQzMl90ICopcFZhbHVlLCAqKCh1aW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOgogICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOwogICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KXBFcXVhbGl6ZXItPmdldE1vc3RSZWxldmFudEJhbmQocGFyYW0yKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsCisgICAgICAgICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKQEAgLTQ2MSw3ICs0ODUsOCBAQAogICAgICAgICBzdHJuY3B5KG5hbWUsIHBFcXVhbGl6ZXItPmdldFByZXNldE5hbWUocGFyYW0yKSwgKnBWYWx1ZVNpemUgLSAxKTsKICAgICAgICAgbmFtZVsqcFZhbHVlU2l6ZSAtIDFdID0gMDsKICAgICAgICAgKnBWYWx1ZVNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLCBwYXJhbTIsIGdFcXVhbGl6ZXJQcmVzZXRzW3BhcmFtMl0ubmFtZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgZ0VxdWFsaXplclByZXNldHNbcGFyYW0yXS5uYW1lLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CkBAIC01NzEsNyArNTk2LDcgQEAKIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KIAotZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKK2V4dGVybiAiQyIgaW50IEVxdWFsaXplcl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKIApAQCAtNTk2LDcgKzYyMSw3IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLy8gZW5kIEVxdWFsaXplcl9wcm9jZXNzCiAKLWV4dGVybiAiQyIgaW50IEVxdWFsaXplcl9jb21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CiAKICAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOwpAQCAtNjQ3LDcgKzY3Miw4IEBACiAKICAgICAgICAgfSBicmVhazsKICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7Ci0gICAgICAgIExPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAorICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CiAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNjkwLDEwICs3MTYsMzcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsICZhbmRyb2lkOjpnRXF1YWxpemVyRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfQorCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlcXVhbGl6ZXIgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdFcXVhbGl6ZXJJbnRlcmZhY2UgPSB7CiAgICAgICAgIEVxdWFsaXplcl9wcm9jZXNzLAotICAgICAgICBFcXVhbGl6ZXJfY29tbWFuZAorICAgICAgICBFcXVhbGl6ZXJfY29tbWFuZCwKKyAgICAgICAgRXF1YWxpemVyX2dldERlc2NyaXB0b3IKIH07CiAKIAorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICB0YWcgOiBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgdmVyc2lvbiA6IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgIG5hbWUgOiAiVGVzdCBFcXVhbGl6ZXIgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMsCisgICAgcXVlcnlfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UXVlcnlFZmZlY3QsCisgICAgY3JlYXRlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgZ2V0X2Rlc2NyaXB0b3IgOiBhbmRyb2lkOjpFZmZlY3RHZXREZXNjcmlwdG9yLAorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IDNlYjhiMmMuLjAyNzYyYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtMjMsNTkgKzIzLDYwIEBACiAjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCiAjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiIGVmZmVjdAorLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0gewogICAgICAgICBSZXZlcmJfUHJvY2VzcywKLSAgICAgICAgUmV2ZXJiX0NvbW1hbmQKKyAgICAgICAgUmV2ZXJiX0NvbW1hbmQsCisgICAgICAgIFJldmVyYl9HZXREZXNjcmlwdG9yCiB9OwogCiAvLyBHb29nbGUgYXV4aWxpYXJ5IGVudmlyb25tZW50YWwgcmV2ZXJiIFVVSUQ6IDFmMGFlMmUwLTRlZjctMTFkZi1iYzA5LTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAogICAgICAgICB7MHgxZjBhZTJlMCwgMHg0ZWY3LCAweDExZGYsIDB4YmMwOSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgLy8gZmxhZ3Mgb3RoZXIgdGhhbiBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSBzZXQgZm9yIHRlc3QgcHVycG9zZQogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkF1eCBFbnZpcm9ubWVudGFsIFJldmVyYiIsCi0gICAgICAgICJHb29nbGUgSW5jLiIKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCiB9OwogCiAvLyBHb29nbGUgaW5zZXJ0IGVudmlyb25tZW50YWwgcmV2ZXJiIFVVSUQ6IGFhNDc2MDQwLTYzNDItMTFkZi05MWE0LTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAogICAgICAgICB7MHhhYTQ3NjA0MCwgMHg2MzQyLCAweDExZGYsIDB4OTFhNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMzMsCiAgICAgICAgICJJbnNlcnQgRW52aXJvbm1lbnRhbCByZXZlcmIiLAotICAgICAgICAiR29vZ2xlIEluYy4iCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgogfTsKIAogLy8gR29vZ2xlIGF1eGlsaWFyeSBwcmVzZXQgcmV2ZXJiIFVVSUQ6IDYzOTA5MzIwLTUzYTYtMTFkZi1iZGJkLTAwMDJhNWQ1YzUxYgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHg2MzkwOTMyMCwgMHg1M2E2LCAweDExZGYsIDB4YmRiZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCiAgICAgICAgIDAsIC8vIFRPRE8KICAgICAgICAgMzMsCiAgICAgICAgICJBdXggUHJlc2V0IFJldmVyYiIsCi0gICAgICAgICJHb29nbGUgSW5jLiIKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCiB9OwogCiAvLyBHb29nbGUgaW5zZXJ0IHByZXNldCByZXZlcmIgVVVJRDogZDkzZGM2YTAtNjM0Mi0xMWRmLWIxMjgtMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweGQ5M2RjNmEwLCAweDYzNDIsIDB4MTFkZiwgMHhiMTI4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkluc2VydCBQcmVzZXQgUmV2ZXJiIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIgorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKIH07CiAKIC8vIGdEZXNjcmlwdG9ycyBjb250YWlucyBwb2ludGVycyB0byBhbGwgZGVmaW5lZCBlZmZlY3QgZGVzY3JpcHRvciBpbiB0aGlzIGxpYnJhcnkKQEAgLTExMiw3ICsxMTMsNyBAQAogaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKICAgICAgICAgaW50MzJfdCBpb0lkLAotICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpIHsKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKICAgICByZXZlcmJfbW9kdWxlX3QgKm1vZHVsZTsKQEAgLTEyMiw3ICsxMjMsNyBAQAogCiAgICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTU3LDcgKzE1OCw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KSBtb2R1bGU7CisgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KSBtb2R1bGU7CiAKICAgICBtb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOwogCkBAIC0xNjYsMTEgKzE2NywxMSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7Ci0gICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKWludGVyZmFjZTsKK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopaGFuZGxlOwogCi0gICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGludGVyZmFjZSk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGhhbmRsZSk7CisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTgwLDEwICsxODEsMzEgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IEVmZmVjdEdldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaW50IGk7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAorICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUlOVkFMOworfSAvKiBlbmQgRWZmZWN0R2V0RGVzY3JpcHRvciAqLwogCiAvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAotc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CitzdGF0aWMgaW50IFJldmVyYl9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKICAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CiAgICAgaW50MTZfdCAqcFNyYywgKnBEc3Q7CiAgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKXNlbGY7CkBAIC0yNzAsNyArMjkyLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorc3RhdGljIGludCBSZXZlcmJfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKICAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopIHNlbGY7CiAgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiOwpAQCAtMzgzLDYgKzQwNSwzOCBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgUmV2ZXJiX0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKikgc2VsZjsKKyAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKworICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBSZXZlcmIgPSAocmV2ZXJiX29iamVjdF90KikgJnBSdmJNb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocFJldmVyYi0+bV9BdXgpIHsKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CisgICAgICAgICAgICBkZXNjID0gJmdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzYyA9ICZnQXV4RW52UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwUmV2ZXJiLT5tX1ByZXNldCkgeworICAgICAgICAgICAgZGVzYyA9ICZnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2MgPSAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBSZXZlcmIgaW50ZXJuYWwgZnVuY3Rpb25zCkBAIC00MTgsMTkgKzQ3MiwxOSBAQAogCiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIGlmIChhdXgpIHsKLSAgICAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQotICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNDc0LDEzICs1MjgsMTMgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlCiAgICAgICAgICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUKICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzICE9IE9VVFBVVF9DSEFOTkVMUwotICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1Ci0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgIExPR1YoIlJldmVyYl9Db25maWd1cmUgaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIGlmICgocFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfTU9OTykpIHx8Ci0gICAgICAgICghcFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfU1RFUkVPKSkpIHsKKyAgICBpZiAoKHBSZXZlcmItPm1fQXV4ICYmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSkgfHwKKyAgICAgICAgKCFwUmV2ZXJiLT5tX0F1eCAmJiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkpIHsKICAgICAgICAgTE9HVigiUmV2ZXJiX0NvbmZpZ3VyZSBpbnZhbGlkIGNvbmZpZyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yMTMzLDMgKzIxODcsMTUgQEAKIAogICAgIHJldHVybiAwOwogfQorCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAubmFtZSA9ICJUZXN0IEVxdWFsaXplciBMaWJyYXJ5IiwKKyAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgLnF1ZXJ5X251bV9lZmZlY3RzID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzLAorICAgIC5xdWVyeV9lZmZlY3QgPSBFZmZlY3RRdWVyeUVmZmVjdCwKKyAgICAuY3JlYXRlX2VmZmVjdCA9IEVmZmVjdENyZWF0ZSwKKyAgICAucmVsZWFzZV9lZmZlY3QgPSBFZmZlY3RSZWxlYXNlLAorICAgIC5nZXRfZGVzY3JpcHRvciA9IEVmZmVjdEdldERlc2NyaXB0b3IsCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKaW5kZXggZGJjZDE5Mi4uYTIzOTgxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIAogI2RlZmluZSBOVU1fT1VUUFVUX0NIQU5ORUxTIDIKLSNkZWZpbmUgT1VUUFVUX0NIQU5ORUxTIENIQU5ORUxfU1RFUkVPCisjZGVmaW5lIE9VVFBVVF9DSEFOTkVMUyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KIAogI2RlZmluZSBSRVZFUkJfQlVGRkVSX1NJWkVfSU5fU0FNUExFU19NQVggICAxNjM4NAogCkBAIC0zMDYsMTkgKzMwNiwyMiBAQAogaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICplZmZlY3RVSUQsCiAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7Ci1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOworaW50IEVmZmVjdEdldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAotc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKK3N0YXRpYyBpbnQgUmV2ZXJiX1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcik7Ci1zdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorc3RhdGljIGludCBSZXZlcmJfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOwotCitzdGF0aWMgaW50IFJldmVyYl9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIGludGVybmFsIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCBlNmZmNjU0Li4zYTBmNDM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsNiBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggYzk1N2RiYS4uODBkMWY2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjMsMjEgKzIzLDIyIEBACiAjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAotZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdWaXN1YWxpemVySW50ZXJmYWNlOworZXh0ZXJuICJDIiB7CisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CitleHRlcm4gY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZTsKIAogLy8gR29vZ2xlIFZpc3VhbGl6ZXIgVVVJRDogZDA2OWQ5ZTAtODMyOS0xMWRmLTkxNjgtMDAwMmE1ZDVjNTFiCiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXN1YWxpemVyRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHR5cGUKICAgICAgICAgezB4ZDA2OWQ5ZTAsIDB4ODMyOSwgMHgxMWRmLCAweDkxNjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAxLAogICAgICAgICAiVmlzdWFsaXplciIsCi0gICAgICAgICJHb29nbGUgSW5jLiIsCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKIH07CiAKIGVudW0gdmlzdWFsaXplcl9zdGF0ZV9lIHsKQEAgLTkwLDEwICs5MSwxMCBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgbWVtY3B5KCZwQ29udGV4dC0+bUNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogCkBAIC0xMTgsMTYgKzExOSwxNiBAQAogaW50IFZpc3VhbGl6ZXJfaW5pdChWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQpCiB7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0xNDUsMTIgKzE0NiwxMyBAQAogLy8tLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CitpbnQgVmlzdWFsaXplckxpYl9RdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CiAgICAgKnBOdW1FZmZlY3RzID0gMTsKICAgICByZXR1cm4gMDsKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CitpbnQgVmlzdWFsaXplckxpYl9RdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CiAgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTYxLDE0ICsxNjMsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTgzLDI1ICsxODUsMjUgQEAKIAogICAgIHJldCA9IFZpc3VhbGl6ZXJfaW5pdChwQ29udGV4dCk7CiAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgTE9HVygiVmlzdWFsaXplckxpYl9DcmVhdGUoKSBpbml0IGZhaWxlZCIpOwogICAgICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKIAogICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0gICAgTE9HVigiRWZmZWN0Q3JlYXRlICVwIiwgcENvbnRleHQpOworICAgIExPR1YoIlZpc3VhbGl6ZXJMaWJfQ3JlYXRlICVwIiwgcENvbnRleHQpOwogCiAgICAgcmV0dXJuIDA7CiAKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7Ci0gICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKWludGVyZmFjZTsKK2ludCBWaXN1YWxpemVyTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJFZmZlY3RSZWxlYXNlICVwIiwgaW50ZXJmYWNlKTsKKyAgICBMT0dWKCJWaXN1YWxpemVyTGliX1JlbGVhc2UgJXAiLCBoYW5kbGUpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTIxMSw2ICsyMTMsMjIgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IFZpc3VhbGl6ZXJMaWJfR2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiVmlzdWFsaXplckxpYl9HZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdWaXN1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gIC1FSU5WQUw7Cit9IC8qIGVuZCBWaXN1YWxpemVyTGliX0dldERlc2NyaXB0b3IgKi8KKwogLy8KIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KQEAgLTIyMiwxMCArMjQwLDEwIEBACiAgICAgcmV0dXJuIHNhbXBsZTsKIH0KIAotZXh0ZXJuICJDIiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCitpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAorICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7Ci0gICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTI0NCw3ICsyNjIsNyBAQAogICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KICAgICBpbnQzMl90IHNoaWZ0ID0gMzI7CiAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbaV07CiAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQogICAgICAgICBpbnQzMl90IGNseiA9IF9fYnVpbHRpbl9jbHooc21wKTsKQEAgLTI5MywxMCArMzExLDEwIEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLy8gZW5kIFZpc3VhbGl6ZXJfcHJvY2VzcwogCi1leHRlcm4gIkMiIGludCBWaXN1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCitpbnQgVmlzdWFsaXplcl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewogCi0gICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAgICAgaW50IHJldHNpemU7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+bVN0YXRlID09IFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCkgewpAQCAtNDEyLDExICs0MzAsNDAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmlzdWFsaXplciBlZmZlY3QKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KK2ludCBWaXN1YWxpemVyX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKikgc2VsZjsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HVigiVmlzdWFsaXplcl9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnVmlzdWFsaXplckRlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgVmlzdWFsaXplcl9nZXREZXNjcmlwdG9yICovCisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdWaXN1YWxpemVySW50ZXJmYWNlID0gewogICAgICAgICBWaXN1YWxpemVyX3Byb2Nlc3MsCi0gICAgICAgIFZpc3VhbGl6ZXJfY29tbWFuZAorICAgICAgICBWaXN1YWxpemVyX2NvbW1hbmQsCisgICAgICAgIFZpc3VhbGl6ZXJfZ2V0RGVzY3JpcHRvcgogfTsKIAotfSAvLyBuYW1lc3BhY2UKIAorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICB0YWcgOiBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgdmVyc2lvbiA6IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgIG5hbWUgOiAiVmlzdWFsaXplciBMaWJyYXJ5IiwKKyAgICBpbXBsZW1lbnRvciA6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICBxdWVyeV9udW1fZWZmZWN0cyA6IFZpc3VhbGl6ZXJMaWJfUXVlcnlOdW1iZXJFZmZlY3RzLAorICAgIHF1ZXJ5X2VmZmVjdCA6IFZpc3VhbGl6ZXJMaWJfUXVlcnlFZmZlY3QsCisgICAgY3JlYXRlX2VmZmVjdCA6IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlLAorICAgIHJlbGVhc2VfZWZmZWN0IDogVmlzdWFsaXplckxpYl9SZWxlYXNlLAorICAgIGdldF9kZXNjcmlwdG9yIDogVmlzdWFsaXplckxpYl9HZXREZXNjcmlwdG9yLAorfTsKKworfTsgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggZmQ0YzZjNi4uMTIxZTM4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsMTQgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUGFyYW1ldGVyLmNwcAorTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFfaGVscGVyCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCkBAIC0zMywxMyArNDMsMTYgQEAKICAgICBJRWZmZWN0Q2xpZW50LmNwcCBcCiAgICAgQXVkaW9FZmZlY3QuY3BwIFwKICAgICBWaXN1YWxpemVyLmNwcCBcCisgICAgTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgXAogICAgIGZpeGVkZmZ0LmNwcC5hcm0KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlidWkgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmV4cGF0IFwKLSAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IGxpYmNhbWVyYV9jbGllbnQgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCiAgICAgICAgIGxpYmd1aQogCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSWSA6PSBsaWJtZWRpYV9oZWxwZXIKKwogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAogaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCBhYWRlYmE1Li44ZDk4OTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0xNzAsNyArMTcwLDYgQEAKICAgICBMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CiAKICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUiB8fCBtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKQEAgLTM5OSwyMCArMzk4LDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0dXNfdCBBdWRpb0VmZmVjdDo6bG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCi17Ci0gICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPmxvYWRFZmZlY3RMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvRWZmZWN0Ojp1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpCi17Ci0gICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPnVubG9hZEVmZmVjdExpYnJhcnkoaGFuZGxlKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNjZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUGFyYW1ldGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nID0gInJvdXRpbmciOworY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSA9ICJzYW1wbGluZ19yYXRlIjsKK2NvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQgPSAiZm9ybWF0IjsKK2NvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyA9ICJjaGFubmVscyI7Citjb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCA9ICJmcmFtZV9jb3VudCI7Citjb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UgPSAiaW5wdXRfc291cmNlIjsKKworQXVkaW9QYXJhbWV0ZXI6OkF1ZGlvUGFyYW1ldGVyKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CisgICAgY2hhciAqc3RyID0gbmV3IGNoYXJba2V5VmFsdWVQYWlycy5sZW5ndGgoKSsxXTsKKyAgICBtS2V5VmFsdWVQYWlycyA9IGtleVZhbHVlUGFpcnM7CisKKyAgICBzdHJjcHkoc3RyLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKKyAgICBjaGFyICpwYWlyID0gc3RydG9rKHN0ciwgIjsiKTsKKyAgICB3aGlsZSAocGFpciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4ocGFpcikgIT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IGVxSWR4ID0gc3RyY3NwbihwYWlyLCAiPSIpOworICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBTdHJpbmc4KHBhaXIsIGVxSWR4KTsKKyAgICAgICAgICAgIFN0cmluZzggdmFsdWU7CisgICAgICAgICAgICBpZiAoZXFJZHggPT0gc3RybGVuKHBhaXIpKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KHBhaXIgKyBlcUlkeCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA8IDApIHsKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnJlcGxhY2VWYWx1ZUZvcihrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoIkF1ZGlvUGFyYW1ldGVyKCkgY3N0b3IgZW1wdHkga2V5IHZhbHVlIHBhaXIiKTsKKyAgICAgICAgfQorICAgICAgICBwYWlyID0gc3RydG9rKE5VTEwsICI7Iik7CisgICAgfQorCisgICAgZGVsZXRlW10gc3RyOworfQorCitBdWRpb1BhcmFtZXRlcjo6fkF1ZGlvUGFyYW1ldGVyKCkKK3sKKyAgICBtUGFyYW1ldGVycy5jbGVhcigpOworfQorCitTdHJpbmc4IEF1ZGlvUGFyYW1ldGVyOjp0b1N0cmluZygpCit7CisgICAgU3RyaW5nOCBzdHIgPSBTdHJpbmc4KCIiKTsKKworICAgIHNpemVfdCBzaXplID0gbVBhcmFtZXRlcnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHN0ciArPSBtUGFyYW1ldGVycy5rZXlBdChpKTsKKyAgICAgICAgc3RyICs9ICI9IjsKKyAgICAgICAgc3RyICs9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpIDwgKHNpemUgLSAxKSkgc3RyICs9ICI7IjsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKQoreworICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPCAwKSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLnJlcGxhY2VWYWx1ZUZvcihrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBjaGFyIHN0clsxMl07CisgICAgaWYgKHNucHJpbnRmKHN0ciwgMTIsICIlZCIsIHZhbHVlKSA+IDApIHsKKyAgICAgICAgU3RyaW5nOCBzdHI4ID0gU3RyaW5nOChzdHIpOworICAgICAgICByZXR1cm4gYWRkKGtleSwgc3RyOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGZsb2F0IHZhbHVlKQoreworICAgIGNoYXIgc3RyWzIzXTsKKyAgICBpZiAoc25wcmludGYoc3RyLCAyMywgIiUuMTBmIiwgdmFsdWUpID4gMCkgeworICAgICAgICBTdHJpbmc4IHN0cjggPSBTdHJpbmc4KHN0cik7CisgICAgICAgIHJldHVybiBhZGQoa2V5LCBzdHI4KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OnJlbW92ZShjb25zdCBTdHJpbmc4JiBrZXkpCit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLnJlbW92ZUl0ZW0oa2V5KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0KGNvbnN0IFN0cmluZzgmIGtleSwgU3RyaW5nOCYgdmFsdWUpCit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7CisgICAgICAgIHZhbHVlID0gbVBhcmFtZXRlcnMudmFsdWVGb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0SW50KGNvbnN0IFN0cmluZzgmIGtleSwgaW50JiB2YWx1ZSkKK3sKKyAgICBTdHJpbmc4IHN0cjg7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaW50IHZhbDsKKyAgICAgICAgaWYgKHNzY2FuZihzdHI4LnN0cmluZygpLCAiJWQiLCAmdmFsKSA9PSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSkKK3sKKyAgICBTdHJpbmc4IHN0cjg7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZmxvYXQgdmFsOworICAgICAgICBpZiAoc3NjYW5mKHN0cjguc3RyaW5nKCksICIlZiIsICZ2YWwpID09IDEpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkKK3sKKyAgICBpZiAobVBhcmFtZXRlcnMuc2l6ZSgpID4gaW5kZXgpIHsKKyAgICAgICAga2V5ID0gbVBhcmFtZXRlcnMua2V5QXQoaW5kZXgpOworICAgICAgICB2YWx1ZSA9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGExOGJlZGIuLmE0MWQ3YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTM1LDYgKzM1LDEwIEBACiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIExJS0VMWSggZXhwICkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIHRydWUgICkpCiAjZGVmaW5lIFVOTElLRUxZKCBleHAgKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIGZhbHNlICkpCkBAIC02NSw4ICs2OSw4IEBACiAgICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgogICAgIHNpemUgPDw9IDE7CiAKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKLSAgICAgICAgc2l6ZSAvPSBjaGFubmVsQ291bnQgKiAoZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUID8gMiA6IDEpOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgc2l6ZSAvPSBjaGFubmVsQ291bnQgKiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUID8gMiA6IDEpOwogICAgIH0KIAogICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKQEAgLTg0LDcgKzg4LDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Myw3ICs5Nyw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7Ci0gICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKKyAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzZXNzaW9uSWQpOwogfQogCkBAIC0xMTcsNyArMTIxLDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMjcsNyArMTMxLDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKIHsKIAotICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVscyAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbHMsIGZyYW1lQ291bnQpOworICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVsTWFzayAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0xNDQsMjIgKzE0OCwyMiBAQAogICAgIH0KICAgICAvLyB0aGVzZSBiZWxvdyBzaG91bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZSBhdWRpb0ZsaW5nZXIgdG9vLi4uCiAgICAgaWYgKGZvcm1hdCA9PSAwKSB7Ci0gICAgICAgIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9CiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzVmFsaWRGb3JtYXQoZm9ybWF0KSkgeworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0lucHV0Q2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50IGNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjaGFubmVscyk7CisgICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KWZsYWdzKTsKICAgICBpZiAoaW5wdXQgPT0gMCkgewogICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTg2LDcgKzE5MCw3IEBACiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gb3BlblJlY29yZF9sKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAorICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGlucHV0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMDUsNyArMjA5LDcgQEAKICAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KICAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50OwogICAgIG1DaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7Ci0gICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgbUFjdGl2ZSA9IDA7CiAgICAgbUNiZiA9IGNiZjsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMjUzLDggKzI1Nyw4IEBACiAKIGludCBBdWRpb1JlY29yZDo6ZnJhbWVTaXplKCkgY29uc3QKIHsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHJldHVybiBjaGFubmVsQ291bnQoKSooKGZvcm1hdCgpID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpID8gc2l6ZW9mKHVpbnQ4X3QpIDogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm4gY2hhbm5lbENvdW50KCkqKChmb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUKSA/IHNpemVvZih1aW50OF90KSA6IHNpemVvZihpbnQxNl90KSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHNpemVvZih1aW50OF90KTsKICAgICB9CkBAIC0yOTksNyArMzAzLDcgQEAKICAgICAgICAgICAgIHJldCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgaWYgKHJldCA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spIHsKQEAgLTMxMSw5ICszMTUsOSBAQAogICAgICAgICAgICAgY2Jsay0+YnVmZmVyVGltZW91dE1zID0gTUFYX1JVTl9USU1FT1VUX01TOwogICAgICAgICAgICAgY2Jsay0+d2FpdFRpbWVNcyA9IDA7CiAgICAgICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICB0LT5ydW4oIkNsaWVudFJlY29yZFRocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICAgICAgdC0+cnVuKCJDbGllbnRSZWNvcmRUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBUSFJFQURfUFJJT1JJVFlfQVVESU9fQ0xJRU5UKTsKKyAgICAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFjdGl2ZSA9IDA7CkBAIC00MzMsOCArNDM3LDggQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9wZW5SZWNvcmRfbCgKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogCiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoZ2V0cGlkKCksIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZsYWdzKSA8PCAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKQEAgLTQ2Nyw3ICs0NzEsNyBAQAogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgbUNibGstPmJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRElSRUNUSU9OX01TSzsKKyAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElSRUNUSU9OX01TSywgJm1DYmxrLT5mbGFncyk7CiAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKICAgICBtQ2Jsay0+d2FpdFRpbWVNcyA9IDA7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTIyLDcgKzUyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gREVBRF9PQkpFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSURfT04sICZjYmxrLT5mbGFncyk7CiBjcmVhdGVfbmV3X3JlY29yZDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEF1ZGlvUmVjb3JkOjpyZXN0b3JlUmVjb3JkX2woY2Jsayk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU4NSw4ICs1ODksOCBAQAogewogICAgIG1JbnB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dChtSW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzKW1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2luX2Fjb3VzdGljc190KW1GbGFncyk7CiAgICAgcmV0dXJuIG1JbnB1dDsKIH0KIApAQCAtNzIyLDkgKzcyNiw4IEBACiAgICAgLy8gTWFuYWdlIG92ZXJydW4gY2FsbGJhY2sKICAgICBpZiAobUFjdGl2ZSAmJiAoY2Jsay0+ZnJhbWVzQXZhaWxhYmxlKCkgPT0gMCkpIHsKICAgICAgICAgTE9HVigiT3ZlcnJ1biB1c2VyOiAleCwgc2VydmVyOiAleCwgZmxhZ3MgJTA0eCIsIGNibGstPnVzZXIsIGNibGstPnNlcnZlciwgY2Jsay0+ZmxhZ3MpOwotICAgICAgICBpZiAoKGNibGstPmZsYWdzICYgQ0JMS19VTkRFUlJVTl9NU0spID09IENCTEtfVU5ERVJSVU5fT0ZGKSB7CisgICAgICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU5fT04sICZjYmxrLT5mbGFncykgJiBDQkxLX1VOREVSUlVOX01TSykpIHsKICAgICAgICAgICAgIG1DYmYoRVZFTlRfT1ZFUlJVTiwgbVVzZXJEYXRhLCAwKTsKLSAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfVU5ERVJSVU5fT047CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc0MywxMCArNzQ2LDggQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKLSAgICBpZiAoIShjYmxrLT5mbGFncyAmIENCTEtfUkVTVE9SSU5HX01TSykpIHsKKyAgICBpZiAoIShhbmRyb2lkX2F0b21pY19vcihDQkxLX1JFU1RPUklOR19PTiwgJmNibGstPmZsYWdzKSAmIENCTEtfUkVTVE9SSU5HX01TSykpIHsKICAgICAgICAgTE9HVygiZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSIpOwotCi0gICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfUkVTVE9SSU5HX09OOwogICAgICAgICAvLyBzaWduYWwgb2xkIGNibGsgY29uZGl0aW9uIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyB3YWl0aW5nIGZvciBhdmFpbGFibGUgYnVmZmVycyBzdG9wCiAgICAgICAgIC8vIHdhaXRpbmcgbm93CiAgICAgICAgIGNibGstPmN2LmJyb2FkY2FzdCgpOwpAQCAtNzU1LDcgKzc1Niw3IEBACiAgICAgICAgIC8vIGlmIHRoZSBuZXcgSUF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsIG9wZW5SZWNvcmRfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCiAgICAgICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQotICAgICAgICByZXN1bHQgPSBvcGVuUmVjb3JkX2woY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgcmVzdWx0ID0gb3BlblJlY29yZF9sKGNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBnZXRJbnB1dF9sKCkpOwogICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CkBAIC03NjUsMTAgKzc2Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBzaWduYWwgb2xkIGNibGsgY29uZGl0aW9uIGZvciBvdGhlciB0aHJlYWRzIHdhaXRpbmcgZm9yIHJlc3RvcmUgY29tcGxldGlvbgotICAgICAgICBjYmxrLT5sb2NrLmxvY2soKTsKLSAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19SRVNUT1JFRF9NU0s7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfUkVTVE9SRURfT04sICZjYmxrLT5mbGFncyk7CiAgICAgICAgIGNibGstPmN2LmJyb2FkY2FzdCgpOwotICAgICAgICBjYmxrLT5sb2NrLnVubG9jaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19SRVNUT1JFRF9NU0spKSB7CiAgICAgICAgICAgICBMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgd2FpdGluZyBmb3IgYSBuZXcgb25lIHRvIGJlIGNyZWF0ZWQiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjY5NGJhLi42Y2IzODQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yMywxMiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBzaW0gYnVpbGQgZG9lc24ndCBoYXZlIGdldHRpZAotCi0jaWZuZGVmIEhBVkVfR0VUVElECi0jIGRlZmluZSBnZXR0aWQgZ2V0cGlkCi0jZW5kaWYKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NSw3ICs0MCw3IEBACiAKIC8vIENhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBxdWVyaWVzCiB1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZSA9IDE2MDAwOwotaW50IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0ID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CitpbnQgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKIGludCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxDb3VudCA9IDE7CiBzaXplX3QgQXVkaW9TeXN0ZW06OmdJbkJ1ZmZTaXplID0gMDsKIApAQCAtMTI3LDcgKzEyMiw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoaW50IHN0cmVhbSwgZmxvYXQgdmFsdWUsIGludCBvdXRwdXQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gTlVNX1NUUkVBTV9UWVBFUykgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgYWYtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZhbHVlLCBvdXRwdXQpOwpAQCAtMTM2LDcgKzEzMSw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1NdXRlKGludCBzdHJlYW0sIGJvb2wgbXV0ZSkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBOVU1fU1RSRUFNX1RZUEVTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBhZi0+c2V0U3RyZWFtTXV0ZShzdHJlYW0sIG11dGUpOwpAQCAtMTQ1LDcgKzE0MCw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWUoaW50IHN0cmVhbSwgZmxvYXQqIHZvbHVtZSwgaW50IG91dHB1dCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBOVU1fU1RSRUFNX1RZUEVTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAqdm9sdW1lID0gYWYtPnN0cmVhbVZvbHVtZShzdHJlYW0sIG91dHB1dCk7CkBAIC0xNTQsNyArMTQ5LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFN0cmVhbU11dGUoaW50IHN0cmVhbSwgYm9vbCogbXV0ZSkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBOVU1fU1RSRUFNX1RZUEVTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAqbXV0ZSA9IGFmLT5zdHJlYW1NdXRlKHN0cmVhbSk7CkBAIC0xNjMsNyArMTU4LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1vZGUoaW50IG1vZGUpCiB7Ci0gICAgaWYgKG1vZGUgPj0gTlVNX01PREVTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtb2RlID49IEFVRElPX01PREVfQ05UKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRNb2RlKG1vZGUpOwpAQCAtMjEzLDExICsyMDgsMTEgQEAKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKIAotICAgIGlmIChzdHJlYW1UeXBlID09IERFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtVHlwZSA9IE1VU0lDOworICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQogCi0gICAgb3V0cHV0ID0gZ2V0T3V0cHV0KChzdHJlYW1fdHlwZSlzdHJlYW1UeXBlKTsKKyAgICBvdXRwdXQgPSBnZXRPdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtVHlwZSk7CiAgICAgaWYgKG91dHB1dCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0yNDYsMTEgKzI0MSwxMSBAQAogICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2M7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OwogCi0gICAgaWYgKHN0cmVhbVR5cGUgPT0gREVGQVVMVCkgewotICAgICAgICBzdHJlYW1UeXBlID0gTVVTSUM7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICB9CiAKLSAgICBvdXRwdXQgPSBnZXRPdXRwdXQoKHN0cmVhbV90eXBlKXN0cmVhbVR5cGUpOworICAgIG91dHB1dCA9IGdldE91dHB1dCgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW1UeXBlKTsKICAgICBpZiAob3V0cHV0ID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTI3NywxMSArMjcyLDExIEBACiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQ7CiAKLSAgICBpZiAoc3RyZWFtVHlwZSA9PSBERUZBVUxUKSB7Ci0gICAgICAgIHN0cmVhbVR5cGUgPSBNVVNJQzsKKyAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIG91dHB1dCA9IGdldE91dHB1dCgoc3RyZWFtX3R5cGUpc3RyZWFtVHlwZSk7CisgICAgb3V0cHV0ID0gZ2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbVR5cGUpOwogICAgIGlmIChvdXRwdXQgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMzM4LDExICszMzMsMTEgQEAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKHN0cmVhbSA9PSBERUZBVUxUKSB7Ci0gICAgICAgIHN0cmVhbSA9IE1VU0lDOworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIGdldE91dHB1dCgoc3RyZWFtX3R5cGUpc3RyZWFtKSk7CisgICAgcmV0dXJuIGFmLT5nZXRSZW5kZXJQb3NpdGlvbihoYWxGcmFtZXMsIGRzcEZyYW1lcywgZ2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkpOwogfQogCiB1bnNpZ25lZCBpbnQgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgewpAQCAtNDU1LDEwICs0NTAsMTAgQEAKIAogYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGludCBzdHJlYW1UeXBlKSB7CiAgICAgc3dpdGNoKHN0cmVhbVR5cGUpIHsKLSAgICBjYXNlIE1VU0lDOgotICAgIGNhc2UgVk9JQ0VfQ0FMTDoKLSAgICBjYXNlIEJMVUVUT09USF9TQ086Ci0gICAgY2FzZSBTWVNURU06CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDk3LDkgKzQ5Miw5IEBACiAgICAgcmV0dXJuIGdBdWRpb1BvbGljeVNlcnZpY2U7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtNTA3LDExICs1MDIsMTEgQEAKICAgICByZXR1cm4gYXBzLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwogfQogCi1BdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzIGRldmljZSwKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAKICAgICByZXR1cm4gYXBzLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7CiB9CkBAIC01MzEsMjYgKzUyNiwyNiBAQAogICAgIHJldHVybiBhcHMtPnNldFJpbmdlck1vZGUobW9kZSwgbWFzayk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRGb3JjZVVzZShmb3JjZV91c2UgdXNhZ2UsIGZvcmNlZF9jb25maWcgY29uZmlnKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAotQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgQXVkaW9TeXN0ZW06OmdldEZvcmNlVXNlKGZvcmNlX3VzZSB1c2FnZSkKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9TeXN0ZW06OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEZPUkNFX05PTkU7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgcmV0dXJuIGFwcy0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwogfQogCiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoc3RyZWFtX3R5cGUgc3RyZWFtLAorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzIGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190IGZsYWdzKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDA7CiAgICAgLy8gRG8gbm90IHVzZSBzdHJlYW0gdG8gb3V0cHV0IG1hcCBjYWNoZSBpZiB0aGUgZGlyZWN0IG91dHB1dApAQCAtNTYxLDkgKzU1Niw5IEBACiAgICAgLy8gYmUgcmV3b3JrZWQgZm9yIHByb3BlciBvcGVyYXRpb24gd2l0aCBkaXJlY3Qgb3V0cHV0cy4gVGhpcyBjb2RlIGlzIHRvbyBzcGVjaWZpYwogICAgIC8vIHRvIHRoZSBmaXJzdCB1c2UgY2FzZSB3ZSB3YW50IHRvIGNvdmVyIChWb2ljZSBSZWNvZ25pdGlvbiBhbmQgVm9pY2UgRGlhbGVyIG92ZXIKICAgICAvLyBCbHVldG9vdGggU0NPCi0gICAgaWYgKChmbGFncyAmIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpID09IDAgJiYKLSAgICAgICAgKChzdHJlYW0gIT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgJiYgc3RyZWFtICE9IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB8fAotICAgICAgICAgY2hhbm5lbHMgIT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8gfHwKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCAmJgorICAgICAgICAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHx8CisgICAgICAgICBjaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PIHx8CiAgICAgICAgICAoc2FtcGxpbmdSYXRlICE9IDgwMDAgJiYgc2FtcGxpbmdSYXRlICE9IDE2MDAwKSkpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdTdHJlYW1PdXRwdXRNYXAudmFsdWVGb3Ioc3RyZWFtKTsKQEAgLTU3Myw3ICs1NjgsNyBAQAogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgICAgICBpZiAoYXBzID09IDApIHJldHVybiAwOwogICAgICAgICBvdXRwdXQgPSBhcHMtPmdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgZmxhZ3MpOwotICAgICAgICBpZiAoKGZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnU3RyZWFtT3V0cHV0TWFwLmFkZChzdHJlYW0sIG91dHB1dCk7CiAgICAgICAgIH0KQEAgLTU4Miw3ICs1NzcsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKQEAgLTU5MSw3ICs1ODYsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtNjEwLDcgKzYwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiAwOwpAQCAtNjM4LDcgKzYzMyw3IEBACiAgICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShzdHJlYW1fdHlwZSBzdHJlYW0sCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKIHsKQEAgLTY0NywyOCArNjQyLDI4IEBACiAgICAgcmV0dXJuIGFwcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCAqaW5kZXgpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4KTsKIH0KIAotdWludDMyX3QgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiAwOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CkBAIC03MTcsMjc2ICs3MTIsNSBAQAogICAgIExPR1coIkF1ZGlvUG9saWN5U2VydmljZSBzZXJ2ZXIgZGllZCEiKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLy8gdXNlIGVtdWxhdGVkIHBvcGNvdW50IG9wdGltaXphdGlvbgotLy8gaHR0cDovL3d3dy5kZi5sdGguc2UvfmpvaG5fZS9nZW1zL2dlbTAwMmQuaHRtbAotdWludDMyX3QgQXVkaW9TeXN0ZW06OnBvcENvdW50KHVpbnQzMl90IHUpCi17Ci0gICAgdSA9ICgodSYweDU1NTU1NTU1KSArICgodT4+MSkmMHg1NTU1NTU1NSkpOwotICAgIHUgPSAoKHUmMHgzMzMzMzMzMykgKyAoKHU+PjIpJjB4MzMzMzMzMzMpKTsKLSAgICB1ID0gKCh1JjB4MGYwZjBmMGYpICsgKCh1Pj40KSYweDBmMGYwZjBmKSk7Ci0gICAgdSA9ICgodSYweDAwZmYwMGZmKSArICgodT4+OCkmMHgwMGZmMDBmZikpOwotICAgIHUgPSAoIHUmMHgwMDAwZmZmZikgKyAodT4+MTYpOwotICAgIHJldHVybiB1OwotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc091dHB1dERldmljZShhdWRpb19kZXZpY2VzIGRldmljZSkKLXsKLSAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCi0gICAgICAgICgoZGV2aWNlICYgfkF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FMTCkgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNJbnB1dERldmljZShhdWRpb19kZXZpY2VzIGRldmljZSkKLXsKLSAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCi0gICAgICAgICgoZGV2aWNlICYgfkF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQUxMKSA9PSAwKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpCi17Ci0gICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgotICAgICAgICAoZGV2aWNlICYgKEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNCbHVldG9vdGhTY29EZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpCi17Ci0gICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgotICAgICAgICAoZGV2aWNlICYgKEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfAotICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAotICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNMb3dWaXNpYmlsaXR5KHN0cmVhbV90eXBlIHN0cmVhbSkKLXsKLSAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpTWVNURU0gfHwKLSAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpOT1RJRklDQVRJT04gfHwKLSAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpSSU5HKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9TeXN0ZW06OmlzSW5wdXRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCi17Ci0gICAgaWYgKChjaGFubmVsICYgfkF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX0FMTCkgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc091dHB1dENoYW5uZWwodWludDMyX3QgY2hhbm5lbCkKLXsKLSAgICBpZiAoKGNoYW5uZWwgJiB+QXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX0FMTCkgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc1ZhbGlkRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICBzd2l0Y2ggKGZvcm1hdCAmIE1BSU5fRk9STUFUX01BU0spIHsKLSAgICBjYXNlICAgICAgICAgUENNOgotICAgIGNhc2UgICAgICAgICBNUDM6Ci0gICAgY2FzZSAgICAgICAgIEFNUl9OQjoKLSAgICBjYXNlICAgICAgICAgQU1SX1dCOgotICAgIGNhc2UgICAgICAgICBBQUM6Ci0gICAgY2FzZSAgICAgICAgIEhFX0FBQ19WMToKLSAgICBjYXNlICAgICAgICAgSEVfQUFDX1YyOgotICAgIGNhc2UgICAgICAgICBWT1JCSVM6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgICAgICAgICBQQ01fMTZfQklUOgotICAgIGNhc2UgICAgICAgICBQQ01fOF9CSVQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdWRpb1BhcmFtZXRlciBjbGFzcyBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcgPSAicm91dGluZyI7Ci1jb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlID0gInNhbXBsaW5nX3JhdGUiOwotY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCA9ICJmb3JtYXQiOwotY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzID0gImNoYW5uZWxzIjsKLWNvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50ID0gImZyYW1lX2NvdW50IjsKLWNvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSA9ICJpbnB1dF9zb3VyY2UiOwotCi1BdWRpb1BhcmFtZXRlcjo6QXVkaW9QYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBjaGFyICpzdHIgPSBuZXcgY2hhcltrZXlWYWx1ZVBhaXJzLmxlbmd0aCgpKzFdOwotICAgIG1LZXlWYWx1ZVBhaXJzID0ga2V5VmFsdWVQYWlyczsKLQotICAgIHN0cmNweShzdHIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotICAgIGNoYXIgKnBhaXIgPSBzdHJ0b2soc3RyLCAiOyIpOwotICAgIHdoaWxlIChwYWlyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihwYWlyKSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZXFJZHggPSBzdHJjc3BuKHBhaXIsICI9Iik7Ci0gICAgICAgICAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgocGFpciwgZXFJZHgpOwotICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChlcUlkeCA9PSBzdHJsZW4ocGFpcikpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZzgocGFpciArIGVxSWR4ICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpIDwgMCkgewotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMucmVwbGFjZVZhbHVlRm9yKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiQXVkaW9QYXJhbWV0ZXIoKSBjc3RvciBlbXB0eSBrZXkgdmFsdWUgcGFpciIpOwotICAgICAgICB9Ci0gICAgICAgIHBhaXIgPSBzdHJ0b2soTlVMTCwgIjsiKTsKLSAgICB9Ci0KLSAgICBkZWxldGVbXSBzdHI7Ci19Ci0KLUF1ZGlvUGFyYW1ldGVyOjp+QXVkaW9QYXJhbWV0ZXIoKQotewotICAgIG1QYXJhbWV0ZXJzLmNsZWFyKCk7Ci19Ci0KLVN0cmluZzggQXVkaW9QYXJhbWV0ZXI6OnRvU3RyaW5nKCkKLXsKLSAgICBTdHJpbmc4IHN0ciA9IFN0cmluZzgoIiIpOwotCi0gICAgc2l6ZV90IHNpemUgPSBtUGFyYW1ldGVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgc3RyICs9IG1QYXJhbWV0ZXJzLmtleUF0KGkpOwotICAgICAgICBzdHIgKz0gIj0iOwotICAgICAgICBzdHIgKz0gbVBhcmFtZXRlcnMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGkgPCAoc2l6ZSAtIDEpKSBzdHIgKz0gIjsiOwotICAgIH0KLSAgICByZXR1cm4gc3RyOwotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpCi17Ci0gICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA8IDApIHsKLSAgICAgICAgbVBhcmFtZXRlcnMuYWRkKGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVBhcmFtZXRlcnMucmVwbGFjZVZhbHVlRm9yKGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkSW50KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgaW50IHZhbHVlKQotewotICAgIGNoYXIgc3RyWzEyXTsKLSAgICBpZiAoc25wcmludGYoc3RyLCAxMiwgIiVkIiwgdmFsdWUpID4gMCkgewotICAgICAgICBTdHJpbmc4IHN0cjggPSBTdHJpbmc4KHN0cik7Ci0gICAgICAgIHJldHVybiBhZGQoa2V5LCBzdHI4KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgZmxvYXQgdmFsdWUpCi17Ci0gICAgY2hhciBzdHJbMjNdOwotICAgIGlmIChzbnByaW50ZihzdHIsIDIzLCAiJS4xMGYiLCB2YWx1ZSkgPiAwKSB7Ci0gICAgICAgIFN0cmluZzggc3RyOCA9IFN0cmluZzgoc3RyKTsKLSAgICAgICAgcmV0dXJuIGFkZChrZXksIHN0cjgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6cmVtb3ZlKGNvbnN0IFN0cmluZzgmIGtleSkKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpID49IDApIHsKLSAgICAgICAgbVBhcmFtZXRlcnMucmVtb3ZlSXRlbShrZXkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXQoY29uc3QgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpID49IDApIHsKLSAgICAgICAgdmFsdWUgPSBtUGFyYW1ldGVycy52YWx1ZUZvcihrZXkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKQotewotICAgIFN0cmluZzggc3RyODsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXQoa2V5LCBzdHI4KTsKLSAgICB2YWx1ZSA9IDA7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBpbnQgdmFsOwotICAgICAgICBpZiAoc3NjYW5mKHN0cjguc3RyaW5nKCksICIlZCIsICZ2YWwpID09IDEpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgZmxvYXQmIHZhbHVlKQotewotICAgIFN0cmluZzggc3RyODsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXQoa2V5LCBzdHI4KTsKLSAgICB2YWx1ZSA9IDA7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBmbG9hdCB2YWw7Ci0gICAgICAgIGlmIChzc2NhbmYoc3RyOC5zdHJpbmcoKSwgIiVmIiwgJnZhbCkgPT0gMSkgewotICAgICAgICAgICAgdmFsdWUgPSB2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKQotewotICAgIGlmIChtUGFyYW1ldGVycy5zaXplKCkgPiBpbmRleCkgewotICAgICAgICBrZXkgPSBtUGFyYW1ldGVycy5rZXlBdChpbmRleCk7Ci0gICAgICAgIHZhbHVlID0gbVBhcmFtZXRlcnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggOGQ4ZjY3Yi4uNmI0MzkxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTM1LDYgKzM1LDEyIEBACiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CiAKICNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKICNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKQEAgLTgxLDcgKzg3LDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtOTAsNyArOTYsNyBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogbVN0YXR1cyhOT19JTklUKQogewotICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKKyAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAwLCBmYWxzZSwgc2Vzc2lvbklkKTsKIH0KQEAgLTk5LDcgKzEwNSw3IEBACiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTA4LDcgKzExNCw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCk7CiB9CkBAIC0xMzUsNyArMTQxLDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTY0LDM5ICsxNzAsNDEgQEAKICAgICB9CiAKICAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QuCi0gICAgaWYgKHN0cmVhbVR5cGUgPT0gQXVkaW9TeXN0ZW06OkRFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtVHlwZSA9IEF1ZGlvU3lzdGVtOjpNVVNJQzsKKyAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KICAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgIHNhbXBsZVJhdGUgPSBhZlNhbXBsZVJhdGU7CiAgICAgfQogICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KICAgICBpZiAoZm9ybWF0ID09IDApIHsKLSAgICAgICAgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbHMgPT0gMCkgewotICAgICAgICBjaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU87CisgICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzVmFsaWRGb3JtYXQoZm9ybWF0KSkgeworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBmb3JjZSBkaXJlY3QgZmxhZyBpZiBmb3JtYXQgaXMgbm90IGxpbmVhciBQQ00KLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShmb3JtYXQpKSB7Ci0gICAgICAgIGZsYWdzIHw9IEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1Q7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgZmxhZ3MgfD0gQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0RJUkVDVDsKICAgICB9CiAKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc091dHB1dENoYW5uZWwoY2hhbm5lbHMpKSB7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gQXVkaW9TeXN0ZW06OnBvcENvdW50KGNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtVHlwZSwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIChBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzKWZsYWdzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOwogCiAgICAgaWYgKG91dHB1dCA9PSAwKSB7CiAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOwpAQCAtMjE0LDggKzIyMiw4IEBACiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawogICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCkBAIC0yMzcsOCArMjQ1LDggQEAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBtRm9ybWF0ID0gKHVpbnQzMl90KWZvcm1hdDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAodWludDMyX3QpY2hhbm5lbE1hc2s7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKICAgICBtU2hhcmVkQnVmZmVyID0gc2hhcmVkQnVmZmVyOwogICAgIG1NdXRlZCA9IGZhbHNlOwpAQCAtMjg5LDggKzI5Nyw4IEBACiAKIGludCBBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSBjb25zdAogewotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00obUZvcm1hdCkpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5uZWxDb3VudCgpKigoZm9ybWF0KCkgPT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkgPyBzaXplb2YodWludDhfdCkgOiBzaXplb2YoaW50MTZfdCkpOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsQ291bnQoKSooKGZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpID8gc2l6ZW9mKHVpbnQ4X3QpIDogc2l6ZW9mKGludDE2X3QpKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gc2l6ZW9mKHVpbnQ4X3QpOwogICAgIH0KQEAgLTMyOSwyMyArMzM3LDIzIEBACiAgICAgaWYgKG1BY3RpdmUgPT0gMCkgewogICAgICAgICBtQWN0aXZlID0gMTsKICAgICAgICAgbU5ld1Bvc2l0aW9uID0gY2Jsay0+c2VydmVyICsgbVVwZGF0ZVBlcmlvZDsKKyAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgIGNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVM7CiAgICAgICAgIGNibGstPndhaXRUaW1lTXMgPSAwOwotICAgICAgICBjYmxrLT5mbGFncyAmPSB+Q0JMS19ESVNBQkxFRF9PTjsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9CiAKICAgICAgICAgTE9HVigic3RhcnQgJXAgYmVmb3JlIGxvY2sgY2JsayAlcCIsIHRoaXMsIG1DYmxrKTsKLSAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKICAgICAgICAgICAgIGNibGstPmxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spIHsKQEAgLTU0NiwxMiArNTU0LDEzIEBACiAgICAgfQogCiAgICAgaWYgKGxvb3BTdGFydCA+PSBsb29wRW5kIHx8Ci0gICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPiBjYmxrLT5mcmFtZUNvdW50KSB7CisgICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPiBjYmxrLT5mcmFtZUNvdW50IHx8CisgICAgICAgIGNibGstPnNlcnZlciA+IGxvb3BTdGFydCkgewogICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3BTdGFydCAlZCwgbG9vcEVuZCAlZCwgbG9vcENvdW50ICVkLCBmcmFtZWNvdW50ICVkLCB1c2VyICVkIiwgbG9vcFN0YXJ0LCBsb29wRW5kLCBsb29wQ291bnQsIGNibGstPmZyYW1lQ291bnQsIGNibGstPnVzZXIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSAmJiAobG9vcEVuZCAgID4gY2Jsay0+ZnJhbWVDb3VudCkpIHsKKyAgICBpZiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgJiYgKGxvb3BFbmQgPiBjYmxrLT5mcmFtZUNvdW50KSkgewogICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3AgbWFya2VycyBiZXlvbmQgZGF0YTogbG9vcFN0YXJ0ICVkLCBsb29wRW5kICVkLCBmcmFtZWNvdW50ICVkIiwKICAgICAgICAgICAgIGxvb3BTdGFydCwgbG9vcEVuZCwgY2Jsay0+ZnJhbWVDb3VudCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC02MzUsNyArNjQ0LDcgQEAKICAgICBpZiAocG9zaXRpb24gPiBtQ2Jsay0+dXNlcikgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIG1DYmxrLT5zZXJ2ZXIgPSBwb3NpdGlvbjsKLSAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19GT1JDRVJFQURZX09OOworICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRk9SQ0VSRUFEWV9PTiwgJm1DYmxrLT5mbGFncyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02NzEsOCArNjgwLDggQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQogewotICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxzLCAoQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyltRmxhZ3MpOworICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOwogfQogCiBpbnQgQXVkaW9UcmFjazo6Z2V0U2Vzc2lvbklkKCkKQEAgLTY5Niw4ICs3MDUsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTcyNSw3ICs3MzQsNyBAQAogICAgIH0KIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfQpAQCAtNzU4LDYgKzc2Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbGNvdW50CisgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKCgodWludDMyX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoY2hhbm5lbENvdW50IHwgMSkpICE9IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbmVtZW50OiBhZGRyZXNzICVwLCBjaGFubmVsQ291bnQgJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgY2hhbm5lbENvdW50KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNzcwLDcgKzc4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLApAQCAtNzkyLDcgKzgwMiw3IEBACiAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICBtQ2Jsa01lbW9yeSA9IGNibGs7CiAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwotICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX0RJUkVDVElPTl9PVVQ7CisgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19ESVJFQ1RJT05fT1VULCAmbUNibGstPmZsYWdzKTsKICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbUNibGstPmJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewpAQCAtODI1LDYgKzgzNSwxMiBAQAogCiAgICAgdWludDMyX3QgZnJhbWVzQXZhaWwgPSBjYmxrLT5mcmFtZXNBdmFpbGFibGUoKTsKIAorICAgIGNibGstPmxvY2subG9jaygpOworICAgIGlmIChjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spIHsKKyAgICAgICAgZ290byBjcmVhdGVfbmV3X3RyYWNrOworICAgIH0KKyAgICBjYmxrLT5sb2NrLnVubG9jaygpOworCiAgICAgaWYgKGZyYW1lc0F2YWlsID09IDApIHsKICAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgIGdvdG8gc3RhcnRfbG9vcF9oZXJlOwpAQCAtODY2LDcgKzg4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogY3JlYXRlX25ld190cmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN0b3JlVHJhY2tfbChjYmxrLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC04OTMsNyArOTA5LDcgQEAKIAogICAgIC8vIHJlc3RhcnQgdHJhY2sgaWYgaXQgd2FzIGRpc2FibGVkIGJ5IGF1ZGlvZmxpbmdlciBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4KICAgICBpZiAobUFjdGl2ZSAmJiAoY2Jsay0+ZmxhZ3MgJiBDQkxLX0RJU0FCTEVEX01TSykpIHsKLSAgICAgICAgY2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRElTQUJMRURfT047CisgICAgICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRF9PTiwgJmNibGstPmZsYWdzKTsKICAgICAgICAgTE9HVygib2J0YWluQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQsIHJlc3RhcnRpbmciLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgfQpAQCAtOTE1LDggKzkzMSw4IEBACiAgICAgYXVkaW9CdWZmZXItPmNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CiAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CiAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBmcmFtZXNSZXEgKiBjYmxrLT5mcmFtZVNpemU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgewotICAgICAgICBhdWRpb0J1ZmZlci0+Zm9ybWF0ID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgYXVkaW9CdWZmZXItPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5mb3JtYXQgPSBtRm9ybWF0OwogICAgIH0KQEAgLTk1Nyw5ICs5NzMsMTAgQEAKICAgICBzc2l6ZV90IHdyaXR0ZW4gPSAwOwogICAgIGNvbnN0IGludDhfdCAqc3JjID0gKGNvbnN0IGludDhfdCAqKWJ1ZmZlcjsKICAgICBCdWZmZXIgYXVkaW9CdWZmZXI7CisgICAgc2l6ZV90IGZyYW1lU3ogPSAoc2l6ZV90KWZyYW1lU2l6ZSgpOwogCiAgICAgZG8gewotICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUvZnJhbWVTaXplKCk7CisgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSB1c2VyU2l6ZS9mcmFtZVN6OwogCiAgICAgICAgIC8vIENhbGxpbmcgb2J0YWluQnVmZmVyKCkgd2l0aCBhIG5lZ2F0aXZlIHdhaXQgY291bnQgY2F1c2VzCiAgICAgICAgIC8vIGFuIChhbG1vc3QpIGluZmluaXRlIHdhaXQgdGltZS4KQEAgLTk3Myw3ICs5OTAsNyBAQAogCiAgICAgICAgIHNpemVfdCB0b1dyaXRlOwogCi0gICAgICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQgJiYgIShtRmxhZ3MgJiBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfRElSRUNUKSkgeworICAgICAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmICEobUZsYWdzICYgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0RJUkVDVCkpIHsKICAgICAgICAgICAgIC8vIERpdmlkZSBjYXBhY2l0eSBieSAyIHRvIHRha2UgZXhwYW5zaW9uIGludG8gYWNjb3VudAogICAgICAgICAgICAgdG9Xcml0ZSA9IGF1ZGlvQnVmZmVyLnNpemU+PjE7CiAgICAgICAgICAgICAvLyA4IHRvIDE2IGJpdCBjb252ZXJzaW9uCkBAIC05OTEsNyArMTAwOCw3IEBACiAgICAgICAgIHdyaXR0ZW4gKz0gdG9Xcml0ZTsKIAogICAgICAgICByZWxlYXNlQnVmZmVyKCZhdWRpb0J1ZmZlcik7Ci0gICAgfSB3aGlsZSAodXNlclNpemUpOworICAgIH0gd2hpbGUgKHVzZXJTaXplID49IGZyYW1lU3opOwogCiAgICAgcmV0dXJuIHdyaXR0ZW47CiB9CkBAIC0xMDEzLDE0ICsxMDMwLDEzIEBACiAgICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBNYW5hZ2UgdW5kZXJydW4gY2FsbGJhY2sKLSAgICBpZiAobUFjdGl2ZSAmJiAoY2Jsay0+ZnJhbWVzUmVhZHkoKSA9PSAwKSkgeworICAgIGlmIChtQWN0aXZlICYmIChjYmxrLT5mcmFtZXNBdmFpbGFibGUoKSA9PSBjYmxrLT5mcmFtZUNvdW50KSkgewogICAgICAgICBMT0dWKCJVbmRlcnJ1biB1c2VyOiAleCwgc2VydmVyOiAleCwgZmxhZ3MgJTA0eCIsIGNibGstPnVzZXIsIGNibGstPnNlcnZlciwgY2Jsay0+ZmxhZ3MpOwotICAgICAgICBpZiAoKGNibGstPmZsYWdzICYgQ0JMS19VTkRFUlJVTl9NU0spID09IENCTEtfVU5ERVJSVU5fT0ZGKSB7CisgICAgICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU5fT04sICZjYmxrLT5mbGFncykgJiBDQkxLX1VOREVSUlVOX01TSykpIHsKICAgICAgICAgICAgIG1DYmYoRVZFTlRfVU5ERVJSVU4sIG1Vc2VyRGF0YSwgMCk7CiAgICAgICAgICAgICBpZiAoY2Jsay0+c2VydmVyID09IGNibGstPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICBtQ2JmKEVWRU5UX0JVRkZFUl9FTkQsIG1Vc2VyRGF0YSwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX1VOREVSUlVOX09OOwogICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3Nyw3ICsxMDkzLDcgQEAKICAgICAgICAgLy8gRGl2aWRlIGJ1ZmZlciBzaXplIGJ5IDIgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGV4cGFuc2lvbgogICAgICAgICAvLyBkdWUgdG8gOCB0byAxNiBiaXQgY29udmVyc2lvbjogdGhlIGNhbGxiYWNrIG11c3QgZmlsbCBvbmx5IGhhbGYKICAgICAgICAgLy8gb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICAgICAgICBpZiAobUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUICYmICEobUZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCAmJiAhKG1GbGFncyAmIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1QpKSB7CiAgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplID4+PSAxOwogICAgICAgICB9CiAKQEAgLTEwOTYsNyArMTExMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgd3JpdHRlblNpemUgPSByZXFTaXplOwogCi0gICAgICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQgJiYgIShtRmxhZ3MgJiBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfRElSRUNUKSkgeworICAgICAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmICEobUZsYWdzICYgQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0RJUkVDVCkpIHsKICAgICAgICAgICAgIC8vIDggdG8gMTYgYml0IGNvbnZlcnNpb24KICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqc3JjID0gYXVkaW9CdWZmZXIuaTggKyB3cml0dGVuU2l6ZS0xOwogICAgICAgICAgICAgaW50IGNvdW50ID0gd3JpdHRlblNpemU7CkBAIC0xMTM0LDExICsxMTUwLDEwIEBACiB7CiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCi0gICAgaWYgKCEoY2Jsay0+ZmxhZ3MgJiBDQkxLX1JFU1RPUklOR19NU0spKSB7CisgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19SRVNUT1JJTkdfT04sICZjYmxrLT5mbGFncykgJiBDQkxLX1JFU1RPUklOR19NU0spKSB7CiAgICAgICAgIExPR1coImRlYWQgSUF1ZGlvVHJhY2ssIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzIiwKICAgICAgICAgICAgICBmcm9tU3RhcnQgPyAic3RhcnQoKSIgOiAib2J0YWluQnVmZmVyKCkiKTsKIAotICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX1JFU1RPUklOR19PTjsKICAgICAgICAgLy8gc2lnbmFsIG9sZCBjYmxrIGNvbmRpdGlvbiBzbyB0aGF0IG90aGVyIHRocmVhZHMgd2FpdGluZyBmb3IgYXZhaWxhYmxlIGJ1ZmZlcnMgc3RvcAogICAgICAgICAvLyB3YWl0aW5nIG5vdwogICAgICAgICBjYmxrLT5jdi5icm9hZGNhc3QoKTsKQEAgLTExNTAsNyArMTE2NSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2wobVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLApAQCAtMTE1OCwxMCArMTE3MywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIAogICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyByZXN0b3JlIHdyaXRlIGluZGV4IGFuZCBzZXQgb3RoZXIgaW5kZXhlcyB0byByZWZsZWN0IGVtcHR5IGJ1ZmZlciBzdGF0dXMKKyAgICAgICAgICAgIG1DYmxrLT51c2VyID0gY2Jsay0+dXNlcjsKKyAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXIgPSBjYmxrLT51c2VyOworICAgICAgICAgICAgbUNibGstPnVzZXJCYXNlID0gY2Jsay0+dXNlcjsKKyAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXJCYXNlID0gY2Jsay0+dXNlcjsKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgbG9vcDogdGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGlmIG5ldyBmcmFtZSBjb3VudCBpcyBub3QKKyAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCBsb29wIGxlbmd0aAorICAgICAgICAgICAgc2V0TG9vcF9sKGNibGstPmxvb3BTdGFydCwgY2Jsay0+bG9vcEVuZCwgY2Jsay0+bG9vcENvdW50KTsKICAgICAgICAgICAgIGlmICghZnJvbVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOworICAgICAgICAgICAgaWYgKG1BY3RpdmUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmcm9tU3RhcnQgJiYgcmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbU5ld1Bvc2l0aW9uID0gbUNibGstPnNlcnZlciArIG1VcGRhdGVQZXJpb2Q7CiAgICAgICAgICAgICB9CkBAIC0xMTcxLDEwICsxMTk2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHNpZ25hbCBvbGQgY2JsayBjb25kaXRpb24gZm9yIG90aGVyIHRocmVhZHMgd2FpdGluZyBmb3IgcmVzdG9yZSBjb21wbGV0aW9uCi0gICAgICAgIGNibGstPmxvY2subG9jaygpOwotICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX1JFU1RPUkVEX01TSzsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19SRVNUT1JFRF9PTiwgJmNibGstPmZsYWdzKTsKICAgICAgICAgY2Jsay0+Y3YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIGNibGstPmxvY2sudW5sb2NrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCEoY2Jsay0+ZmxhZ3MgJiBDQkxLX1JFU1RPUkVEX01TSykpIHsKICAgICAgICAgICAgIExPR1coImRlYWQgSUF1ZGlvVHJhY2ssIHdhaXRpbmcgZm9yIGEgbmV3IG9uZSIpOwpAQCAtMTI0OCwxMSArMTI3MSwxMiBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKwogYXVkaW9fdHJhY2tfY2Jsa190OjphdWRpb190cmFja19jYmxrX3QoKQogICAgIDogbG9jayhNdXRleDo6U0hBUkVEKSwgY3YoQ29uZGl0aW9uOjpTSEFSRUQpLCB1c2VyKDApLCBzZXJ2ZXIoMCksCiAgICAgdXNlckJhc2UoMCksIHNlcnZlckJhc2UoMCksIGJ1ZmZlcnMoMCksIGZyYW1lQ291bnQoMCksCiAgICAgbG9vcFN0YXJ0KFVJTlRfTUFYKSwgbG9vcEVuZChVSU5UX01BWCksIGxvb3BDb3VudCgwKSwgdm9sdW1lTFIoMCksCi0gICAgZmxhZ3MoMCksIHNlbmRMZXZlbCgwKQorICAgIHNlbmRMZXZlbCgwKSwgZmxhZ3MoMCkKIHsKIH0KIApAQCAtMTI3OSwyNSArMTMwMywxNyBAQAogICAgIHRoaXMtPnVzZXIgPSB1OwogCiAgICAgLy8gQ2xlYXIgZmxvdyBjb250cm9sIGVycm9yIGNvbmRpdGlvbiBhcyBuZXcgZGF0YSBoYXMgYmVlbiB3cml0dGVuL3JlYWQgdG8vZnJvbSBidWZmZXIuCi0gICAgZmxhZ3MgJj0gfkNCTEtfVU5ERVJSVU5fTVNLOworICAgIGlmIChmbGFncyAmIENCTEtfVU5ERVJSVU5fTVNLKSB7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19VTkRFUlJVTl9NU0ssICZmbGFncyk7CisgICAgfQogCiAgICAgcmV0dXJuIHU7CiB9CiAKIGJvb2wgYXVkaW9fdHJhY2tfY2Jsa190OjpzdGVwU2VydmVyKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7Ci0gICAgLy8gdGhlIGNvZGUgYmVsb3cgc2ltdWxhdGVzIGxvY2std2l0aC10aW1lb3V0Ci0gICAgLy8gd2UgTVVTVCBkbyB0aGlzIHRvIHByb3RlY3QgdGhlIEF1ZGlvRmxpbmdlciBzZXJ2ZXIKLSAgICAvLyBhcyB0aGlzIGxvY2sgaXMgc2hhcmVkIHdpdGggdGhlIGNsaWVudC4KLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBsb2NrLnRyeUxvY2soKTsKLSAgICBpZiAoZXJyID09IC1FQlVTWSkgeyAvLyBqdXN0IHdhaXQgYSBiaXQKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgICAgICBlcnIgPSBsb2NrLnRyeUxvY2soKTsKLSAgICB9Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAvLyBwcm9iYWJseSwgdGhlIGNsaWVudCBqdXN0IGRpZWQuCisgICAgaWYgKCF0cnlMb2NrKCkpIHsKKyAgICAgICAgTE9HVygic3RlcFNlcnZlcigpIGNvdWxkIG5vdCBsb2NrIGNibGsiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTM3NCwxOCArMTM5MCw0MiBAQAogICAgICAgICBpZiAodSA8IGxvb3BFbmQpIHsKICAgICAgICAgICAgIHJldHVybiB1IC0gczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICAgICAgICAgIGlmIChsb29wQ291bnQgPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAobG9vcEVuZCAtIGxvb3BTdGFydCkqbG9vcENvdW50ICsgdSAtIHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBVSU5UX01BWDsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBibG9jayBvbiBtdXRleCBzaGFyZWQgd2l0aCBjbGllbnQgb24gQXVkaW9GbGluZ2VyIHNpZGUKKyAgICAgICAgICAgIGlmICghdHJ5TG9jaygpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiZnJhbWVzUmVhZHkoKSBjb3VsZCBub3QgbG9jayBjYmxrIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZXMgPSBVSU5UX01BWDsKKyAgICAgICAgICAgIGlmIChsb29wQ291bnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lcyA9IChsb29wRW5kIC0gbG9vcFN0YXJ0KSpsb29wQ291bnQgKyB1IC0gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZnJhbWVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHMgLSB1OwogICAgIH0KIH0KIAorYm9vbCBhdWRpb190cmFja19jYmxrX3Q6OnRyeUxvY2soKQoreworICAgIC8vIHRoZSBjb2RlIGJlbG93IHNpbXVsYXRlcyBsb2NrLXdpdGgtdGltZW91dAorICAgIC8vIHdlIE1VU1QgZG8gdGhpcyB0byBwcm90ZWN0IHRoZSBBdWRpb0ZsaW5nZXIgc2VydmVyCisgICAgLy8gYXMgdGhpcyBsb2NrIGlzIHNoYXJlZCB3aXRoIHRoZSBjbGllbnQuCisgICAgc3RhdHVzX3QgZXJyOworCisgICAgZXJyID0gbG9jay50cnlMb2NrKCk7CisgICAgaWYgKGVyciA9PSAtRUJVU1kpIHsgLy8ganVzdCB3YWl0IGEgYml0CisgICAgICAgIHVzbGVlcCgxMDAwKTsKKyAgICAgICAgZXJyID0gbG9jay50cnlMb2NrKCk7CisgICAgfQorICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcHJvYmFibHksIHRoZSBjbGllbnQganVzdCBkaWVkLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGVlYzQ3YzAuLjRhMTI5NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC02Myw4ICs2Myw2IEBACiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKICAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCiAgICAgTkVXX0FVRElPX1NFU1NJT05fSUQsCi0gICAgTE9BRF9FRkZFQ1RfTElCUkFSWSwKLSAgICBVTkxPQURfRUZGRUNUX0xJQlJBUlksCiAgICAgUVVFUllfTlVNX0VGRkVDVFMsCiAgICAgUVVFUllfRUZGRUNULAogICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwKQEAgLTg0LDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMTAwLDcgKzk4LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbVR5cGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbENvdW50KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZEJ1ZmZlci0+YXNCaW5kZXIoKSk7CkBAIC0xMzEsOCArMTI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0xNDUsNyArMTQzLDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOwpAQCAtMTg4LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTUyOCwzNyArNTI2LDYgQEAKICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCi0gICAgewotICAgICAgICBpZiAobGliUGF0aCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSAwOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhsaWJQYXRoKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICpoYW5kbGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTkxPQURfRUZGRUNUX0xJQlJBUlksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC05NTIsMjEgKzkxOSw2IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1Nlc3Npb25JZCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBMT0FEX0VGRkVDVF9MSUJSQVJZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGhhbmRsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRFZmZlY3RMaWJyYXJ5KGRhdGEucmVhZENTdHJpbmcoKSwgJmhhbmRsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBVTkxPQURfRUZGRUNUX0xJQlJBUlk6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih1bmxvYWRFZmZlY3RMaWJyYXJ5KGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQogICAgICAgICBjYXNlIFFVRVJZX05VTV9FRkZFQ1RTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYjg5YTI3OC4uOWZiY2VlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI1LDYgKzI1LDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewpAQCAtNjIsOCArNjQsOCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzUsOCArNzcsOCBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC04NCw3ICs4Niw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGludCBzdGF0ZSkKQEAgLTEwNiw3ICsxMDgsNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xMTYsMjEgKzExOCwyMSBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgZ2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSkKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4odXNhZ2UpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9GT1JDRV9VU0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWc+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTQ0LDcgKzE0Niw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTE1Nyw3ICsxNTksNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTE4Miw3ICsxODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMjEsNyArMjIzLDcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQogICAgIHsKQEAgLTIzNCw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yNDQsNyArMjQ2LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50ICppbmRleCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yNTUsNyArMjU3LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yNjQsNyArMjY2LDcgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0zMzAsMTAgKzMzMiwxMCBAQAogICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLApAQCAtMzQzLDggKzM0NSw4IEBACiAKICAgICAgICAgY2FzZSBHRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcz4gKGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4gKGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcykpKTsKQEAgLTM2NywyOSArMzY5LDI5IEBACiAKICAgICAgICAgY2FzZSBTRVRfRk9SQ0VfVVNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZyA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgR0VUX0ZPUkNFX1VTRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmZvcmNlX3VzZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZ2V0Rm9yY2VVc2UodXNhZ2UpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBHRVRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190PihkYXRhLnJlYWRJbnQzMigpKTsKIAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0KHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCkBAIC00MDYsNyArNDA4LDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTQxNyw3ICs0MTksNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00MzUsOCArNDM3LDggQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9faW5fYWNvdXN0aWNzX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBnZXRJbnB1dChpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC00NjksOCArNDcxLDggQEAKIAogICAgICAgICBjYXNlIElOSVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IGluZGV4TWluID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBpbmRleE1heCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbixpbmRleE1heCkpKTsKQEAgLTQ3OSw4ICs0ODEsOCBAQAogCiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC00ODgsOCArNDkwLDggQEAKIAogICAgICAgICBjYXNlIEdFVF9TVFJFQU1fVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgaW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sICZpbmRleCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CkBAIC00OTksMTYgKzUwMSwxNiBAQAogCiAgICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgR0VUX0RFVklDRVNfRk9SX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4oZ2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZDUyOThjOS4uMDcxNTJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxTa0JpdG1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAvLyBUaGUgYmluZGVyIGlzIHN1cHBvc2VkIHRvIHByb3BhZ2F0ZSB0aGUgc2NoZWR1bGVyIGdyb3VwIGFjcm9zcwogLy8gdGhlIGJpbmRlciBpbnRlcmZhY2Ugc28gdGhhdCByZW1vdGUgY2FsbHMgYXJlIGV4ZWN1dGVkIHdpdGgKQEAgLTI5LDI2ICszMCw2IEBACiAvLyBmb3JlZ3JvdW5kIHRocmVhZC4KICNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQotc3RhdGljIGludCBteVRpZCgpIHsKLSNpZmRlZiBIQVZFX0dFVFRJRAotICAgIHJldHVybiBnZXR0aWQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIGdldHBpZCgpOwotI2VuZGlmCi19Ci0KICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIklNZWRpYU1ldGFkYXRhUmV0cmlldmVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNTksMTggKzQwLDE4IEBACiBzdGF0aWMgdm9pZCBzZW5kU2NoZWRQb2xpY3koUGFyY2VsJiBkYXRhKQogewogICAgIFNjaGVkUG9saWN5IHBvbGljeTsKLSAgICBnZXRfc2NoZWRfcG9saWN5KG15VGlkKCksICZwb2xpY3kpOworICAgIGdldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksICZwb2xpY3kpOwogICAgIGRhdGEud3JpdGVJbnQzMihwb2xpY3kpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRTY2hlZFBvbGljeShjb25zdCBQYXJjZWwmIGRhdGEpCiB7CiAgICAgU2NoZWRQb2xpY3kgcG9saWN5ID0gKFNjaGVkUG9saWN5KSBkYXRhLnJlYWRJbnQzMigpOwotICAgIHNldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgcG9saWN5KTsKKyAgICBzZXRfc2NoZWRfcG9saWN5KGdldHRpZCgpLCBwb2xpY3kpOwogfQogc3RhdGljIHZvaWQgcmVzdG9yZVNjaGVkUG9saWN5KCkKIHsKLSAgICBzZXRfc2NoZWRfcG9saWN5KG15VGlkKCksIFNQX0ZPUkVHUk9VTkQpOworICAgIHNldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksIFNQX0ZPUkVHUk9VTkQpOwogfQogfTsgLy8gZW5kIG5hbWVzcGFjZSBhbmRyb2lkCiAjZW5kaWYKQEAgLTEwMiwxMSArODMsMjQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBzcmNVcmwpCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoc3JjVXJsKTsKKworICAgICAgICBpZiAoaGVhZGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGhlYWRlcnMKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihoZWFkZXJzLT5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGhlYWRlcnMtPmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfVVJMLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTg4LDcgKzE4MiwxOCBAQAogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgY29uc3QgY2hhciogc3JjVXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShzcmNVcmwpKTsKKworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICAgICAgICAgIGludDMyX3QgbnVtSGVhZGVycyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAgICAgIFN0cmluZzgga2V5ID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKAorICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKHNyY1VybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9GRDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMjM5OTIxNi4uNzZhOGE5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC00OCw2ICs0OCw4IEBACiAgICAgU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwKICAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKICAgICBTRVRfVklERU9fU1VSRkFDRVRFWFRVUkUsCisgICAgU0VUX1BBUkFNRVRFUiwKKyAgICBHRVRfUEFSQU1FVEVSLAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllcj4KQEAgLTE5Miw4ICsxOTQsOSBAQAogICAgIH0KIAogICAgIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpCi0gICAgeyAvLyBBdm9pZCBkb2luZyBhbnkgZXh0cmEgY29weS4gVGhlIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZAotICAgICAgLy8gaGF2ZSBiZWVuIHNldCBieSBNZWRpYVBsYXllci5qYXZhLgorICAgIHsKKyAgICAgICAgLy8gQXZvaWQgZG9pbmcgYW55IGV4dHJhIGNvcHkuIFRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQKKyAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBieSBNZWRpYVBsYXllci5qYXZhLgogICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KElOVk9LRSwgcmVxdWVzdCwgcmVwbHkpOwogICAgIH0KIApAQCAtMjM1LDYgKzIzOCwyNiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGtleSk7CisgICAgICAgIGlmIChyZXF1ZXN0LmRhdGFTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBkYXRhLmFwcGVuZEZyb20oY29uc3RfY2FzdDxQYXJjZWwgKj4oJnJlcXVlc3QpLCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICB9CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUEFSQU1FVEVSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGtleSk7CisgICAgICAgIHJldHVybiByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BBUkFNRVRFUiwgZGF0YSwgcmVwbHkpOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFQbGF5ZXIiKTsKQEAgLTMzNCw4ICszNTcsOCBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIElOVk9LRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW52b2tlKGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGludm9rZShkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9NRVRBREFUQV9GSUxURVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKQEAgLTM2MCw2ICszODMsMjMgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGF0dGFjaEF1eEVmZmVjdChkYXRhLnJlYWRJbnQzMigpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGtleSA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgICAgIFBhcmNlbCByZXF1ZXN0OworICAgICAgICAgICAgaWYgKGRhdGEuZGF0YUF2YWlsKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmRGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxQYXJjZWwgKj4oJmRhdGEpLCBkYXRhLmRhdGFQb3NpdGlvbigpLCBkYXRhLmRhdGFBdmFpbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9QQVJBTUVURVI6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIoZGF0YS5yZWFkSW50MzIoKSwgcmVwbHkpOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcAppbmRleCBiZjUxODI5Li4xZjEzNWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAKQEAgLTM1LDEzICszNSwxNiBAQAogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXh0MSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihleHQyKTsKKyAgICAgICAgaWYgKG9iaiAmJiBvYmotPmRhdGFTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBkYXRhLmFwcGVuZEZyb20oY29uc3RfY2FzdDxQYXJjZWwgKj4ob2JqKSwgMCwgb2JqLT5kYXRhU2l6ZSgpKTsKKyAgICAgICAgfQogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTk9USUZZLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiB9OwpAQCAtNTksNyArNjIsMTIgQEAKICAgICAgICAgICAgIGludCBtc2cgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGV4dDEgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGV4dDIgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgbm90aWZ5KG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgICAgICBQYXJjZWwgb2JqOworICAgICAgICAgICAgaWYgKGRhdGEuZGF0YUF2YWlsKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgb2JqLmFwcGVuZEZyb20oY29uc3RfY2FzdDxQYXJjZWwgKj4oJmRhdGEpLCBkYXRhLmRhdGFQb3NpdGlvbigpLCBkYXRhLmRhdGFBdmFpbCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5KG1zZywgZXh0MSwgZXh0MiwgJm9iaik7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCBlZTllMWQ4Li44Yjk1M2UwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTIzLDEzICsyMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvSmV0UGxheWVyLmg+CiAKIAotI2lmZGVmIEhBVkVfR0VUVElECi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXR0aWQoKTsgfQotI2Vsc2UKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHBpZCgpOyB9Ci0jZW5kaWYKLQotCiBuYW1lc3BhY2UgYW5kcm9pZAogewogCkBAIC05NiwxMCArODksMTAgQEAKIAogICAgIC8vIGNyZWF0ZSB0aGUgb3V0cHV0IEF1ZGlvVHJhY2sKICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7Ci0gICAgbUF1ZGlvVHJhY2stPnNldChBdWRpb1N5c3RlbTo6TVVTSUMsICAvL1RPRE8gcGFyYW1ldHJpemUgdGhpcworICAgIG1BdWRpb1RyYWNrLT5zZXQoQVVESU9fU1RSRUFNX01VU0lDLCAgLy9UT0RPIHBhcmFtZXRyaXplIHRoaXMKICAgICAgICAgICAgIHBMaWJDb25maWctPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAxLCAvLyBmb3JtYXQgPSBQQ00gMTZiaXRzIHBlciBzYW1wbGUsCi0gICAgICAgICAgICAocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMgPT0gMikgPyBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPIDogQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8sCisgICAgICAgICAgICAocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMgPT0gMikgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgbVRyYWNrQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIDApOwogCkBAIC0xODgsNyArMTgxLDcgQEAKICAgICAvLyBzaWduYWwgbWFpbiB0aHJlYWQgdGhhdCB3ZSBzdGFydGVkCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgICAgICBtVGlkID0gbXlUaWQoKTsKKyAgICAgICAgbVRpZCA9IGdldHRpZCgpOwogICAgICAgICBMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiByZW5kZXIgdGhyZWFkKCVkKSBzaWduYWwiLCBtVGlkKTsKICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGU2ZjNhMzMuLjA2OWJiYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0zNTYsNiArMzU2LDE4IEBACiAgICAgcmV0dXJuIGF0b2koYXR0c1sxXSk7CiB9CiAKK3ZvaWQgTWVkaWFQcm9maWxlczo6YWRkU3RhcnRUaW1lT2Zmc2V0KGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMpCit7CisgICAgaW50IG9mZnNldFRpbWVNcyA9IDcwMDsKKyAgICBpZiAoYXR0c1syXSkgeworICAgICAgICBDSEVDSyghc3RyY21wKCJzdGFydE9mZnNldE1zIiwgYXR0c1syXSkpOworICAgICAgICBvZmZzZXRUaW1lTXMgPSBhdG9pKGF0dHNbM10pOworICAgIH0KKworICAgIExPR1YoIiVzOiBjYW1lcmFJZD0lZCwgb2Zmc2V0PSVkIG1zIiwgX19mdW5jX18sIGNhbWVyYUlkLCBvZmZzZXRUaW1lTXMpOworICAgIG1TdGFydFRpbWVPZmZzZXRzLnJlcGxhY2VWYWx1ZUZvcihjYW1lcmFJZCwgb2Zmc2V0VGltZU1zKTsKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpzdGFydEVsZW1lbnRIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cykKIHsKQEAgLTM4MCw2ICszOTIsNyBAQAogICAgICAgICBwcm9maWxlcy0+bUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0cy5hZGQoY3JlYXRlRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJDYW1jb3JkZXJQcm9maWxlcyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQgPSBnZXRDYW1lcmFJZChhdHRzKTsKKyAgICAgICAgcHJvZmlsZXMtPmFkZFN0YXJ0VGltZU9mZnNldChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJQcm9maWxlIiwgbmFtZSkgPT0gMCkgewogICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZCgKICAgICAgICAgICAgIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIHByb2ZpbGVzLT5tQ2FtZXJhSWRzKSk7CkBAIC05OTcsNiArMTAxMCwxNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK2ludCBNZWRpYVByb2ZpbGVzOjpnZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgY2FtZXJhSWQpIGNvbnN0IHsKKyAgICBpbnQgb2Zmc2V0VGltZU1zID0gLTE7CisgICAgc3NpemVfdCBpbmRleCA9IG1TdGFydFRpbWVPZmZzZXRzLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG9mZnNldFRpbWVNcyA9IG1TdGFydFRpbWVPZmZzZXRzLnZhbHVlRm9yKGNhbWVyYUlkKTsKKyAgICB9CisgICAgTE9HVigiJXM6IG9mZnNldFRpbWU9JWQgbXMgYW5kIGNhbWVyYUlkPSVkIiwgb2Zmc2V0VGltZU1zLCBjYW1lcmFJZCk7CisgICAgcmV0dXJuIG9mZnNldFRpbWVNczsKK30KKwogTWVkaWFQcm9maWxlczo6fk1lZGlhUHJvZmlsZXMoKQogewogICAgIENIRUNLKCJkZXN0cnVjdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiID09IDApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTEwOGFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKgorICogVGhlIGNvZGUgaGVyZSBvcmlnaW5hbGx5IHJlc2lkZWQgaW4gTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBhbmQgd2FzCisgKiBzaGFtZWxlc3NseSBjb3BpZWQgb3ZlciB0byBzdXBwb3J0IG1lbW9yeSBsZWFrIHRyYWNraW5nIGZyb20KKyAqIG11bHRpcGxlIHBsYWNlcy4KKyAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWYgZGVmaW5lZChfX2FybV9fKQorCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgICAgIHNpemVfdCogaW5mb1NpemUsIHNpemVfdCogdG90YWxNZW1vcnksIHNpemVfdCogYmFja3RyYWNlU2l6ZSk7CisKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisKKy8vIFVzZSB0aGUgU3RyaW5nLWNsYXNzIGJlbG93IGluc3RlYWQgb2YgU3RyaW5nOCB0byBhbGxvY2F0ZSBhbGwgbWVtb3J5CisvLyBiZWZvcmVoYW5kIGFuZCBub3QgcmVlbnRlciB0aGUgaGVhcCB3aGlsZSB3ZSBhcmUgZXhhbWluaW5nIGl0Li4uCitzdHJ1Y3QgTXlTdHJpbmc4IHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9TSVpFID0gMjU2ICogMTAyNDsKKworICAgIE15U3RyaW5nOCgpCisgICAgICAgIDogbVB0cigoY2hhciAqKW1hbGxvYyhNQVhfU0laRSkpIHsKKyAgICAgICAgKm1QdHIgPSAnXDAnOworICAgIH0KKworICAgIH5NeVN0cmluZzgoKSB7CisgICAgICAgIGZyZWUobVB0cik7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciAqcykgeworICAgICAgICBzdHJjYXQobVB0ciwgcyk7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyaW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVB0cjsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0cmxlbihtUHRyKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY2hhciAqbVB0cjsKKworICAgIE15U3RyaW5nOChjb25zdCBNeVN0cmluZzggJik7CisgICAgTXlTdHJpbmc4ICZvcGVyYXRvcj0oY29uc3QgTXlTdHJpbmc4ICYpOworfTsKKwordm9pZCBkdW1wTWVtb3J5QWRkcmVzc2VzKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBNeVN0cmluZzggcmVzdWx0OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgc2l6ZV90IGR1cHM7CisgICAgICAgIGludHB0cl90ICogYmFja3RyYWNlOworICAgIH0gQWxsb2NFbnRyeTsKKworICAgIHVpbnQ4X3QgKmluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSA9IDA7CisgICAgc2l6ZV90IGluZm9TaXplID0gMDsKKyAgICBzaXplX3QgdG90YWxNZW1vcnkgPSAwOworICAgIHNpemVfdCBiYWNrdHJhY2VTaXplID0gMDsKKworICAgIGdldF9tYWxsb2NfbGVha19pbmZvKCZpbmZvLCAmb3ZlcmFsbFNpemUsICZpbmZvU2l6ZSwgJnRvdGFsTWVtb3J5LCAmYmFja3RyYWNlU2l6ZSk7CisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgdWludDhfdCAqcHRyID0gaW5mbzsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gb3ZlcmFsbFNpemUgLyBpbmZvU2l6ZTsKKworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQWxsb2NhdGlvbiBjb3VudCAlaVxuIiwgY291bnQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBUb3RhbCBtZW1vcnkgJWlcbiIsIHRvdGFsTWVtb3J5KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgIEFsbG9jRW50cnkgKiBlbnRyaWVzID0gbmV3IEFsbG9jRW50cnlbY291bnRdOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgLy8gRWFjaCBlbnRyeSBzaG91bGQgYmUgc2l6ZV90LCBzaXplX3QsIGludHB0cl90W2JhY2t0cmFjZVNpemVdCisgICAgICAgICAgICBBbGxvY0VudHJ5ICplID0gJmVudHJpZXNbaV07CisKKyAgICAgICAgICAgIGUtPnNpemUgPSAqcmVpbnRlcnByZXRfY2FzdDxzaXplX3QgKj4ocHRyKTsKKyAgICAgICAgICAgIHB0ciArPSBzaXplb2Yoc2l6ZV90KTsKKworICAgICAgICAgICAgZS0+ZHVwcyA9ICpyZWludGVycHJldF9jYXN0PHNpemVfdCAqPihwdHIpOworICAgICAgICAgICAgcHRyICs9IHNpemVvZihzaXplX3QpOworCisgICAgICAgICAgICBlLT5iYWNrdHJhY2UgPSByZWludGVycHJldF9jYXN0PGludHB0cl90ICo+KHB0cik7CisgICAgICAgICAgICBwdHIgKz0gc2l6ZW9mKGludHB0cl90KSAqIGJhY2t0cmFjZVNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byBzb3J0IHRoZSBlbnRyaWVzLiAgVGhleSBjb21lIHNvcnRlZCBieSBzaXplIGJ1dAorICAgICAgICAvLyBub3QgYnkgc3RhY2sgdHJhY2Ugd2hpY2ggY2F1c2VzIHByb2JsZW1zIHVzaW5nIGRpZmYuCisgICAgICAgIGJvb2wgbW92ZWQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChjb3VudCAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBbGxvY0VudHJ5ICplMSA9ICZlbnRyaWVzW2ldOworICAgICAgICAgICAgICAgIEFsbG9jRW50cnkgKmUyID0gJmVudHJpZXNbaSsxXTsKKworICAgICAgICAgICAgICAgIGJvb2wgc3dhcCA9IGUxLT5zaXplIDwgZTItPnNpemU7CisgICAgICAgICAgICAgICAgaWYgKGUxLT5zaXplID09IGUyLT5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBiYWNrdHJhY2VTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlMS0+YmFja3RyYWNlW2pdID09IGUyLT5iYWNrdHJhY2Vbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAgPSBlMS0+YmFja3RyYWNlW2pdIDwgZTItPmJhY2t0cmFjZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzd2FwKSB7CisgICAgICAgICAgICAgICAgICAgIEFsbG9jRW50cnkgdCA9IGVudHJpZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNbaV0gPSBlbnRyaWVzW2krMV07CisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNbaSsxXSA9IHQ7CisgICAgICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKG1vdmVkKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFsbG9jRW50cnkgKmUgPSAmZW50cmllc1tpXTsKKworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic2l6ZSAlOGksIGR1cCAlNGksICIsIGUtPnNpemUsIGUtPmR1cHMpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZm9yIChzaXplX3QgY3QgPSAwOyAoY3QgPCBiYWNrdHJhY2VTaXplKSAmJiBlLT5iYWNrdHJhY2VbY3RdOyBjdCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA4eCIsIGUtPmJhY2t0cmFjZVtjdF0pOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBkZWxldGVbXSBlbnRyaWVzOworICAgICAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKKyNlbHNlCisvLyBEb2VzIG5vdGhpbmcKK3ZvaWQgZHVtcE1lbW9yeUFkZHJlc3NlcyhpbnQgZmQpIHt9CisKKyNlbmRpZgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggODJmZTJkNC4uOWYxYjNkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTEwMjYsOCArMTAyNiw4IEBACiAKICAgICBtcEF1ZGlvVHJhY2stPnNldChtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05PLAorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCiAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ2FsbGJhY2ssCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCmluZGV4IDQzNTcxY2YuLjM2NjcwN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9WaXN1YWxpemVyLmg+CiAKIGV4dGVybiB2b2lkIGZpeGVkX2ZmdF9yZWFsKGludCBuLCBpbnQzMl90ICp2KTsKQEAgLTEyNyw3ICsxMjksNyBAQAogewogICAgIGlmIChzaXplID4gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYIHx8CiAgICAgICAgIHNpemUgPCBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU4gfHwKLSAgICAgICAgQXVkaW9TeXN0ZW06OnBvcENvdW50KHNpemUpICE9IDEpIHsKKyAgICAgICAgcG9wY291bnQoc2l6ZSkgIT0gMSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAppbmRleCA4ZGZjYjNiLi5jZWUwNmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcApAQCAtOTIsNyArOTIsOCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBzcmNVcmwpCitzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIExPR1YoInNldERhdGFTb3VyY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTA1LDcgKzEwNiw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBMT0dWKCJkYXRhIHNvdXJjZSAoJXMpIiwgc3JjVXJsKTsKLSAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShzcmNVcmwpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHNyY1VybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMGVlMDI0OS4uN2I3YmE3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFQbGF5ZXI6Ok1lZGlhUGxheWVyKCkKQEAgLTQ1LDcgKzQ3LDcgQEAKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1Db29raWUgPSBOVUxMOwogICAgIG1EdXJhdGlvbiA9IC0xOwotICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06Ok1VU0lDOworICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9JRExFOwpAQCAtNTUxLDcgKzU1MywyOSBAQAogICAgIHJldHVybiBtUGxheWVyLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogfQogCi12b2lkIE1lZGlhUGxheWVyOjpub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpCit7CisgICAgTE9HVigiTWVkaWFQbGF5ZXI6OnNldFBhcmFtZXRlciglZCkiLCBrZXkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgIH0KKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkKK3sKKyAgICBMT0dWKCJNZWRpYVBsYXllcjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CisgICAgICAgICByZXR1cm4gIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKKyAgICB9CisgICAgTE9HVigiZ2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIE1lZGlhUGxheWVyOjpub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKIHsKICAgICBMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsIG1zZywgZXh0MSwgZXh0Mik7CiAgICAgYm9vbCBzZW5kID0gdHJ1ZTsKQEAgLTY0MSw2ICs2NjUsOSBAQAogICAgICAgICBtVmlkZW9XaWR0aCA9IGV4dDE7CiAgICAgICAgIG1WaWRlb0hlaWdodCA9IGV4dDI7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVElNRURfVEVYVDoKKyAgICAgICAgTE9HVigiUmVjZWl2ZWQgdGltZWQgdGV4dCBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgICAgICBicmVhazsKQEAgLTY1Myw3ICs2ODAsNyBAQAogICAgIGlmICgobGlzdGVuZXIgIT0gMCkgJiYgc2VuZCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmeUxvY2spOwogICAgICAgICBMT0dWKCJjYWxsYmFjayBhcHBsaWNhdGlvbiIpOwotICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkobXNnLCBleHQxLCBleHQyLCBvYmopOwogICAgICAgICBMT0dWKCJiYWNrIGZyb20gY2FsbGJhY2siKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGU2NWY2ZDguLmZhZGFkMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0zMSw4ICszMSw3IEBACiAJbGliYW5kcm9pZF9ydW50aW1lICAgIAkJCVwKIAlsaWJzdGFnZWZyaWdodCAgICAgICAgCQkJXAogCWxpYnN0YWdlZnJpZ2h0X29teCAgICAJCQlcCi0JbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiAgICAgICAgICAgICAgIFwKLQlsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgICAgICAgICAgICAgICAgXAorCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICAgICAgXAogCWxpYmd1aQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggMDE1NjYzNC4uYTc3ZGZmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTUxLDYgKzUxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIApAQCAtNjUsMTggKzY4LDYgQEAKIAogI2luY2x1ZGUgPE9NWC5oPgogCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCi0KIG5hbWVzcGFjZSB7CiB1c2luZyBhbmRyb2lkOjptZWRpYTo6TWV0YWRhdGE7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKQEAgLTM3Nyw2ICszNjgsOSBAQAogICAgICAgICAgICAgbVBpZCwgbUNvbm5JZCwgbVN0YXR1cywgbUxvb3A/InRydWUiOiAiZmFsc2UiKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBtUGxheWVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb091dHB1dC0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQpAQCAtMzg0LDE0NyArMzc4LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXRpYyBpbnQgbXlUaWQoKSB7Ci0jaWZkZWYgSEFWRV9HRVRUSUQKLSAgICByZXR1cm4gZ2V0dGlkKCk7Ci0jZWxzZQotICAgIHJldHVybiBnZXRwaWQoKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChfX2FybV9fKQotZXh0ZXJuICJDIiB2b2lkIGdldF9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqKiBpbmZvLCBzaXplX3QqIG92ZXJhbGxTaXplLAotICAgICAgICBzaXplX3QqIGluZm9TaXplLCBzaXplX3QqIHRvdGFsTWVtb3J5LCBzaXplX3QqIGJhY2t0cmFjZVNpemUpOwotZXh0ZXJuICJDIiB2b2lkIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiBpbmZvKTsKLQotLy8gVXNlIHRoZSBTdHJpbmctY2xhc3MgYmVsb3cgaW5zdGVhZCBvZiBTdHJpbmc4IHRvIGFsbG9jYXRlIGFsbCBtZW1vcnkKLS8vIGJlZm9yZWhhbmQgYW5kIG5vdCByZWVudGVyIHRoZSBoZWFwIHdoaWxlIHdlIGFyZSBleGFtaW5pbmcgaXQuLi4KLXN0cnVjdCBNeVN0cmluZzggewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1NJWkUgPSAyNTYgKiAxMDI0OwotCi0gICAgTXlTdHJpbmc4KCkKLSAgICAgICAgOiBtUHRyKChjaGFyICopbWFsbG9jKE1BWF9TSVpFKSkgewotICAgICAgICAqbVB0ciA9ICdcMCc7Ci0gICAgfQotCi0gICAgfk15U3RyaW5nOCgpIHsKLSAgICAgICAgZnJlZShtUHRyKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFwcGVuZChjb25zdCBjaGFyICpzKSB7Ci0gICAgICAgIHN0cmNhdChtUHRyLCBzKTsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpzdHJpbmcoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUHRyOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gc3RybGVuKG1QdHIpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBjaGFyICptUHRyOwotCi0gICAgTXlTdHJpbmc4KGNvbnN0IE15U3RyaW5nOCAmKTsKLSAgICBNeVN0cmluZzggJm9wZXJhdG9yPShjb25zdCBNeVN0cmluZzggJik7Ci19OwotCi12b2lkIG1lbVN0YXR1cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgTXlTdHJpbmc4IHJlc3VsdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNpemVfdCBkdXBzOwotICAgICAgICBpbnRwdHJfdCAqIGJhY2t0cmFjZTsKLSAgICB9IEFsbG9jRW50cnk7Ci0KLSAgICB1aW50OF90ICppbmZvID0gTlVMTDsKLSAgICBzaXplX3Qgb3ZlcmFsbFNpemUgPSAwOwotICAgIHNpemVfdCBpbmZvU2l6ZSA9IDA7Ci0gICAgc2l6ZV90IHRvdGFsTWVtb3J5ID0gMDsKLSAgICBzaXplX3QgYmFja3RyYWNlU2l6ZSA9IDA7Ci0KLSAgICBnZXRfbWFsbG9jX2xlYWtfaW5mbygmaW5mbywgJm92ZXJhbGxTaXplLCAmaW5mb1NpemUsICZ0b3RhbE1lbW9yeSwgJmJhY2t0cmFjZVNpemUpOwotICAgIGlmIChpbmZvKSB7Ci0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IGluZm87Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEFsbG9jYXRpb24gY291bnQgJWlcbiIsIGNvdW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgVG90YWwgbWVtb3J5ICVpXG4iLCB0b3RhbE1lbW9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgICAgICBBbGxvY0VudHJ5ICogZW50cmllcyA9IG5ldyBBbGxvY0VudHJ5W2NvdW50XTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIC8vIEVhY2ggZW50cnkgc2hvdWxkIGJlIHNpemVfdCwgc2l6ZV90LCBpbnRwdHJfdFtiYWNrdHJhY2VTaXplXQotICAgICAgICAgICAgQWxsb2NFbnRyeSAqZSA9ICZlbnRyaWVzW2ldOwotCi0gICAgICAgICAgICBlLT5zaXplID0gKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90ICo+KHB0cik7Ci0gICAgICAgICAgICBwdHIgKz0gc2l6ZW9mKHNpemVfdCk7Ci0KLSAgICAgICAgICAgIGUtPmR1cHMgPSAqcmVpbnRlcnByZXRfY2FzdDxzaXplX3QgKj4ocHRyKTsKLSAgICAgICAgICAgIHB0ciArPSBzaXplb2Yoc2l6ZV90KTsKLQotICAgICAgICAgICAgZS0+YmFja3RyYWNlID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdCAqPihwdHIpOwotICAgICAgICAgICAgcHRyICs9IHNpemVvZihpbnRwdHJfdCkgKiBiYWNrdHJhY2VTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gc29ydCB0aGUgZW50cmllcy4gIFRoZXkgY29tZSBzb3J0ZWQgYnkgc2l6ZSBidXQKLSAgICAgICAgLy8gbm90IGJ5IHN0YWNrIHRyYWNlIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyB1c2luZyBkaWZmLgotICAgICAgICBib29sIG1vdmVkOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoY291bnQgLSAxKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQWxsb2NFbnRyeSAqZTEgPSAmZW50cmllc1tpXTsKLSAgICAgICAgICAgICAgICBBbGxvY0VudHJ5ICplMiA9ICZlbnRyaWVzW2krMV07Ci0KLSAgICAgICAgICAgICAgICBib29sIHN3YXAgPSBlMS0+c2l6ZSA8IGUyLT5zaXplOwotICAgICAgICAgICAgICAgIGlmIChlMS0+c2l6ZSA9PSBlMi0+c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgYmFja3RyYWNlU2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZTEtPmJhY2t0cmFjZVtqXSA9PSBlMi0+YmFja3RyYWNlW2pdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2FwID0gZTEtPmJhY2t0cmFjZVtqXSA8IGUyLT5iYWNrdHJhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3dhcCkgewotICAgICAgICAgICAgICAgICAgICBBbGxvY0VudHJ5IHQgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2ldID0gZW50cmllc1tpKzFdOwotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2krMV0gPSB0OwotICAgICAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChtb3ZlZCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBbGxvY0VudHJ5ICplID0gJmVudHJpZXNbaV07Ci0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInNpemUgJThpLCBkdXAgJTRpLCAiLCBlLT5zaXplLCBlLT5kdXBzKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGN0ID0gMDsgKGN0IDwgYmFja3RyYWNlU2l6ZSkgJiYgZS0+YmFja3RyYWNlW2N0XTsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmIChjdCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwOHgiLCBlLT5iYWNrdHJhY2VbY3RdKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsZXRlW10gZW50cmllczsKLSAgICAgICAgZnJlZV9tYWxsb2NfbGVha19pbmZvKGluZm8pOwotICAgIH0KLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotI2VuZGlmCi0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC01NTYsNyArNDA5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgbXlUaWQoKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXR0aWQoKSk7CiAgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CiAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKQEAgLTU3NiwxMyArNDI5LDEzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBteVRpZCgpKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXR0aWQoKSk7CiAgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKICAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIG15VGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXR0aWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTYyMyw3ICs0NzYsNiBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCi0jaWYgZGVmaW5lZChfX2FybV9fKQogICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgewpAQCAtNjMxLDkgKzQ4Myw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGR1bXBNZW0pIHsKLSAgICAgICAgICAgIG1lbVN0YXR1cyhmZCwgYXJncyk7CisgICAgICAgICAgICBkdW1wTWVtb3J5QWRkcmVzc2VzKGZkKTsKICAgICAgICAgfQotI2VuZGlmCiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTExNTYsNyArMTAwNywyMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6bm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICBMT0dWKCJbJWRdIHNldFBhcmFtZXRlciglZCkiLCBtQ29ubklkLCBrZXkpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgTE9HVigiWyVkXSBnZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpOworfQorCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50Ojpub3RpZnkoCisgICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKIHsKICAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNvb2tpZSk7CiAKQEAgLTExNzMsNyArMTAzOSw3IEBACiAgICAgICAgIGNsaWVudC0+YWRkTmV3TWV0YWRhdGFVcGRhdGUobWV0YWRhdGFfdHlwZSk7CiAgICAgfQogICAgIExPR1YoIlslZF0gbm90aWZ5ICglcCwgJWQsICVkLCAlZCkiLCBjbGllbnQtPm1Db25uSWQsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKLSAgICBjbGllbnQtPm1DbGllbnQtPm5vdGlmeShtc2csIGV4dDEsIGV4dDIpOworICAgIGNsaWVudC0+bUNsaWVudC0+bm90aWZ5KG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKIH0KIAogCkBAIC0xMjgxLDcgKzExNDcsNyBAQAogICAgIG1lbSA9IG5ldyBNZW1vcnlCYXNlKGNhY2hlLT5nZXRIZWFwKCksIDAsIGNhY2hlLT5zaXplKCkpOwogICAgICpwU2FtcGxlUmF0ZSA9IGNhY2hlLT5zYW1wbGVSYXRlKCk7CiAgICAgKnBOdW1DaGFubmVscyA9IGNhY2hlLT5jaGFubmVsQ291bnQoKTsKLSAgICAqcEZvcm1hdCA9IGNhY2hlLT5mb3JtYXQoKTsKKyAgICAqcEZvcm1hdCA9IChpbnQpY2FjaGUtPmZvcm1hdCgpOwogICAgIExPR1YoInJldHVybiBtZW1vcnkgQCAlcCwgc2FtcGxlUmF0ZT0ldSwgY2hhbm5lbENvdW50ID0gJWQsIGZvcm1hdCA9ICVkIiwgbWVtLT5wb2ludGVyKCksICpwU2FtcGxlUmF0ZSwgKnBOdW1DaGFubmVscywgKnBGb3JtYXQpOwogCiBFeGl0OgpAQCAtMTM0Miw3ICsxMjA4LDcgQEAKICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7CiAgICAgTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtVHJhY2sgPSAwOwotICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06Ok1VU0lDOworICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwogICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKICAgICBtTGF0ZW5jeSA9IDA7CkBAIC0xNDUyLDcgKzEzMTgsNyBAQAogICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIChjaGFubmVsQ291bnQgPT0gMikgPyBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPIDogQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8sCisgICAgICAgICAgICAgICAgKGNoYW5uZWxDb3VudCA9PSAyKSA/IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyA6IEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAwIC8qIGZsYWdzICovLAogICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKQEAgLTE0NjQsNyArMTMzMCw3IEBACiAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgKGNoYW5uZWxDb3VudCA9PSAyKSA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8gOiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgICAgICAgICAoY2hhbm5lbENvdW50ID09IDIpID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgTlVMTCwKQEAgLTE1ODMsOCArMTQ0OSwxNSBAQAogICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llKTsKIAotICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CisgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwKSB7CisgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgRU9TIGJ1dCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LAorICAgICAgICAvLyBrZWVwIHBsYXlpbmcgc2lsZW5jZS4KIAorICAgICAgICBtZW1zZXQoYnVmZmVyLT5yYXcsIDAsIGJ1ZmZlci0+c2l6ZSk7CisgICAgICAgIGFjdHVhbFNpemUgPSBidWZmZXItPnNpemU7CisgICAgfQorCisgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKIH0KIAogaW50IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpCkBAIC0xNzUwLDcgKzE2MjMsOCBAQAogICAgIHJldHVybiBtRXJyb3I7CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6bm90aWZ5KAorICAgICAgICB2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopCiB7CiAgICAgTE9HVigibm90aWZ5KCVwLCAlZCwgJWQsICVkKSIsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKICAgICBBdWRpb0NhY2hlKiBwID0gc3RhdGljX2Nhc3Q8QXVkaW9DYWNoZSo+KGNvb2tpZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggZmY2Y2NmNS4uOGJhYjQ3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpAQCAtMTMwLDcgKzEzMiw3IEBACiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBmcmFtZVNpemUoKSAqIG1GcmFtZUNvdW50OyB9CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiAoc3NpemVfdCltQ2hhbm5lbENvdW50OyB9Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNzaXplX3QobUNoYW5uZWxDb3VudCAqICgobUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCk/c2l6ZW9mKGludDE2X3QpOnNpemVvZih1X2ludDhfdCkpKTsgfQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzc2l6ZV90KG1DaGFubmVsQ291bnQgKiAoKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpP3NpemVvZihpbnQxNl90KTpzaXplb2YodV9pbnQ4X3QpKSk7IH0KICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgbGF0ZW5jeSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgICAgICBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CkBAIC0xNTYsNyArMTU4LDggQEAKIAogICAgICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBnZXRIZWFwKCkgY29uc3QgeyByZXR1cm4gbUhlYXA7IH0KIAotICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOworICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogICAgIHByaXZhdGU6CkBAIC0yNzYsNiArMjc5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICpyZXBseSk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOwogCiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgIGNyZWF0ZVBsYXllcihwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKIApAQCAtMjg3LDcgKzI5Miw4IEBACiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKIAotICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOworICAgICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAKICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggMWExNzgwYy4uMjljYzAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtMzUsNiArMzUsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKICNpbmNsdWRlICJNZWRpYVJlY29yZGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAKQEAgLTEwMiw3ICsxMDQsNyBAQAogICAgICAgICBMT0dFKCJyZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtUmVjb3JkZXItPnNldEF1ZGlvU291cmNlKChhdWRpb19zb3VyY2UpYXMpOworICAgIHJldHVybiBtUmVjb3JkZXItPnNldEF1ZGlvU291cmNlKChhdWRpb19zb3VyY2VfdClhcyk7CiB9CiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldE91dHB1dEZvcm1hdChpbnQgb2YpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCA1ZmNmMmE3Li4wNmZiMTAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTQwLDE4ICs0MCw2IEBACiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBleHRlcm4gcGxheWVyX3R5cGUgZ2V0UGxheWVyVHlwZShjb25zdCBjaGFyKiB1cmwpOwpAQCAtMTIwLDcgKzEwOCw4IEBACiAgICAgcmV0dXJuIHA7CiB9CiAKLXN0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCkKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIExPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJsKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xMzEsNyArMTIwLDcgQEAKICAgICBMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZSh1cmwpOworICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSBtUmV0cmlldmVyID0gcDsKICAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBiODM0NzE1Li5mMDhmOTMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtNDEsNyArNDEsMTAgQEAKICAgICAvLyBJbXBsZW1lbnRzIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGludGVyZmFjZQogICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBJTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHA/CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCmluZGV4IDFiMGIwNWYuLjdlMDQ1MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcApAQCAtMjksMTUgKzI5LDEyIEBACiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSAiTWlkaUZpbGUuaCIKIAotI2lmZGVmIEhBVkVfR0VUVElECi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXR0aWQoKTsgfQotI2Vsc2UKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHBpZCgpOyB9Ci0jZW5kaWYKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01OCw3ICs1NSw3IEBACiBNaWRpRmlsZTo6TWlkaUZpbGUoKSA6CiAgICAgbUVhc0RhdGEoTlVMTCksIG1FYXNIYW5kbGUoTlVMTCksIG1BdWRpb0J1ZmZlcihOVUxMKSwKICAgICBtUGxheVRpbWUoLTEpLCBtRHVyYXRpb24oLTEpLCBtU3RhdGUoRUFTX1NUQVRFX0VSUk9SKSwKLSAgICBtU3RyZWFtVHlwZShBdWRpb1N5c3RlbTo6TVVTSUMpLCBtTG9vcChmYWxzZSksIG1FeGl0KGZhbHNlKSwKKyAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLCBtTG9vcChmYWxzZSksIG1FeGl0KGZhbHNlKSwKICAgICBtUGF1c2VkKGZhbHNlKSwgbVJlbmRlcihmYWxzZSksIG1UaWQoLTEpCiB7CiAgICAgTE9HVigiY29uc3RydWN0b3IiKTsKQEAgLTQyMyw3ICs0MjAsNyBAQAogfQogCiBzdGF0dXNfdCBNaWRpRmlsZTo6Y3JlYXRlT3V0cHV0VHJhY2soKSB7Ci0gICAgaWYgKG1BdWRpb1NpbmstPm9wZW4ocExpYkNvbmZpZy0+c2FtcGxlUmF0ZSwgcExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULCAyKSAhPSBOT19FUlJPUikgeworICAgIGlmIChtQXVkaW9TaW5rLT5vcGVuKHBMaWJDb25maWctPnNhbXBsZVJhdGUsIHBMaWJDb25maWctPm51bUNoYW5uZWxzLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgMikgIT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HRSgibUF1ZGlvU2luayBvcGVuIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gRVJST1JfT1BFTl9GQUlMRUQ7CiAgICAgfQpAQCAtNDUzLDcgKzQ1MCw3IEBACiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IG15VGlkKCk7CisgICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKICAgICAgICAgTE9HVigicmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7CiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAppbmRleCBhOTgyMzFjLi5iMzU2OTZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaApAQCAtNTUsNiArNTUsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKIAogcHJpdmF0ZToKICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZU91dHB1dFRyYWNrKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGFkOTVmYWMuLmFhZjJkMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zNSw3ICszNSw4IEBACiAgICAgbU1ldGFkYXRhVmFsdWVzWzBdWzBdID0gJ1wwJzsKIH0KIAotc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCkKK3N0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBMT0dWKCJzZXREYXRhU291cmNlOiAlcyIsIHVybD8gdXJsOiAiTlVMTCBwb2ludGVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNDMsOCArNDQsNyBAQAogICAgIGlmIChtTWlkaVBsYXllciA9PSAwKSB7CiAgICAgICAgIG1NaWRpUGxheWVyID0gbmV3IE1pZGlGaWxlKCk7CiAgICAgfQotICAgIC8vIFRPRE86IHN1cHBvcnQgaGVhZGVycyBpbiBNZXRhZGF0YVJldHJpZXZlciBpbnRlcmZhY2UhCi0gICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgTlVMTCAvKiBoZWFkZXJzICovKTsKKyAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDczZmYzNDcuLjRjZWU0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTMxLDcgKzMxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyKCkge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk1pZGlNZXRhZGF0YVJldHJpZXZlcigpIHt9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqdXJsKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCBjNWNiZDIzLi44NzBlMjkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2Vla1RvKGludCBtc2VjKSB7Ci0gICAgTE9HVigic2Vla1RvIik7CisgICAgTE9HVigic2Vla1RvICUuMmYgc2VjcyIsIG1zZWMgLyAxRTMpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2Vla1RvKChpbnQ2NF90KW1zZWMgKiAxMDAwKTsKIApAQCAtMTc3LDYgKzE3NywxNiBAQAogICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIExPR1YoInNldFBhcmFtZXRlciIpOworICAgIHJldHVybiBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgTE9HVigiZ2V0UGFyYW1ldGVyIik7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmdldE1ldGFkYXRhKAogICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpIHsKICAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CkBAIC0yMDQsNCArMjE0LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgIHJldHVybiBtUGxheWVyLT5kdW1wKGZkLCBhcmdzKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggZTI3OTZkMi4uODVhNTQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTU1LDEwICs1NSwxNCBAQAogICAgIHZpcnR1YWwgcGxheWVyX3R5cGUgcGxheWVyVHlwZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAogICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworCiBwcml2YXRlOgogICAgIEF3ZXNvbWVQbGF5ZXIgKm1QbGF5ZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCBlM2RmYWJiLi45Nzg1NzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgpAQCAtNDYsNiArNDcsOCBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjQsNyArNjcsNyBAQAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6U3RhZ2VmcmlnaHRSZWNvcmRlcigpCiAgICAgOiBtV3JpdGVyKE5VTEwpLCBtV3JpdGVyQXV4KE5VTEwpLAogICAgICAgbU91dHB1dEZkKC0xKSwgbU91dHB1dEZkQXV4KC0xKSwKLSAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfTElTVF9FTkQpLAorICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCiAgICAgICBtU3RhcnRlZChmYWxzZSkgewogCkBAIC04MiwxMCArODUsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZSBhcykgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlX3QgYXMpIHsKICAgICBMT0dWKCJzZXRBdWRpb1NvdXJjZTogJWQiLCBhcyk7CiAgICAgaWYgKGFzIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgfHwKLSAgICAgICAgYXMgPj0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIGFzID49IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBhdWRpbyBzb3VyY2U6ICVkIiwgYXMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTU5MCw2ICs1OTMsMjYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtR2VvRGF0YUxvbmdpdHVkZSgKKyAgICBpbnQzMl90IGxvbmdpdHVkZXgxMDAwMCkgeworCisgICAgaWYgKGxvbmdpdHVkZXgxMDAwMCA+IDE4MDAwMDAgfHwgbG9uZ2l0dWRleDEwMDAwIDwgLTE4MDAwMDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUxvbmdpdHVkZXgxMDAwMCA9IGxvbmdpdHVkZXgxMDAwMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtR2VvRGF0YUxhdGl0dWRlKAorICAgIGludDMyX3QgbGF0aXR1ZGV4MTAwMDApIHsKKworICAgIGlmIChsYXRpdHVkZXgxMDAwMCA+IDkwMDAwMCB8fCBsYXRpdHVkZXgxMDAwMCA8IC05MDAwMDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUxhdGl0dWRleDEwMDAwID0gbGF0aXR1ZGV4MTAwMDA7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKICAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKQEAgLTYxOCw2ICs2NDEsMTYgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ1c2U2NEJpdE9mZnNldCkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbTY0Qml0RmlsZU9mZnNldCh1c2U2NEJpdE9mZnNldCAhPSAwKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS1nZW90YWctbG9uZ2l0dWRlIikgeworICAgICAgICBpbnQzMl90IGxvbmdpdHVkZXgxMDAwMDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZsb25naXR1ZGV4MTAwMDApKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1HZW9EYXRhTG9uZ2l0dWRlKGxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicGFyYW0tZ2VvdGFnLWxhdGl0dWRlIikgeworICAgICAgICBpbnQzMl90IGxhdGl0dWRleDEwMDAwOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmxhdGl0dWRleDEwMDAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtR2VvRGF0YUxhdGl0dWRlKGxhdGl0dWRleDEwMDAwKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS10cmFjay10aW1lLXN0YXR1cyIpIHsKICAgICAgICAgaW50NjRfdCB0aW1lRHVyYXRpb25VczsKICAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lRHVyYXRpb25VcykpIHsKQEAgLTgwMCw3ICs4MzMsNyBAQAogICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQ29kZWNTdGFydGVkOwotICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CkBAIC04NzAsMTUgKzkwMywyMSBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFBQ1JlY29yZGluZygpIHsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQUFDX0FESUYgfHwKLSAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMpOworICAgIC8vIEZJWE1FOgorICAgIC8vIEFkZCBzdXBwb3J0IGZvciBPVVRQVVRfRk9STUFUX0FBQ19BRElGCisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKIAogICAgIENIRUNLKG1BdWRpb0VuY29kZXIgPT0gQVVESU9fRU5DT0RFUl9BQUMpOwotICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpOworICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKTsKIAotICAgIENIRUNLKDAgPT0gIkFBQ1dyaXRlciBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisgICAgbVdyaXRlciA9IG5ldyBBQUNXcml0ZXIobU91dHB1dEZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFNUlJlY29yZGluZygpIHsKQEAgLTkwMCw3ICs5MzksMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIobU91dHB1dEZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCkgeworICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTkxNSw3ICs5NjQsNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihtT3V0cHV0RmQpOworICAgIENIRUNLKG1Xcml0ZXIgIT0gMCk7CiAgICAgbVdyaXRlci0+YWRkU291cmNlKGF1ZGlvRW5jb2Rlcik7CiAKICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKQEAgLTkzMyw5ICs5ODIsOSBAQAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKTsKIAotICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORAorICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQKICAgICAgICAgICAgICAgICAmJiBtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKQotICAgICAgICAgICAgfHwgKG1BdWRpb1NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTElTVF9FTkQKKyAgICAgICAgICAgIHx8IChtQXVkaW9Tb3VyY2UgPT0gQVVESU9fU09VUkNFX0NOVAogICAgICAgICAgICAgICAgICYmIG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTElTVF9FTkQpKSB7CiAgICAgICAgIC8vIE11c3QgaGF2ZSBleGFjdGx5IG9uZSBzb3VyY2UuCiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05NDcsNyArOTk2LDcgQEAKIAogICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CiAKLSAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBzb3VyY2UgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIH0gZWxzZSB7CiAKQEAgLTk3NSw3ICsxMDI0LDcgQEAKIAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihtT3V0cHV0RmQpOwogCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgaWYgKG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9BQUMpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQpAQCAtMTM4Myw3ICsxNDMyLDcgQEAKICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCiAgICAgLy8gVGhpcyBoZWxwIG1ha2Ugc3VyZSB0aGF0IHRoZSAicmVjb2RpbmciIHNvdW5kIGlzIHN1cHByZXNzZWQgZm9yCiAgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCi0gICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkpIHsKKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKICAgICAgICAgKnRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwpAQCAtMTM5Myw2ICsxNDQyLDEwIEBACiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CiAgICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKICAgICB9CisgICAgaWYgKG1Mb25naXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCAmJiBtTGF0aXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCkgeworICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgc2V0R2VvRGF0YShtTGF0aXR1ZGV4MTAwMDAsIG1Mb25naXR1ZGV4MTAwMDApOworICAgIH0KICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKICAgICB9CkBAIC0xNDAwLDYgKzE0NTMsMTIgQEAKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQogCisgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMobUNhbWVyYUlkKTsKKyAgICBpZiAobVN0YXJ0VGltZU9mZnNldE1zID4gMCkgeworICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgc2V0U3RhcnRUaW1lT2Zmc2V0TXMobVN0YXJ0VGltZU9mZnNldE1zKTsKKyAgICB9CisKICAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CiAgICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOwogICAgIHJldHVybiBPSzsKQEAgLTE1MDQsNyArMTU2Myw3IEBACiAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CiAKICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKLSAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tBdWRpbzsKICAgICAgICAgfQogICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewpAQCAtMTU1NSw3ICsxNjE0LDcgQEAKICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAogICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOwotICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CkBAIC0xNTgxLDcgKzE2NDAsNyBAQAogICAgIHN0b3AoKTsKIAogICAgIC8vIE5vIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSBieSBkZWZhdWx0Ci0gICAgbUF1ZGlvU291cmNlID0gQVVESU9fU09VUkNFX0xJU1RfRU5EOworICAgIG1BdWRpb1NvdXJjZSA9IEFVRElPX1NPVVJDRV9DTlQ7CiAgICAgbVZpZGVvU291cmNlID0gVklERU9fU09VUkNFX0xJU1RfRU5EOwogCiAgICAgLy8gRGVmYXVsdCBwYXJhbWV0ZXJzCkBAIC0xNjA2LDYgKzE2NjUsNyBAQAogICAgIG1BdWRpb1RpbWVTY2FsZSAgPSAtMTsKICAgICBtVmlkZW9UaW1lU2NhbGUgID0gLTE7CiAgICAgbUNhbWVyYUlkICAgICAgICA9IDA7CisgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CiAgICAgbVZpZGVvRW5jb2RlclByb2ZpbGUgPSAtMTsKICAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgICA9IC0xOwogICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CkBAIC0xNjE5LDYgKzE2NzksOCBAQAogICAgIG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMgPSBmYWxzZTsKICAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKKyAgICBtTGF0aXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKKyAgICBtTG9uZ2l0dWRleDEwMDAwID0gLTM2MDAwMDA7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKICAgICBtT3V0cHV0RmRBdXggPSAtMTsKQEAgLTE2OTIsNiArMTc1NCw4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQ2FtZXJhIElkOiAlZFxuIiwgbUNhbWVyYUlkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBTdGFydCB0aW1lIG9mZnNldCAobXMpOiAlZFxuIiwgbVN0YXJ0VGltZU9mZnNldE1zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyOiAlZFxuIiwgbVZpZGVvRW5jb2Rlcik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlciBwcm9maWxlOiAlZFxuIiwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMmM0NDBjMS4uYWE2N2FhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBDYW1lcmE7CkBAIC0zOSw3ICs0MSw3IEBACiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRSZWNvcmRlcigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2UgYXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlX3QgYXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9Tb3VyY2UodmlkZW9fc291cmNlIHZzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZvcm1hdChvdXRwdXRfZm9ybWF0IG9mKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvRW5jb2RlcihhdWRpb19lbmNvZGVyIGFlKTsKQEAgLTY3LDkgKzY5LDEwIEBACiAgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXIsIG1Xcml0ZXJBdXg7CisgICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogICAgIHNwPEF1ZGlvU291cmNlPiBtQXVkaW9Tb3VyY2VOb2RlOwogCi0gICAgYXVkaW9fc291cmNlIG1BdWRpb1NvdXJjZTsKKyAgICBhdWRpb19zb3VyY2VfdCBtQXVkaW9Tb3VyY2U7CiAgICAgdmlkZW9fc291cmNlIG1WaWRlb1NvdXJjZTsKICAgICBvdXRwdXRfZm9ybWF0IG1PdXRwdXRGb3JtYXQ7CiAgICAgYXVkaW9fZW5jb2RlciBtQXVkaW9FbmNvZGVyOwpAQCAtOTQsNiArOTcsOSBAQAogICAgIGludDY0X3QgbU1heEZpbGVEdXJhdGlvblVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7ICAvLyBDbG9ja3dpc2UKKyAgICBpbnQzMl90IG1MYXRpdHVkZXgxMDAwMDsKKyAgICBpbnQzMl90IG1Mb25naXR1ZGV4MTAwMDA7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAKICAgICBib29sIG1DYXB0dXJlVGltZUxhcHNlOwogICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CkBAIC0xMDIsNyArMTA4LDYgQEAKICAgICBzcDxDYW1lcmFTb3VyY2VUaW1lTGFwc2U+IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CiAKICAgICBTdHJpbmc4IG1QYXJhbXM7Ci0gICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogCiAgICAgYm9vbCBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzOwogICAgIE1lZGlhUHJvZmlsZXMgKm1FbmNvZGVyUHJvZmlsZXM7CkBAIC0xMjEsNiArMTI2LDcgQEAKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydFJUUFJlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOwogICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVBdWRpb1NvdXJjZSgpOwpAQCAtMTU3LDYgKzE2Myw4IEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1NYXhGaWxlRHVyYXRpb25VcyhpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzKGludDY0X3QgYnl0ZXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtR2VvRGF0YUxvbmdpdHVkZShpbnQzMl90IGxvbmdpdHVkZXgxMDAwMCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1HZW9EYXRhTGF0aXR1ZGUoaW50MzJfdCBsYXRpdHVkZXgxMDAwMCk7CiAgICAgdm9pZCBjbGlwVmlkZW9CaXRSYXRlKCk7CiAgICAgdm9pZCBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0ZyYW1lV2lkdGgoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKaW5kZXggZDljM2RiMy4uODAyYTExYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKQEAgLTk5LDYgKzk5LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBpbiwgYW5kcm9pZDo6UGFyY2VsICpvdXQpIHsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShpbiwgb3V0KTsKICAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpOworICAgIH0KIAogCiAgICAgLy8gQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGJ1aWxkIGlzICdlbmcnIG9yICd0ZXN0JyBhbmQgdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCmluZGV4IGMyMGUyNzkuLmU3NjE1MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNiBAQAogICAgICAgICBOdVBsYXllckRyaXZlci5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJSZW5kZXJlci5jcHAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwICAgICAgXAotICAgICAgICBEZWNvZGVyV3JhcHBlci5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgU3RyZWFtaW5nU291cmNlLmNwcCAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9EZWNvZGVyV3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmQxZmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEZWNvZGVyV3JhcHBlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRlY29kZXJXcmFwcGVyLmgiCi0KLSNpbmNsdWRlICJBQUNEZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIFdyYXBwZXJTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotICAgIHZvaWQgcXVldWVCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0gICAgdm9pZCBxdWV1ZUVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+V3JhcHBlclNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotCi0gICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1RdWV1ZTsKLSAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVyU291cmNlKTsKLX07Ci0KLURlY29kZXJXcmFwcGVyOjpXcmFwcGVyU291cmNlOjpXcmFwcGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbU1ldGEobWV0YSksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtRmluYWxSZXN1bHQoT0spIHsKLX0KLQotRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6On5XcmFwcGVyU291cmNlKCkgewotfQotCi1zdGF0dXNfdCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLXN0YXR1c190IERlY29kZXJXcmFwcGVyOjpXcmFwcGVyU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgYm9vbCByZXF1ZXN0ZWRCdWZmZXIgPSBmYWxzZTsKLQotICAgIHdoaWxlIChtUXVldWUuZW1wdHkoKSAmJiBtRmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgaWYgKCFyZXF1ZXN0ZWRCdWZmZXIpIHsKLSAgICAgICAgICAgIG1Ob3RpZnktPmR1cCgpLT5wb3N0KCk7Ci0gICAgICAgICAgICByZXF1ZXN0ZWRCdWZmZXIgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAobVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBzcmMgPSAqbVF1ZXVlLmJlZ2luKCk7Ci0gICAgbVF1ZXVlLmVyYXNlKG1RdWV1ZS5iZWdpbigpKTsKLQotICAgIE1lZGlhQnVmZmVyICpkc3QgPSBuZXcgTWVkaWFCdWZmZXIoc3JjLT5zaXplKCkpOwotICAgIG1lbWNweShkc3QtPmRhdGEoKSwgc3JjLT5kYXRhKCksIHNyYy0+c2l6ZSgpKTsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKHNyYy0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgIGRzdC0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgKm91dCA9IGRzdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6cXVldWVCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OnF1ZXVlRU9TKHN0YXR1c190IGZpbmFsUmVzdWx0KSB7Ci0gICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1GaW5hbFJlc3VsdCA9IGZpbmFsUmVzdWx0OwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OmNsZWFyKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVF1ZXVlLmNsZWFyKCk7Ci0gICAgbUZpbmFsUmVzdWx0ID0gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0cnVjdCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclJlYWRlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgV3JhcHBlclJlYWRlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmZGVjb2RlciwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHZvaWQgc3RhcnQoKTsKLSAgICB2b2lkIHN0b3AoKTsKLSAgICB2b2lkIHJlYWRNb3JlKGJvb2wgZmx1c2ggPSBmYWxzZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5XcmFwcGVyUmVhZGVyKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdFJlYWQKLSAgICB9OwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1EZWNvZGVyOwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIGJvb2wgbUVPUzsKLSAgICBib29sIG1TZW50Rm9ybWF0OwotCi0gICAgdm9pZCBzZW5kRm9ybWF0Q2hhbmdlKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVyUmVhZGVyKTsKLX07Ci0KLURlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpXcmFwcGVyUmVhZGVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJmRlY29kZXIsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbURlY29kZXIoZGVjb2RlciksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtRU9TKGZhbHNlKSwKLSAgICAgIG1TZW50Rm9ybWF0KGZhbHNlKSB7Ci19Ci0KLURlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjp+V3JhcHBlclJlYWRlcigpIHsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclJlYWRlcjo6c3RhcnQoKSB7Ci0gICAgQ0hFQ0tfRVEobURlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7Ci0gICAgcmVhZE1vcmUoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclJlYWRlcjo6c3RvcCgpIHsKLSAgICBDSEVDS19FUShtRGVjb2Rlci0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpyZWFkTW9yZShib29sIGZsdXNoKSB7Ci0gICAgaWYgKCFmbHVzaCAmJiBtRU9TKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZmx1c2giLCBzdGF0aWNfY2FzdDxpbnQzMl90PihmbHVzaCkpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSZWFkOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGZsdXNoOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsdXNoIiwgJmZsdXNoKSk7Ci0KLSAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKGZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgLy8gRHVtbXkgc2VlawotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKDApOwotICAgICAgICAgICAgICAgIG1FT1MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soIW1FT1MpOwotCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqc3JjOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbURlY29kZXItPnJlYWQoJnNyYywgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU2VudEZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRm9ybWF0Q2hhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZW50Rm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVhbE5vdGlmeTsKLSAgICAgICAgICAgICAgICBDSEVDSyhub3RpZnktPmZpbmRNZXNzYWdlKCJyZWFsLW5vdGlmeSIsICZyZWFsTm90aWZ5KSk7Ci0KLSAgICAgICAgICAgICAgICByZWFsTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHN0ID0gbmV3IEFCdWZmZXIoc3JjLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRzdC0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy0+ZGF0YSgpICsgc3JjLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgICAgICBDSEVDSyhzcmMtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgICAgICBzcmMtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBzcmMgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgZHN0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgcmVhbE5vdGlmeS0+c2V0T2JqZWN0KCJidWZmZXIiLCBkc3QpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgc2VuZEZvcm1hdENoYW5nZSgpOwotCi0gICAgICAgICAgICAgICAgcmVhZE1vcmUoZmFsc2UgLyogZmx1c2ggKi8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVhbE5vdGlmeTsKLSAgICAgICAgICAgICAgICBDSEVDSyhub3RpZnktPmZpbmRNZXNzYWdlKCJyZWFsLW5vdGlmeSIsICZyZWFsTm90aWZ5KSk7Ci0KLSAgICAgICAgICAgICAgICByZWFsTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRFT1MpOwotICAgICAgICAgICAgICAgIG1FT1MgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpzZW5kRm9ybWF0Q2hhbmdlKCkgewotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZWFsTm90aWZ5OwotICAgIENIRUNLKG5vdGlmeS0+ZmluZE1lc3NhZ2UoInJlYWwtbm90aWZ5IiwgJnJlYWxOb3RpZnkpKTsKLQotICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRGVjb2Rlci0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgIHJlYWxOb3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUpOwotCi0gICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwotCi0gICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwotICAgICAgICByZWFsTm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKLSAgICAgICAgcmVhbE5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7Ci0KLSAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSkgewotICAgICAgICAgICAgY3JvcExlZnQgPSAwOwotICAgICAgICAgICAgY3JvcFRvcCA9IDA7Ci0gICAgICAgICAgICBjcm9wUmlnaHQgPSB3aWR0aCAtIDE7Ci0gICAgICAgICAgICBjcm9wQm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWxOb3RpZnktPnNldFJlY3QoImNyb3AiLCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICB9Ci0KLSAgICBub3RpZnktPnBvc3QoKTsKLQotICAgIG1TZW50Rm9ybWF0ID0gdHJ1ZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotRGVjb2RlcldyYXBwZXI6OkRlY29kZXJXcmFwcGVyKCkKLSAgICA6IG1OdW1PdXRzdGFuZGluZ0lucHV0QnVmZmVycygwKSwKLSAgICAgIG1OdW1PdXRzdGFuZGluZ091dHB1dEJ1ZmZlcnMoMCksCi0gICAgICBtTnVtUGVuZGluZ0RlY29kZXMoMCksCi0gICAgICBtRmx1c2hpbmcoZmFsc2UpIHsKLX0KLQotRGVjb2RlcldyYXBwZXI6On5EZWNvZGVyV3JhcHBlcigpIHsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIG1Ob3RpZnkgPSBtc2c7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OmluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBtc2ctPnNldFdoYXQoa1doYXRTZXR1cCk7Ci0gICAgbXNnLT5zZXRUYXJnZXQoaWQoKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OmluaXRpYXRlU2h1dGRvd24oKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKSktPnBvc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6c2lnbmFsRmx1c2goKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKSktPnBvc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6c2lnbmFsUmVzdW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdFNldHVwOgotICAgICAgICAgICAgb25TZXR1cChtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgotICAgICAgICAgICAgb25TaHV0ZG93bigpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrV2hhdElucHV0RGF0YVJlcXVlc3RlZDoKLSAgICAgICAgewotICAgICAgICAgICAgcG9zdEZpbGxCdWZmZXIoKTsKLSAgICAgICAgICAgICsrbU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0dUKG1OdW1PdXRzdGFuZGluZ0lucHV0QnVmZmVycywgMCk7Ci0gICAgICAgICAgICAtLW1OdW1PdXRzdGFuZGluZ0lucHV0QnVmZmVyczsKLQotICAgICAgICAgICAgaWYgKG1GbHVzaGluZykgewotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlRU9TKElORk9fRElTQ09OVElOVUlUWSk7Ci0KLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBpZiAoIW1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGVyciA9IE9LOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUVPUyhlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7Ci0KLSAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGaWxsQnVmZmVyRG9uZToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlYWwtbm90aWZ5IiwgJm5vdGlmeSkpOwotCi0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhub3RpZnktPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19HVChtTnVtUGVuZGluZ0RlY29kZXMsIDApOwotICAgICAgICAgICAgICAgIC0tbU51bVBlbmRpbmdEZWNvZGVzOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgaWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwotCi0gICAgICAgICAgICAgICAgKyttTnVtT3V0c3RhbmRpbmdPdXRwdXRCdWZmZXJzOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19HVChtTnVtUGVuZGluZ0RlY29kZXMsIDApOwotICAgICAgICAgICAgICAgIC0tbU51bVBlbmRpbmdEZWNvZGVzOwotCi0gICAgICAgICAgICAgICAgaWYgKG1GbHVzaGluZykgewotICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfR1QobU51bU91dHN0YW5kaW5nT3V0cHV0QnVmZmVycywgMCk7Ci0gICAgICAgICAgICAtLW1OdW1PdXRzdGFuZGluZ091dHB1dEJ1ZmZlcnM7Ci0KLSAgICAgICAgICAgIGlmIChtRmx1c2hpbmcpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICArK21OdW1QZW5kaW5nRGVjb2RlczsKLSAgICAgICAgICAgIG1SZWFkZXItPnJlYWRNb3JlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGbHVzaDoKLSAgICAgICAgewotICAgICAgICAgICAgb25GbHVzaCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6b25TZXR1cChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgc3A8UmVmQmFzZT4gb2JqOwotICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiZXNkcyIsICZvYmopKTsKLSAgICBzcDxBQnVmZmVyPiBlc2RzID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihvYmouZ2V0KCkpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUuY19zdHIoKSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLSAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLT5kYXRhKCksIGVzZHMtPnNpemUoKSk7Ci0KLSAgICBtU291cmNlID0gbmV3IFdyYXBwZXJTb3VyY2UoCi0gICAgICAgICAgICBtZXRhLCBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dERhdGFSZXF1ZXN0ZWQsIGlkKCkpKTsKLQotICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gbmV3IEFBQ0RlY29kZXIobVNvdXJjZSk7Ci0KLSAgICBtUmVhZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbVJlYWRlckxvb3Blci0+c2V0TmFtZSgiRGVjb2RlcldyYXBwZXIgbG9vcGVyIik7Ci0KLSAgICBtUmVhZGVyTG9vcGVyLT5zdGFydCgKLSAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KLSAgICAgICAgICAgIGZhbHNlLCAvKiBjYW5DYWxsSmF2YSAqLwotICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEZpbGxCdWZmZXJEb25lLCBpZCgpKTsKLSAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlYWwtbm90aWZ5IiwgbU5vdGlmeSk7Ci0KLSAgICBtUmVhZGVyID0gbmV3IFdyYXBwZXJSZWFkZXIoZGVjb2Rlciwgbm90aWZ5KTsKLSAgICBtUmVhZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlYWRlcik7Ci0KLSAgICBtUmVhZGVyLT5zdGFydCgpOwotICAgICsrbU51bVBlbmRpbmdEZWNvZGVzOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpvblNodXRkb3duKCkgewotICAgIG1SZWFkZXJMb29wZXItPnN0b3AoKTsKLSAgICBtUmVhZGVyTG9vcGVyLmNsZWFyKCk7Ci0KLSAgICBtUmVhZGVyLT5zdG9wKCk7Ci0gICAgbVJlYWRlci5jbGVhcigpOwotCi0gICAgbVNvdXJjZS5jbGVhcigpOwotCi0gICAgbU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzID0gMDsKLSAgICBtTnVtT3V0c3RhbmRpbmdPdXRwdXRCdWZmZXJzID0gMDsKLSAgICBtTnVtUGVuZGluZ0RlY29kZXMgPSAwOwotICAgIG1GbHVzaGluZyA9IGZhbHNlOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpwb3N0RmlsbEJ1ZmZlcigpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcik7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIGlkKCkpOwotICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6Om9uRmx1c2goKSB7Ci0gICAgQ0hFQ0soIW1GbHVzaGluZyk7Ci0gICAgbUZsdXNoaW5nID0gdHJ1ZTsKLQotICAgIGNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OmNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCkgewotICAgIENIRUNLKG1GbHVzaGluZyk7Ci0KLSAgICBpZiAobU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzID4gMAotICAgICAgICAgICAgfHwgbU51bU91dHN0YW5kaW5nT3V0cHV0QnVmZmVycyA+IDAKLSAgICAgICAgICAgIHx8IG1OdW1QZW5kaW5nRGVjb2RlcyA+IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1GbHVzaGluZyA9IGZhbHNlOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpvblJlc3VtZSgpIHsKLSAgICBDSEVDSyghbUZsdXNoaW5nKTsKLQotICAgICsrbU51bVBlbmRpbmdEZWNvZGVzOwotCi0gICAgbVNvdXJjZS0+Y2xlYXIoKTsKLSAgICBtUmVhZGVyLT5yZWFkTW9yZSh0cnVlIC8qIGZsdXNoICovKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9EZWNvZGVyV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmUxMmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBERUNPREVSX1dSQVBQRVJfSF8KLQotI2RlZmluZSBERUNPREVSX1dSQVBQRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTWVkaWFTb3VyY2U7Ci0KLXN0cnVjdCBEZWNvZGVyV3JhcHBlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgRGVjb2RlcldyYXBwZXIoKTsKLQotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBpbml0aWF0ZVNldHVwKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKLSAgICB2b2lkIHNpZ25hbEZsdXNoKCk7Ci0gICAgdm9pZCBzaWduYWxSZXN1bWUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRlY29kZXJXcmFwcGVyKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBXcmFwcGVyU291cmNlOwotICAgIHN0cnVjdCBXcmFwcGVyUmVhZGVyOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2V0dXAsCi0gICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsCi0gICAgICAgIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwKLSAgICAgICAga1doYXRTaHV0ZG93biwKLSAgICAgICAga1doYXRGaWxsQnVmZmVyRG9uZSwKLSAgICAgICAga1doYXRJbnB1dERhdGFSZXF1ZXN0ZWQsCi0gICAgICAgIGtXaGF0Rmx1c2gsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgIH07Ci0KLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLQotICAgIHNwPFdyYXBwZXJTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBzcDxBTG9vcGVyPiBtUmVhZGVyTG9vcGVyOwotICAgIHNwPFdyYXBwZXJSZWFkZXI+IG1SZWFkZXI7Ci0KLSAgICBpbnQzMl90IG1OdW1PdXRzdGFuZGluZ0lucHV0QnVmZmVyczsKLSAgICBpbnQzMl90IG1OdW1PdXRzdGFuZGluZ091dHB1dEJ1ZmZlcnM7Ci0gICAgaW50MzJfdCBtTnVtUGVuZGluZ0RlY29kZXM7Ci0gICAgYm9vbCBtRmx1c2hpbmc7Ci0KLSAgICB2b2lkIG9uU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25TaHV0ZG93bigpOwotICAgIHZvaWQgb25GbHVzaCgpOwotICAgIHZvaWQgb25SZXN1bWUoKTsKLQotICAgIHZvaWQgcG9zdEZpbGxCdWZmZXIoKTsKLSAgICB2b2lkIGNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyV3JhcHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERFQ09ERVJfV1JBUFBFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAppbmRleCBkMDdlYTFiLi5iM2IzYWY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKQEAgLTMzLDExICszMywyNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6SFRUUExpdmVTb3VyY2UoY29uc3QgY2hhciAqdXJsLCB1aW50MzJfdCBmbGFncykKK051UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6SFRUUExpdmVTb3VyY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgOiBtVVJMKHVybCksCi0gICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbUZsYWdzKDApLAogICAgICAgbUVPUyhmYWxzZSksCiAgICAgICBtT2Zmc2V0KDApIHsKKyAgICBpZiAoaGVhZGVycykgeworICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgieC1oaWRlLXVybHMtZnJvbS1sb2ciKSk7CisKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0luY29nbml0bzsKKworICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjp+SFRUUExpdmVTb3VyY2UoKSB7CkBAIC01NSwxNCArNjksMTUgQEAKIAogICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uKTsKIAotICAgIG1MaXZlU2Vzc2lvbi0+Y29ubmVjdChtVVJMLmNfc3RyKCkpOworICAgIG1MaXZlU2Vzc2lvbi0+Y29ubmVjdCgKKyAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOwogCiAgICAgbVRTUGFyc2VyID0gbmV3IEFUU1BhcnNlcjsKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9Ci0gICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpNUEVHMkFEVFNfQVVESU8gOiBBVFNQYXJzZXI6OkFWQ19WSURFTzsKKyAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6OkFVRElPIDogQVRTUGFyc2VyOjpWSURFTzsKIAogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4obVRTUGFyc2VyLT5nZXRTb3VyY2UodHlwZSkuZ2V0KCkpOwpAQCAtMTE2LDcgKzEzMSw3IEBACiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewogICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID0KLSAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6Ok1QRUcyQURUU19BVURJTyA6IEFUU1BhcnNlcjo6QVZDX1ZJREVPOworICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPOwogCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCmluZGV4IGE4Y2U3ZjQuLjdhMzM3ZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCkBAIC0yNywxMSArMjcsOSBAQAogc3RydWN0IExpdmVTZXNzaW9uOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewotICAgIGVudW0gRmxhZ3MgewotICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCi0gICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKLSAgICB9OwotICAgIEhUVFBMaXZlU291cmNlKGNvbnN0IGNoYXIgKnVybCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICBIVFRQTGl2ZVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogCkBAIC00OSw3ICs0NywxMyBAQAogICAgIHZpcnR1YWwgfkhUVFBMaXZlU291cmNlKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAorICAgIH07CisKICAgICBBU3RyaW5nIG1VUkw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgYm9vbCBtRU9TOwogICAgIG9mZjY0X3QgbU9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IGQ0MzlmNmUuLmVmZmE3MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtNzIsMTcgKzcyLDcgQEAKICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCBpZCgpKTsKIAotICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLQotICAgIGlmIChoZWFkZXJzKSB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBoZWFkZXJzLT5pbmRleE9mS2V5KFN0cmluZzgoIngtaGlkZS11cmxzLWZyb20tbG9nIikpOwotCi0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBIVFRQTGl2ZVNvdXJjZTo6a0ZsYWdJbmNvZ25pdG87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IEhUVFBMaXZlU291cmNlKHVybCwgZmxhZ3MpKTsKKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IEhUVFBMaXZlU291cmNlKHVybCwgaGVhZGVycykpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDUxN2FjYzkuLjgxYjQxZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKIAotI2luY2x1ZGUgIkRlY29kZXJXcmFwcGVyLmgiCiAjaW5jbHVkZSAiRVNEUy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00Nyw3ICs0Niw2IEBACiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKICAgICBDSEVDSyhtQ29kZWMgPT0gTlVMTCk7Ci0gICAgQ0hFQ0sobVdyYXBwZXIgPT0gTlVMTCk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKQEAgLTYxLDE5ICs1OSwxMSBAQAogICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgibmF0aXZlLXdpbmRvdyIsIG1OYXRpdmVXaW5kb3cpOwogICAgIH0KIAotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIG1XcmFwcGVyID0gbmV3IERlY29kZXJXcmFwcGVyOwotICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1XcmFwcGVyKTsKKyAgICBtQ29kZWMgPSBuZXcgQUNvZGVjOworICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjKTsKIAotICAgICAgICBtV3JhcHBlci0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnlNc2cpOwotICAgICAgICBtV3JhcHBlci0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7Ci0gICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjKTsKLQotICAgICAgICBtQ29kZWMtPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5TXNnKTsKLSAgICAgICAgbUNvZGVjLT5pbml0aWF0ZVNldHVwKGZvcm1hdCk7Ci0gICAgfQorICAgIG1Db2RlYy0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnlNc2cpOworICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMjE0LDcgKzIwNCw2IEBACiAKICAgICAgICAgbXNnLT5zZXRPYmplY3QoImNzZCIsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSNpZiAwCiAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwogICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCkBAIC0yMzAsMTIgKzIxOSw2IEBACiAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICAgICAgbUNTRC5wdXNoKGJ1ZmZlcik7Ci0jZWxzZQotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLQotICAgICAgICBtc2ctPnNldE9iamVjdCgiZXNkcyIsIGJ1ZmZlcik7Ci0jZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4gbXNnOwpAQCAtMjcwLDI3ICsyNTMsMTggQEAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbEZsdXNoKCkgewogICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewogICAgICAgICBtQ29kZWMtPnNpZ25hbEZsdXNoKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobVdyYXBwZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1XcmFwcGVyLT5zaWduYWxGbHVzaCgpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsUmVzdW1lKCkgewogICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewogICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1XcmFwcGVyICE9IE5VTEwpOwotICAgICAgICBtV3JhcHBlci0+c2lnbmFsUmVzdW1lKCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0aWF0ZVNodXRkb3duKCkgewogICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewogICAgICAgICBtQ29kZWMtPmluaXRpYXRlU2h1dGRvd24oKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtV3JhcHBlciAhPSBOVUxMKTsKLSAgICAgICAgbVdyYXBwZXItPmluaXRpYXRlU2h1dGRvd24oKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAppbmRleCA3MzJmMDkwLi5mYWJjNjA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCkBAIC0yNSw3ICsyNSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IERlY29kZXJXcmFwcGVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCkBAIC01MSw3ICs1MCw2IEBACiAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKIAogICAgIHNwPEFDb2RlYz4gbUNvZGVjOwotICAgIHNwPERlY29kZXJXcmFwcGVyPiBtV3JhcHBlcjsKIAogICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0Q7CiAgICAgc2l6ZV90IG1DU0RJbmRleDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IDBlY2E5NTguLmUxMjEzZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtMjQ2LDYgKzI0NiwxNCBAQAogICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0TWV0YWRhdGEoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggNjdkMGYzZS4uMTQ1ZmQ4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTUyLDYgKzUyLDggQEAKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggMzY5YTNhOC4uODI4ZTAwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMTk4LDE4ICsxOTgsMjEgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uRHJhaW5BdWRpb1F1ZXVlKCkgewotICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKLSAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwgKHN0YXR1c190KU9LKTsKIAotICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9Ci0gICAgICAgIG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSAtIChtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCk7CisgICAgZm9yICg7OykgeworICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgQ0hFQ0tfR0UobnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSwgMCk7CisgICAgICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSAobU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQpOwogCi0gICAgc2l6ZV90IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA9Ci0gICAgICAgIG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgKiBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA9CisgICAgICAgICAgICBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlICogbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAKLSAgICB3aGlsZSAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID4gMCkgeworICAgICAgICBpZiAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjQsMTAgKzI2NywxMCBAQAogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSBjb3B5OwogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3B5IC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IDIwMTYyODIuLmJiYzhhNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC04Nyw3ICs4Nyw3IEBACiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewogICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID0KLSAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6Ok1QRUcyQURUU19BVURJTyA6IEFUU1BhcnNlcjo6QVZDX1ZJREVPOworICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPOwogCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CkBAIC0xMDIsNyArMTAyLDcgQEAKIHN0YXR1c190IE51UGxheWVyOjpTdHJlYW1pbmdTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewogICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID0KLSAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6Ok1QRUcyQURUU19BVURJTyA6IEFUU1BhcnNlcjo6QVZDX1ZJREVPOworICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPOwogCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDEzMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUFDV3JpdGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FBQ1dyaXRlcjo6QUFDV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZkKC0xKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZXN1bWVkKGZhbHNlKSwKKyAgICAgIG1DaGFubmVsQ291bnQoLTEpLAorICAgICAgbVNhbXBsZVJhdGUoLTEpIHsKKworICAgIExPR1YoIkFBQ1dyaXRlciBDb25zdHJ1Y3RvciIpOworCisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUik7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9Cit9CisKK0FBQ1dyaXRlcjo6QUFDV3JpdGVyKGludCBmZCkKKyAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMD8gTk9fSU5JVDogT0spLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVzdW1lZChmYWxzZSksCisgICAgICBtQ2hhbm5lbENvdW50KC0xKSwKKyAgICAgIG1TYW1wbGVSYXRlKC0xKSB7Cit9CisKK0FBQ1dyaXRlcjo6fkFBQ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGlmIChtRmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBBQUNXcml0ZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RhdGljIGludCB3cml0ZUludDgoaW50IGZkLCB1aW50OF90IHgpIHsKKyAgICByZXR1cm4gOjp3cml0ZShmZCwgJngsIDEpOworfQorCisKK3N0YXR1c190IEFBQ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBMT0dFKCJBQUMgZmlsZXMgb25seSBzdXBwb3J0IGEgc2luZ2xlIHRyYWNrIG9mIGF1ZGlvLiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbUNoYW5uZWxDb3VudCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0sobUNoYW5uZWxDb3VudCA+PSAxICYmIG1DaGFubmVsQ291bnQgPD0gMik7CisKKyAgICBtU291cmNlID0gc291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUFDV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBzdGFydGVkLCBkb2VzIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoa1NhbXBsZXNQZXJGcmFtZSAqIDEwMDAwMDBMTCArIChtU2FtcGxlUmF0ZSA+PiAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOworCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFBQ1dyaXRlcjo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkICpkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKKyAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQUFDV3JpdGVyOjpleGNlZWRzRmlsZVNpemVMaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPj0gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBBQUNXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+PSBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKK30KKworLy8gc3RhdGljCit2b2lkICpBQUNXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICByZXR1cm4gKHZvaWQgKikgc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOworfQorCisvKgorKiBSZXR1cm5zIGFuIGluZGV4IGludG8gdGhlIHNhbXBsZSByYXRlIHRhYmxlIGlmIHRoZQorKiBnaXZlbiBzYW1wbGUgcmF0ZSBpcyBmb3VuZDsgb3RoZXJ3aXNlLCByZXR1cm5zIC0xLgorKi8KK3N0YXRpYyBib29sIGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludCBzYW1wbGVSYXRlLCB1aW50OF90KiB0YWJsZUluZGV4KSB7CisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgY29uc3QgaW50IHRhYmxlU2l6ZSA9CisgICAgICAgIHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlKSAvIHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlWzBdKTsKKworICAgICp0YWJsZUluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdGFibGVTaXplOyArK2luZGV4KSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID09IGtTYW1wbGVSYXRlVGFibGVbaW5kZXhdKSB7CisgICAgICAgICAgICBMT0dWKCJTYW1wbGUgcmF0ZTogJWQgYW5kIGluZGV4OiAlZCIsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgaW5kZXgpOworICAgICAgICAgICAgKnRhYmxlSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiU2FtcGxpbmcgcmF0ZSAlZCBicHMgaXMgbm90IHN1cHBvcnRlZCIsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEFEVFMgKEF1ZGlvIGRhdGEgdHJhbnNwb3J0IHN0cmVhbSkgaGVhZGVyIHN0cnVjdHVyZS4KKyAqIEl0IGNvbnNpc3RzIG9mIDcgb3IgOSBieXRlcyAod2l0aCBvciB3aXRob3V0IENSQyk6CisgKiAxMiBiaXRzIG9mIHN5bmN3b3JkIDB4RkZGLCBhbGwgYml0cyBtdXN0IGJlIDEKKyAqIDEgYml0IG9mIGZpZWxkIElELiAwIGZvciBNUEVHLTQsIGFuZCAxIGZvciBNUEVHLTIKKyAqIDIgYml0cyBvZiBNUEVHIGxheWVyLiBJZiBpbiBNUEVHLVRTLCBzZXQgdG8gMAorICogMSBiaXQgb2YgcHJvdGVjdGlvbiBhYnNlbnNlLiBTZXQgdG8gMSBpZiBubyBDUkMuCisgKiAyIGJpdHMgb2YgcHJvZmlsZSBjb2RlLiBTZXQgdG8gMSAoVGhlIE1QRUctNCBBdWRpbworICogICBvYmplY3QgdHlwZSBtaW51cyAxLiBXZSBhcmUgdXNpbmcgQUFDLUxDID0gMikKKyAqIDQgYml0cyBvZiBzYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggY29kZSAoMTUgaXMgbm90IGFsbG93ZWQpCisgKiAxIGJpdCBvZiBwcml2YXRlIHN0cmVhbS4gU2V0IHRvIDAuCisgKiAzIGJpdHMgb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGNvZGUuIDAgcmVzZXZlcmVkIGZvciBpbmJhbmQgUENNCisgKiAxIGJpdCBvZiBvcmlnaW5hbGl0eS4gU2V0IHRvIDAuCisgKiAxIGJpdCBvZiBob21lLiBTZXQgdG8gMC4KKyAqIDEgYml0IG9mIGNvcHlyaWdodGVkIHN0ZWFtLiBTZXQgdG8gMC4KKyAqIDEgYml0IG9mIGNvcHlyaWdodCBzdGFydC4gU2V0IHRvIDAuCisgKiAxMyBiaXRzIG9mIGZyYW1lIGxlbmd0aC4gSXQgaW5jbHVkZWQgNyBvdCA5IGJ5dGVzIGhlYWRlciBsZW5ndGguCisgKiAgIGl0IGlzIHNldCB0byAocHJvdGVjdGlvbiBhYnNlbnNlPyA3OiA5KSArIHNpemUoQUFDIGZyYW1lKQorICogMTEgYml0cyBvZiBidWZmZXIgZnVsbG5lc3MuIDB4N0ZGIGZvciBWQlIuCisgKiAyIGJpdHMgb2YgZnJhbWVzIGNvdW50IGluIG9uZSBwYWNrZXQuIFNldCB0byAwLgorICovCitzdGF0dXNfdCBBQUNXcml0ZXI6OndyaXRlQWR0c0hlYWRlcih1aW50MzJfdCBmcmFtZUxlbmd0aCkgeworICAgIHVpbnQ4X3QgZGF0YSA9IDB4RkY7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50OF90IGtGaWVsZElkID0gMDsKKyAgICBjb25zdCB1aW50OF90IGtNcGVnTGF5ZXIgPSAwOworICAgIGNvbnN0IHVpbnQ4X3Qga1Byb3RlY3Rpb25BYnNlbnNlID0gMTsgIC8vIDE6IGtBZHRzSGVhZGVyTGVuZ3RoID0gNworICAgIGRhdGEgPSAweEYwOworICAgIGRhdGEgfD0gKGtGaWVsZElkIDw8IDMpOworICAgIGRhdGEgfD0gKGtNcGVnTGF5ZXIgPDwgMSk7CisgICAgZGF0YSB8PSBrUHJvdGVjdGlvbkFic2Vuc2U7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50OF90IGtQcm9maWxlQ29kZSA9IDE7ICAvLyBBQUMtTEMKKyAgICB1aW50OF90IGtTYW1wbGVGcmVxSW5kZXg7CisgICAgQ0hFQ0soZ2V0U2FtcGxlUmF0ZVRhYmxlSW5kZXgobVNhbXBsZVJhdGUsICZrU2FtcGxlRnJlcUluZGV4KSk7CisgICAgY29uc3QgdWludDhfdCBrUHJpdmF0ZVN0cmVhbSA9IDA7CisgICAgY29uc3QgdWludDhfdCBrQ2hhbm5lbENvbmZpZ0NvZGUgPSBtQ2hhbm5lbENvdW50OworICAgIGRhdGEgPSAoa1Byb2ZpbGVDb2RlIDw8IDYpOworICAgIGRhdGEgfD0gKGtTYW1wbGVGcmVxSW5kZXggPDwgMik7CisgICAgZGF0YSB8PSAoa1ByaXZhdGVTdHJlYW0gPDwgMSk7CisgICAgZGF0YSB8PSAoa0NoYW5uZWxDb25maWdDb2RlID4+IDIpOworICAgIHdyaXRlKG1GZCwgJmRhdGEsIDEpOworCisgICAgLy8gNCBiaXRzIGZyb20gb3JpZ2luYWxpdHkgdG8gY29weXJpZ2h0IHN0YXJ0CisgICAgY29uc3QgdWludDhfdCBrQ29weXJpZ2h0ID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCBrRnJhbWVMZW5ndGggPSBmcmFtZUxlbmd0aDsKKyAgICBkYXRhID0gKChrQ2hhbm5lbENvbmZpZ0NvZGUgJiAzKSA8PCA2KTsKKyAgICBkYXRhIHw9IChrQ29weXJpZ2h0IDw8IDIpOworICAgIGRhdGEgfD0gKChrRnJhbWVMZW5ndGggJiAweDE4MDApID4+IDExKTsKKyAgICB3cml0ZShtRmQsICZkYXRhLCAxKTsKKworICAgIGRhdGEgPSAoKGtGcmFtZUxlbmd0aCAmIDB4MDdGOCkgPj4gMyk7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBrQnVmZmVyRnVsbG5lc3MgPSAweDdGRjsgIC8vIFZCUgorICAgIGRhdGEgPSAoKGtGcmFtZUxlbmd0aCAmIDB4MDcpIDw8IDUpOworICAgIGRhdGEgfD0gKChrQnVmZmVyRnVsbG5lc3MgJiAweDA3QzApID4+IDYpOworICAgIHdyaXRlKG1GZCwgJmRhdGEsIDEpOworCisgICAgY29uc3QgdWludDhfdCBrRnJhbWVDb3VudCA9IDA7CisgICAgZGF0YSA9ICgoa0J1ZmZlckZ1bGxuZXNzICYgMHgwM0YpIDw8IDIpOworICAgIGRhdGEgfD0ga0ZyYW1lQ291bnQ7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFBQ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWF4VGltZXN0YW1wVXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBQUNXcml0ZXJUaHJlYWQiLCAwLCAwLCAwKTsKKworICAgIHdoaWxlICghbURvbmUgJiYgZXJyID09IE9LKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzICs9IGtBZHRzSGVhZGVyTGVuZ3RoICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpc0NvZGVjU3BlY2lmaWMgPSAwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY1NwZWNpZmljKSAmJiBpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgICAgIExPR1YoIkRyb3AgY29kZWMgc3BlY2lmaWMgaW5mbyBidWZmZXIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSBtRnJhbWVEdXJhdGlvblVzKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICBMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICAgICAgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVhY2ggb3V0cHV0IEFBQyBhdWRpbyBmcmFtZSB0byB0aGUgZmlsZSBjb250YWlucworICAgICAgICAvLyAxLiBhbiBBRFRTIGhlYWRlciwgZm9sbG93ZWQgYnkKKyAgICAgICAgLy8gMi4gdGhlIGNvbXByZXNzZWQgYXVkaW8gZGF0YS4KKyAgICAgICAgc3NpemVfdCBkYXRhTGVuZ3RoID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICBpZiAod3JpdGVBZHRzSGVhZGVyKGtBZHRzSGVhZGVyTGVuZ3RoICsgZGF0YUxlbmd0aCkgIT0gT0sgfHwKKyAgICAgICAgICAgIGRhdGFMZW5ndGggIT0gd3JpdGUobUZkLCBkYXRhLCBkYXRhTGVuZ3RoKSkgeworICAgICAgICAgICAgZXJyID0gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEFBQ1dyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gbVJlYWNoZWRFT1M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5OTI4ZjQ0Li5kNjI4MzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTUwNSw3ICs1MDUsNyBAQAogCiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCiAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICpidWY7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKICAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKQEAgLTU3NCw3ICs1NzQsNyBAQAogfQogCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKmJ1ZjsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgQ0hFQ0tfRVEobU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKSwgMCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyBpLS0gPiAwOykgewpAQCAtODg4LDggKzg4OCw2IEBACiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KICAgICBDSEVDSyhmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRDYllDclkKQEAgLTkwOSw2ICs5MDcsOCBAQAogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CkBAIC0xNjQ0LDkgKzE2NDQsMTMgQEAKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIGNvbXBvbmVudE5hbWUgPSAiT01YLk52aWRpYS5oMjY0LmRlY29kZSI7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgY29tcG9uZW50TmFtZSA9ICJPTVguTnZpZGlhLmFhYy5kZWNvZGVyIjsKKyAgICAgICAgY29tcG9uZW50TmFtZSA9ICJPTVguZ29vZ2xlLmFhYy5kZWNvZGVyIjsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9ICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpKSB7CisgICAgICAgIGNvbXBvbmVudE5hbWUgPSAiT01YLk52aWRpYS5tcGVnMnYuZGVjb2RlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7CisgICAgICAgIGNvbXBvbmVudE5hbWUgPSAiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIjsKICAgICB9IGVsc2UgewogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTE2NzAsNyArMTY3NCw4IEBACiAgICAgbUNvZGVjLT5jb25maWd1cmVDb2RlYyhtaW1lLmNfc3RyKCksIG1zZyk7CiAKICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopCisgICAgICAgICAgICAmJiBzdHJuY21wKCJPTVguZ29vZ2xlLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSwgMTEpKSB7CiAgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG5hdGl2ZVdpbmRvdygKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOwogICAgICAgICBDSEVDSyhuYXRpdmVXaW5kb3cgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCAwZGIzZDFkLi5iMTBkNTJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTM3LDcgKzM3LDcgQEAKICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgbVJlc3VtZWQoZmFsc2UpIHsKIAotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMpOworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IpOwogICAgIGlmIChtRmQgPj0gMCkgewogICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAgICAgfQpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgfQogCiAgICAgaWYgKHN0b3BwZWRQcmVtYXR1cmVseSkgewotICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUywgVU5LTk9XTl9FUlJPUik7CisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0NPTVBMRVRJT05fU1RBVFVTLCBVTktOT1dOX0VSUk9SKTsKICAgICB9CiAKICAgICBjbG9zZShtRmQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQVZJRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FWSUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxM2NhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FWSUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFWSUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBBVklTb3VyY2UoY29uc3Qgc3A8QVZJRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgdHJhY2tJbmRleCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVZJU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8QVZJRXh0cmFjdG9yPiBtRXh0cmFjdG9yOworICAgIHNpemVfdCBtVHJhY2tJbmRleDsKKyAgICBjb25zdCBBVklFeHRyYWN0b3I6OlRyYWNrICZtVHJhY2s7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOworICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBVklTb3VyY2UpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OkFWSVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QVZJRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgdHJhY2tJbmRleCkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1UcmFja0luZGV4KHRyYWNrSW5kZXgpLAorICAgICAgbVRyYWNrKG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KHRyYWNrSW5kZXgpKSwKKyAgICAgIG1CdWZmZXJHcm91cChOVUxMKSB7Cit9CisKK0FWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjp+QVZJU291cmNlKCkgeworICAgIGlmIChtQnVmZmVyR3JvdXApIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBDSEVDSyghbUJ1ZmZlckdyb3VwKTsKKworICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworCisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtVHJhY2subU1heFNhbXBsZVNpemUpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1UcmFjay5tTWF4U2FtcGxlU2l6ZSkpOworICAgIG1TYW1wbGVJbmRleCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpzdG9wKCkgeworICAgIENIRUNLKG1CdWZmZXJHcm91cCk7CisKKyAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtVHJhY2subU1ldGE7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBDSEVDSyhtQnVmZmVyR3JvdXApOworCisgICAgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbUV4dHJhY3Rvci0+Z2V0U2FtcGxlSW5kZXhBdFRpbWUoCisgICAgICAgICAgICAgICAgICAgIG1UcmFja0luZGV4LCBzZWVrVGltZVVzLCBzZWVrTW9kZSwgJm1TYW1wbGVJbmRleCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9CisgICAgICAgIChtU2FtcGxlSW5kZXggKiAxMDAwMDAwbGwgKiBtVHJhY2subVJhdGUpIC8gbVRyYWNrLm1TY2FsZTsKKworICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIGJvb2wgaXNLZXk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+Z2V0U2FtcGxlSW5mbygKKyAgICAgICAgICAgIG1UcmFja0luZGV4LCBtU2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmaXNLZXkpOworCisgICAgKyttU2FtcGxlSW5kZXg7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIE1lZGlhQnVmZmVyICpvdXQ7CisgICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0KSwgKHN0YXR1c190KU9LKTsKKworICAgIHNzaXplX3QgbiA9IG1FeHRyYWN0b3ItPm1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBvdXQtPmRhdGEoKSwgc2l6ZSk7CisKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIG4gPCAwID8gKHN0YXR1c190KW4gOiAoc3RhdHVzX3QpRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG91dC0+c2V0X3JhbmdlKDAsIHNpemUpOworCisgICAgb3V0LT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICBpZiAoaXNLZXkpIHsKKyAgICAgICAgb3V0LT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICB9CisKKyAgICAqYnVmZmVyID0gb3V0OworCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBVklFeHRyYWN0b3I6OkFWSUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpIHsKKyAgICBtSW5pdENoZWNrID0gcGFyc2VIZWFkZXJzKCk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgfQorfQorCitBVklFeHRyYWN0b3I6On5BVklFeHRyYWN0b3IoKSB7Cit9CisKK3NpemVfdCBBVklFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IEFWSUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgcmV0dXJuIGluZGV4IDwgbVRyYWNrcy5zaXplKCkgPyBuZXcgQVZJU291cmNlKHRoaXMsIGluZGV4KSA6IE5VTEw7Cit9CisKK3NwPE1ldGFEYXRhPiBBVklFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICByZXR1cm4gaW5kZXggPCBtVHJhY2tzLnNpemUoKSA/IG1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubU1ldGEgOiBOVUxMOworfQorCitzcDxNZXRhRGF0YT4gQVZJRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YTsKK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZUhlYWRlcnMoKSB7CisgICAgbVRyYWNrcy5jbGVhcigpOworICAgIG1Nb3ZpZU9mZnNldCA9IDA7CisgICAgbUZvdW5kSW5kZXggPSBmYWxzZTsKKyAgICBtT2Zmc2V0c0FyZUFic29sdXRlID0gZmFsc2U7CisKKyAgICBzc2l6ZV90IHJlcyA9IHBhcnNlQ2h1bmsoMGxsLCAtMWxsKTsKKworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIHJldHVybiAoc3RhdHVzX3QpcmVzOworICAgIH0KKworICAgIGlmIChtTW92aWVPZmZzZXQgPT0gMGxsIHx8ICFtRm91bmRJbmRleCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBBVklFeHRyYWN0b3I6OnBhcnNlQ2h1bmsob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSwgaW50IGRlcHRoKSB7CisgICAgaWYgKHNpemUgPj0gMCAmJiBzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgdG1wWzEyXTsKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgdG1wLCA4KTsKKworICAgIGlmIChuIDwgOCkgeworICAgICAgICByZXR1cm4gKG4gPCAwKSA/IG4gOiAoc3NpemVfdClFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgZm91cmNjID0gVTMyX0FUKHRtcCk7CisgICAgdWludDMyX3QgY2h1bmtTaXplID0gVTMyTEVfQVQoJnRtcFs0XSk7CisKKyAgICBpZiAoc2l6ZSA+PSAwICYmIGNodW5rU2l6ZSArIDggPiBzaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGNoYXIga1ByZWZpeFtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gJmtQcmVmaXhbc3RybGVuKGtQcmVmaXgpIC0gMiAqIGRlcHRoXTsKKworICAgIGlmIChmb3VyY2MgPT0gRk9VUkNDKCdMJywgJ0knLCAnUycsICdUJykKKyAgICAgICAgICAgIHx8IGZvdXJjYyA9PSBGT1VSQ0MoJ1InLCAnSScsICdGJywgJ0YnKSkgeworICAgICAgICAvLyBJdCdzIGEgbGlzdCBvZiBjaHVua3MKKworICAgICAgICBpZiAoc2l6ZSA+PSAwICYmIHNpemUgPCAxMikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDgsICZ0bXBbOF0sIDQpOworCisgICAgICAgIGlmIChuIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIChuIDwgMCkgPyBuIDogKHNzaXplX3QpRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3Qgc3ViRm91cmNjID0gVTMyX0FUKCZ0bXBbOF0pOworCisgICAgICAgIExPR1YoIiVzIG9mZnNldCAweCUwOGxseCBMSVNUIG9mICclYyVjJWMlYycsIHNpemUgJWQiLAorICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgKGNoYXIpKHN1YkZvdXJjYyA+PiAyNCksCisgICAgICAgICAgICAgKGNoYXIpKChzdWJGb3VyY2MgPj4gMTYpICYgMHhmZiksCisgICAgICAgICAgICAgKGNoYXIpKChzdWJGb3VyY2MgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAoY2hhcikoc3ViRm91cmNjICYgMHhmZiksCisgICAgICAgICAgICAgY2h1bmtTaXplIC0gNCk7CisKKyAgICAgICAgaWYgKHN1YkZvdXJjYyA9PSBGT1VSQ0MoJ20nLCAnbycsICd2JywgJ2knKSkgeworICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHBhcnNlIHRoaXMsIGJ1dCB3aWxsIHRha2Ugbm90ZSBvZiB0aGUKKyAgICAgICAgICAgIC8vIG9mZnNldC4KKworICAgICAgICAgICAgbU1vdmllT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2ZmNjRfdCBzdWJPZmZzZXQgPSBvZmZzZXQgKyAxMjsKKyAgICAgICAgICAgIG9mZjY0X3Qgc3ViT2Zmc2V0TGltaXQgPSBzdWJPZmZzZXQgKyBjaHVua1NpemUgLSA0OworICAgICAgICAgICAgd2hpbGUgKHN1Yk9mZnNldCA8IHN1Yk9mZnNldExpbWl0KSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCByZXMgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZUNodW5rKHN1Yk9mZnNldCwgc3ViT2Zmc2V0TGltaXQgLSBzdWJPZmZzZXQsIGRlcHRoICsgMSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN1Yk9mZnNldCArPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCIlcyBvZmZzZXQgMHglMDhsbHggQ0hVTksgJyVjJWMlYyVjJyIsCisgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAoY2hhcikoZm91cmNjID4+IDI0KSwKKyAgICAgICAgICAgICAoY2hhcikoKGZvdXJjYyA+PiAxNikgJiAweGZmKSwKKyAgICAgICAgICAgICAoY2hhcikoKGZvdXJjYyA+PiA4KSAmIDB4ZmYpLAorICAgICAgICAgICAgIChjaGFyKShmb3VyY2MgJiAweGZmKSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncicsICdoJyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VTdHJlYW1IZWFkZXIob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdyJywgJ2YnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZVN0cmVhbUZvcm1hdChvZmZzZXQgKyA4LCBjaHVua1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ3gnLCAnMScpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlSW5kZXgob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtTaXplICYgMSkgeworICAgICAgICArK2NodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gY2h1bmtTaXplICsgODsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKkdldE1JTUVUeXBlRm9ySGFuZGxlcih1aW50MzJfdCBoYW5kbGVyKSB7CisgICAgc3dpdGNoIChoYW5kbGVyKSB7CisgICAgICAgIC8vIFdvdy4uLiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbQorICAgICAgICAvLyBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1JU09fTVBFRy00CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJzMnLCAnSScsICdWJywgJzInKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJzMnLCAnaScsICd2JywgJzInKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0InLCAnTCcsICdaJywgJzAnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdHJywgJ0knKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdWJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICd2JywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdWJywgJ1gnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICd2JywgJ3gnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnWCcsICc1JywgJzAnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAneCcsICc1JywgJzAnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnWCcsICdHJywgJ00nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0UnLCAnTScsICc0JywgJ0EnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0UnLCAnUCcsICdIJywgJ1YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0YnLCAnTScsICdQJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAnbScsICdwJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0YnLCAnVicsICdGJywgJ1cnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnRCcsICdYJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZCcsICd4JywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnNCcsICdDJywgJ0MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnNCcsICdTJywgJzInKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnNCcsICdzJywgJzInKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnUCcsICc0JywgJ1MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnUCcsICc0JywgJ1YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnVicsICdYJywgJ00nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1InLCAnTScsICdQJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1MnLCAnRScsICdEJywgJ0cnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1MnLCAnTScsICdQJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1UnLCAnTScsICdQJywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1cnLCAnVicsICcxJywgJ0YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAnVicsICdJJywgJ0QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAndicsICdpJywgJ0QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3gnLCAndicsICdpJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAnVicsICdJJywgJ1gnKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OnBhcnNlU3RyZWFtSGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplICE9IDU2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gOTkpIHsKKyAgICAgICAgcmV0dXJuIC1FUkFOR0U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIG4gPCAwID8gKHN0YXR1c190KW4gOiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworCisgICAgdWludDMyX3QgdHlwZSA9IFUzMl9BVChkYXRhKTsKKyAgICB1aW50MzJfdCBoYW5kbGVyID0gVTMyX0FUKCZkYXRhWzRdKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IFUzMkxFX0FUKCZkYXRhWzhdKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworCisgICAgdWludDMyX3QgcmF0ZSA9IFUzMkxFX0FUKCZkYXRhWzIwXSk7CisgICAgdWludDMyX3Qgc2NhbGUgPSBVMzJMRV9BVCgmZGF0YVsyNF0pOworCisgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CisgICAgVHJhY2s6OktpbmQga2luZCA9IFRyYWNrOjpPVEhFUjsKKworICAgIGlmICh0eXBlID09IEZPVVJDQygndicsICdpJywgJ2QnLCAncycpKSB7CisgICAgICAgIG1pbWUgPSBHZXRNSU1FVHlwZUZvckhhbmRsZXIoaGFuZGxlcik7CisKKyAgICAgICAgaWYgKG1pbWUgJiYgc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAga2luZCA9IFRyYWNrOjpWSURFTzsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRk9VUkNDKCdhJywgJ3UnLCAnZCcsICdzJykpIHsKKyAgICAgICAgaWYgKG1pbWUgJiYgc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAga2luZCA9IFRyYWNrOjpBVURJTzsKKyAgICB9CisKKyAgICBpZiAoIW1pbWUpIHsKKyAgICAgICAgbWltZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgIH0KKworICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKKworICAgIG1UcmFja3MucHVzaCgpOworICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKTsKKworICAgIHRyYWNrLT5tTWV0YSA9IG1ldGE7CisgICAgdHJhY2stPm1SYXRlID0gcmF0ZTsKKyAgICB0cmFjay0+bVNjYWxlID0gc2NhbGU7CisgICAgdHJhY2stPm1LaW5kID0ga2luZDsKKyAgICB0cmFjay0+bU51bVN5bmNTYW1wbGVzID0gMDsKKyAgICB0cmFjay0+bVRodW1ibmFpbFNhbXBsZVNpemUgPSAwOworICAgIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXggPSAtMTsKKyAgICB0cmFjay0+bU1heFNhbXBsZVNpemUgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OnBhcnNlU3RyZWFtRm9ybWF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtVHJhY2tzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKTsKKworICAgIGlmICh0cmFjay0+bUtpbmQgPT0gVHJhY2s6Ok9USEVSKSB7CisgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBjb250ZW50LCBidXQgdGhhdCdzIG5vdCBhIHBhcnNpbmcgZXJyb3IuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBib29sIGlzVmlkZW8gPSAodHJhY2stPm1LaW5kID09IFRyYWNrOjpWSURFTyk7CisKKyAgICBpZiAoKGlzVmlkZW8gJiYgc2l6ZSA8IDQwKSB8fCAoIWlzVmlkZW8gJiYgc2l6ZSA8IDE4KSkgeworICAgICAgICAvLyBFeHBlY3RlZCBhIEJJVE1BUElORk8gb3IgV0FWRUZPUk1BVEVYIHN0cnVjdHVyZSwgcmVzcGVjdGl2ZWx5LgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKworICAgIGlmIChpc1ZpZGVvKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoID0gVTMyTEVfQVQoJmRhdGFbNF0pOworICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJMRV9BVCgmZGF0YVs4XSk7CisKKyAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IFUxNkxFX0FUKGRhdGEpOworICAgICAgICBpZiAoZm9ybWF0ID09IDB4NTUpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgbnVtQ2hhbm5lbHMgPSBVMTZMRV9BVCgmZGF0YVsyXSk7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBVMzJMRV9BVCgmZGF0YVs0XSk7CisKKyAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitib29sIEFWSUV4dHJhY3Rvcjo6SXNDb3JyZWN0Q2h1bmtUeXBlKAorICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsIFRyYWNrOjpLaW5kIGtpbmQsIHVpbnQzMl90IGNodW5rVHlwZSkgeworICAgIHVpbnQzMl90IGNodW5rQmFzZSA9IGNodW5rVHlwZSAmIDB4ZmZmZjsKKworICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIFRyYWNrOjpWSURFTzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNodW5rQmFzZSAhPSBGT1VSQ0MoMCwgMCwgJ2QnLCAnYycpCisgICAgICAgICAgICAgICAgICAgICYmIGNodW5rQmFzZSAhPSBGT1VSQ0MoMCwgMCwgJ2QnLCAnYicpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFRyYWNrOjpBVURJTzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNodW5rQmFzZSAhPSBGT1VSQ0MoMCwgMCwgJ3cnLCAnYicpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgaGkgPSBjaHVua1R5cGUgPj4gMjQ7CisgICAgdWludDhfdCBsbyA9IChjaHVua1R5cGUgPj4gMTYpICYgMHhmZjsKKworICAgIGlmIChoaSA8ICcwJyB8fCBoaSA+ICc5JyB8fCBsbyA8ICcwJyB8fCBsbyA+ICc5JykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRyYWNrSW5kZXggIT0gKDEwICogKGhpIC0gJzAnKSArIChsbyAtICcwJykpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZUluZGV4KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICgoc2l6ZSAlIDE2KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIG4gPCAwID8gKHN0YXR1c190KW4gOiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IFUzMl9BVChkYXRhKTsKKworICAgICAgICB1aW50OF90IGhpID0gY2h1bmtUeXBlID4+IDI0OworICAgICAgICB1aW50OF90IGxvID0gKGNodW5rVHlwZSA+PiAxNikgJiAweGZmOworCisgICAgICAgIGlmIChoaSA8ICcwJyB8fCBoaSA+ICc5JyB8fCBsbyA8ICcwJyB8fCBsbyA+ICc5JykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gMTAgKiAoaGkgLSAnMCcpICsgKGxvIC0gJzAnKTsKKworICAgICAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgaWYgKCFJc0NvcnJlY3RDaHVua1R5cGUoLTEsIHRyYWNrLT5tS2luZCwgY2h1bmtUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjay0+bUtpbmQgPT0gVHJhY2s6Ok9USEVSKSB7CisgICAgICAgICAgICBkYXRhICs9IDE2OworICAgICAgICAgICAgc2l6ZSAtPSAxNjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBVMzJMRV9BVCgmZGF0YVs0XSk7CisgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IFUzMkxFX0FUKCZkYXRhWzhdKTsKKyAgICAgICAgdWludDMyX3QgY2h1bmtTaXplID0gVTMyTEVfQVQoJmRhdGFbMTJdKTsKKworICAgICAgICBpZiAoY2h1bmtTaXplID4gdHJhY2stPm1NYXhTYW1wbGVTaXplKSB7CisgICAgICAgICAgICB0cmFjay0+bU1heFNhbXBsZVNpemUgPSBjaHVua1NpemU7CisgICAgICAgIH0KKworICAgICAgICB0cmFjay0+bVNhbXBsZXMucHVzaCgpOworCisgICAgICAgIFNhbXBsZUluZm8gKmluZm8gPQorICAgICAgICAgICAgJnRyYWNrLT5tU2FtcGxlcy5lZGl0SXRlbUF0KHRyYWNrLT5tU2FtcGxlcy5zaXplKCkgLSAxKTsKKworICAgICAgICBpbmZvLT5tT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBpbmZvLT5tSXNLZXkgPSAoZmxhZ3MgJiAweDEwKSAhPSAwOworCisgICAgICAgIGlmIChpbmZvLT5tSXNLZXkpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE51bVN5bmNTYW1wbGVzVG9TY2FuID0gMjA7CisKKyAgICAgICAgICAgIGlmICh0cmFjay0+bU51bVN5bmNTYW1wbGVzIDwga01heE51bVN5bmNTYW1wbGVzVG9TY2FuKSB7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rU2l6ZSA+IHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVRodW1ibmFpbFNhbXBsZVNpemUgPSBjaHVua1NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNhbXBsZXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrdHJhY2stPm1OdW1TeW5jU2FtcGxlczsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gMTY7CisgICAgICAgIHNpemUgLT0gMTY7CisgICAgfQorCisgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgeworICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGJvb2wgaXNLZXk7CisgICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZUluZm8oMCwgMCwgJm9mZnNldCwgJnNpemUsICZpc0tleSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA9ICFtT2Zmc2V0c0FyZUFic29sdXRlOworICAgICAgICAgICAgZXJyID0gZ2V0U2FtcGxlSW5mbygwLCAwLCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5KTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0dWKCJDaHVuayBvZmZzZXRzIGFyZSAlcyIsCisgICAgICAgICAgICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA/ICJhYnNvbHV0ZSIgOiAibW92aWUtY2h1bmsgcmVsYXRpdmUiKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQorICAgICAgICAgICAgKHRyYWNrLT5tU2FtcGxlcy5zaXplKCkgKiAxMDAwMDAwbGwgKiB0cmFjay0+bVJhdGUpIC8gdHJhY2stPm1TY2FsZTsKKworICAgICAgICBMT0dWKCJ0cmFjayAlZCBkdXJhdGlvbiA9ICUuMmYgc2VjcyIsIGksIGR1cmF0aW9uVXMgLyAxRTYpOworCisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCB0cmFjay0+bU1heFNhbXBsZVNpemUpOworCisgICAgICAgIGNvbnN0IGNoYXIgKnRtcDsKKyAgICAgICAgQ0hFQ0sodHJhY2stPm1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0bXApKTsKKworICAgICAgICBBU3RyaW5nIG1pbWUgPSB0bXA7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KQorICAgICAgICAgICAgICAgICYmIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXggPj0gMCkgeworICAgICAgICAgICAgaW50NjRfdCB0aHVtYm5haWxUaW1lVXMgPQorICAgICAgICAgICAgICAgICh0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ICogMTAwMDAwMGxsICogdHJhY2stPm1SYXRlKQorICAgICAgICAgICAgICAgICAgICAvIHRyYWNrLT5tU2NhbGU7CisKKyAgICAgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbUZvdW5kSW5kZXggPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc2l6ZV90IEdldFNpemVXaWR0aChzaXplX3QgeCkgeworICAgIHNpemVfdCBuID0gMTsKKyAgICB3aGlsZSAoeCA+IDEyNykgeworICAgICAgICArK247CisgICAgICAgIHggPj49IDc7CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgdWludDhfdCAqRW5jb2RlU2l6ZSh1aW50OF90ICpkc3QsIHNpemVfdCB4KSB7CisgICAgd2hpbGUgKHggPiAxMjcpIHsKKyAgICAgICAgKmRzdCsrID0gKHggJiAweDdmKSB8IDB4ODA7CisgICAgICAgIHggPj49IDc7CisgICAgfQorICAgICpkc3QrKyA9IHg7CisgICAgcmV0dXJuIGRzdDsKK30KKworc3A8QUJ1ZmZlcj4gTWFrZU1QRUc0VmlkZW9Db2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmY29uZmlnKSB7CisgICAgc2l6ZV90IGxlbjEgPSBjb25maWctPnNpemUoKSArIEdldFNpemVXaWR0aChjb25maWctPnNpemUoKSkgKyAxOworICAgIHNpemVfdCBsZW4yID0gbGVuMSArIEdldFNpemVXaWR0aChsZW4xKSArIDEgKyAxMzsKKyAgICBzaXplX3QgbGVuMyA9IGxlbjIgKyBHZXRTaXplV2lkdGgobGVuMikgKyAxICsgMzsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGxlbjMpOworICAgIHVpbnQ4X3QgKmRzdCA9IGNzZC0+ZGF0YSgpOworICAgICpkc3QrKyA9IDB4MDM7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjIgKyAzKTsKKyAgICAqZHN0KysgPSAweDAwOyAgLy8gRVNfSUQKKyAgICAqZHN0KysgPSAweDAwOworICAgICpkc3QrKyA9IDB4MDA7ICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICpkc3QrKyA9IDB4MDQ7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjEgKyAxMyk7CisgICAgKmRzdCsrID0gMHgwMTsgIC8vIFZpZGVvIElTTy9JRUMgMTQ0OTYtMiBTaW1wbGUgUHJvZmlsZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICAqZHN0KysgPSAweDAwOworICAgIH0KKworICAgICpkc3QrKyA9IDB4MDU7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICBtZW1jcHkoZHN0LCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworICAgIGRzdCArPSBjb25maWctPnNpemUoKTsKKworICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBjc2Q7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6YWRkTVBFRzRDb2RlY1NwZWNpZmljRGF0YShzaXplX3QgdHJhY2tJbmRleCkgeworICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICBvZmY2NF90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBib29sIGlzS2V5OworICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZUluZm8odHJhY2tJbmRleCwgMCwgJm9mZnNldCwgJnNpemUsICZpc0tleSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIG4gPCAwID8gKHN0YXR1c190KW4gOiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCBWT1Agc3RhcnQgY29kZSBmcm9tIHRoZSBmaXJzdAorICAgIC8vIGZyYW1lJ3MgZW5jb2RlZCBkYXRhIGFuZCB1c2UgaXQgdG8gY29uc3RydWN0IGFuIEVTRFMgd2l0aCB0aGUKKyAgICAvLyBjb2RlYyBzcGVjaWZpYyBkYXRhLgorCisgICAgc2l6ZV90IGkgPSAwOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICB3aGlsZSAoaSArIDMgPCBidWZmZXItPnNpemUoKSkgeworICAgICAgICBpZiAoIW1lbWNtcCgiXHgwMFx4MDBceDAxXHhiNiIsICZidWZmZXItPmRhdGEoKVtpXSwgNCkpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIGkpOworCisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gTWFrZU1QRUc0VmlkZW9Db2RlY1NwZWNpZmljRGF0YShidWZmZXIpOworICAgIHRyYWNrLT5tTWV0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OmdldFNhbXBsZUluZm8oCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBib29sICppc0tleSkgeworICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtRVJBTkdFOworICAgIH0KKworICAgIGNvbnN0IFRyYWNrICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgaWYgKHNhbXBsZUluZGV4ID49IHRyYWNrLm1TYW1wbGVzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLUVSQU5HRTsKKyAgICB9CisKKyAgICBjb25zdCBTYW1wbGVJbmZvICZpbmZvID0gdHJhY2subVNhbXBsZXMuaXRlbUF0KHNhbXBsZUluZGV4KTsKKworICAgIGlmICghbU9mZnNldHNBcmVBYnNvbHV0ZSkgeworICAgICAgICAqb2Zmc2V0ID0gaW5mby5tT2Zmc2V0ICsgbU1vdmllT2Zmc2V0ICsgODsKKyAgICB9IGVsc2UgeworICAgICAgICAqb2Zmc2V0ID0gaW5mby5tT2Zmc2V0OworICAgIH0KKworICAgICpzaXplID0gMDsKKworICAgIHVpbnQ4X3QgdG1wWzhdOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgdG1wLCA4KTsKKworICAgIGlmIChuIDwgOCkgeworICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IChzdGF0dXNfdClFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKHRtcCk7CisKKyAgICBpZiAoIUlzQ29ycmVjdENodW5rVHlwZSh0cmFja0luZGV4LCB0cmFjay5tS2luZCwgY2h1bmtUeXBlKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICpvZmZzZXQgKz0gODsKKyAgICAqc2l6ZSA9IFUzMkxFX0FUKCZ0bXBbNF0pOworCisgICAgKmlzS2V5ID0gaW5mby5tSXNLZXk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6Z2V0U2FtcGxlSW5kZXhBdFRpbWUoCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlLAorICAgICAgICBzaXplX3QgKnNhbXBsZUluZGV4KSBjb25zdCB7CisgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIC1FUkFOR0U7CisgICAgfQorCisgICAgY29uc3QgVHJhY2sgJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICBzc2l6ZV90IGNsb3Nlc3RTYW1wbGVJbmRleCA9CisgICAgICAgIHRpbWVVcyAvIHRyYWNrLm1SYXRlICogdHJhY2subVNjYWxlIC8gMTAwMDAwMGxsOworCisgICAgc3NpemVfdCBudW1TYW1wbGVzID0gdHJhY2subVNhbXBsZXMuc2l6ZSgpOworCisgICAgaWYgKGNsb3Nlc3RTYW1wbGVJbmRleCA8IDApIHsKKyAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0gMDsKKyAgICB9IGVsc2UgaWYgKGNsb3Nlc3RTYW1wbGVJbmRleCA+PSBudW1TYW1wbGVzKSB7CisgICAgICAgIGNsb3Nlc3RTYW1wbGVJbmRleCA9IG51bVNhbXBsZXMgLSAxOworICAgIH0KKworICAgIGlmIChtb2RlID09IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICpzYW1wbGVJbmRleCA9IGNsb3Nlc3RTYW1wbGVJbmRleDsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3NpemVfdCBwcmV2U3luY1NhbXBsZUluZGV4ID0gY2xvc2VzdFNhbXBsZUluZGV4OworICAgIHdoaWxlIChwcmV2U3luY1NhbXBsZUluZGV4ID49IDApIHsKKyAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmaW5mbyA9CisgICAgICAgICAgICB0cmFjay5tU2FtcGxlcy5pdGVtQXQocHJldlN5bmNTYW1wbGVJbmRleCk7CisKKyAgICAgICAgaWYgKGluZm8ubUlzS2V5KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC0tcHJldlN5bmNTYW1wbGVJbmRleDsKKyAgICB9CisKKyAgICBzc2l6ZV90IG5leHRTeW5jU2FtcGxlSW5kZXggPSBjbG9zZXN0U2FtcGxlSW5kZXg7CisgICAgd2hpbGUgKG5leHRTeW5jU2FtcGxlSW5kZXggPCBudW1TYW1wbGVzKSB7CisgICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJmluZm8gPQorICAgICAgICAgICAgdHJhY2subVNhbXBsZXMuaXRlbUF0KG5leHRTeW5jU2FtcGxlSW5kZXgpOworCisgICAgICAgIGlmIChpbmZvLm1Jc0tleSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICArK25leHRTeW5jU2FtcGxlSW5kZXg7CisgICAgfQorCisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgIHsKKyAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IHByZXZTeW5jU2FtcGxlSW5kZXg7CisKKyAgICAgICAgICAgIHJldHVybiBwcmV2U3luY1NhbXBsZUluZGV4ID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgIHsKKyAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IG5leHRTeW5jU2FtcGxlSW5kZXg7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0U3luY1NhbXBsZUluZGV4IDwgbnVtU2FtcGxlcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZXZTeW5jU2FtcGxlSW5kZXggPCAwICYmIG5leHRTeW5jU2FtcGxlSW5kZXggPj0gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJldlN5bmNTYW1wbGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlSW5kZXggPSBuZXh0U3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5leHRTeW5jU2FtcGxlSW5kZXggPj0gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IHByZXZTeW5jU2FtcGxlSW5kZXg7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgZGlzdDEgPSBjbG9zZXN0U2FtcGxlSW5kZXggLSBwcmV2U3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgc2l6ZV90IGRpc3QyID0gbmV4dFN5bmNTYW1wbGVJbmRleCAtIGNsb3Nlc3RTYW1wbGVJbmRleDsKKworICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0KKyAgICAgICAgICAgICAgICAoZGlzdDEgPCBkaXN0MikgPyBwcmV2U3luY1NhbXBsZUluZGV4IDogbmV4dFN5bmNTYW1wbGVJbmRleDsKKworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2Jvb2wgU25pZmZBVkkoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKKyAgICBjaGFyIHRtcFsxMl07CisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgMTIpIDwgMTIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbWVtY21wKHRtcCwgIlJJRkYiLCA0KSAmJiAhbWVtY21wKCZ0bXBbOF0sICJBVkkgIiwgNCkpIHsKKyAgICAgICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkpOworICAgICAgICAqY29uZmlkZW5jZSA9IDAuMjsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA4ODA2OWU5Li44YzRiMjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTMsMTEgKzMsMTUgQEAKIAogaW5jbHVkZSBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKIAorQlVJTERfV0lUSF9TT0ZUV0FSRV9ERUNPREVSUyA6PSBmYWxzZQorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFBQ0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFBQ1dyaXRlci5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFNUkV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFNUldyaXRlci5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFWSUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF1ZGlvUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCkBAIC0xOSw2ICsyMyw3IEBACiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZMQUNFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgIEhUVFBCYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEhUVFBTdHJlYW0uY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEpQRUdTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1QM0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCkBAIC00Miw3ICs0Nyw2IEBACiAgICAgICAgIFNob3V0Y2FzdFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCAgICAgICBcCiAgICAgICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwICBcCi0gICAgICAgIFRocmVhZGVkU291cmNlLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRocm90dGxlZFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRpbWVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRpbWVkRXZlbnRRdWV1ZS5jcHAgICAgICAgICAgICAgICBcCkBAIC02OSwzOCArNzMsMTAzIEBACiAgICAgICAgIGxpYnVpICAgICAgICAgICAgIFwKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCi0gICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3l1diBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgICAgICBsaWJkcm1mcmFtZXdvcmsgIFwKICAgICAgICAgbGliY3J5cHRvICAgICAgICBcCiAgICAgICAgIGxpYnNzbCAgICAgICAgICAgXAotICAgICAgICBsaWJndWkKKyAgICAgICAgbGliZ3VpICAgICAgICAgICBcCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNlbmMgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZvcmJpc2RlYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfdnB4ZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IFwKICAgICAgICAgbGlidnB4IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2lkMyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMgXAogICAgICAgICBsaWJGTEFDIFwKIAoraWZlcSAoJChCVUlMRF9XSVRIX1NPRlRXQVJFX0RFQ09ERVJTKSx0cnVlKQorCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgICAgICBUaHJlYWRlZFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y2RlYyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tcDNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdm9yYmlzZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdnB4ZGVjIFwKKyAgICAgICAgbGlidnB4IFwKKworZW5kaWYKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZSBmb2xsb3dpbmcgd2FzIHNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIGV4dGVybmFsL3dlYmtpdC9BbmRyb2lkLm1rIGFuZAorIyBjdXJyZW50bHkgbXVzdCBmb2xsb3cgdGhlIHNhbWUgbG9naWMgdG8gZGV0ZXJtaW5lIGhvdyB3ZWJraXQgd2FzIGJ1aWx0IGFuZAorIyBpZiBpdCdzIHNhZmUgdG8gbGluayBhZ2FpbnN0IGxpYmNocm9taXVtLm5ldAorCisjIFY4IGFsc28gcmVxdWlyZXMgYW4gQVJNdjcgQ1BVLCBhbmQgc2luY2Ugd2UgbXVzdCB1c2UganNjLCB3ZSBjYW5ub3QKKyMgdXNlIHRoZSBDaHJvbWUgaHR0cCBzdGFjayBlaXRoZXIuCitpZm5lcSAoJChzdHJpcCAkKEFSQ0hfQVJNX0hBVkVfQVJNVjdBKSksdHJ1ZSkKKyAgVVNFX0FMVF9IVFRQIDo9IHRydWUKK2VuZGlmCisKKyMgU2VlIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBzdGFjayB0aGV5IHdhbnQgdG8gdXNlCitIVFRQX1NUQUNLID0gJChIVFRQKQorIyBXZSBkZWZhdWx0IHRvIHRoZSBDaHJvbWUgSFRUUCBzdGFjay4KK0RFRkFVTFRfSFRUUCA9IGNocm9tZQorQUxUX0hUVFAgPSBhbmRyb2lkCisKK2lmbmVxICgkKEhUVFBfU1RBQ0spLGNocm9tZSkKKyAgaWZuZXEgKCQoSFRUUF9TVEFDSyksYW5kcm9pZCkKKyAgICAjIE5vIEhUVFAgc3RhY2sgaXMgc3BlY2lmaWVkLCBwaWNrdXAgdGhlIG9uZSB3ZSB3YW50IGFzIGRlZmF1bHQuCisgICAgaWZlcSAoJChVU0VfQUxUX0hUVFApLHRydWUpCisgICAgICBIVFRQX1NUQUNLID0gJChBTFRfSFRUUCkKKyAgICBlbHNlCisgICAgICBIVFRQX1NUQUNLID0gJChERUZBVUxUX0hUVFApCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoSFRUUF9TVEFDSyksY2hyb21lKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKKyAgICAgICAgbGlibG9nICAgICAgICAgICBcCisgICAgICAgIGxpYmljdXVjICAgICAgICAgXAorICAgICAgICBsaWJpY3VpMThuICAgICAgIFwKKyAgICAgICAgbGlieiAgICAgICAgICAgICBcCisgICAgICAgIGxpYmRsICAgICAgICAgICAgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCBcCisgICAgICAgIGxpYmNocm9taXVtX25ldCAgICAgICAgIFwKKyAgICAgICAgbGlid2ViY29yZSAgICAgICAgICAgICAgXAorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzdGxwb3J0CitpbmNsdWRlIGV4dGVybmFsL3N0bHBvcnQvbGlic3RscG9ydC5taworZW5kaWYKKworTE9DQUxfQ1BQRkxBR1MgKz0gLURDSFJPTUlVTV9BVkFJTEFCTEU9MQorCitlbmRpZiAgIyBpZmVxICgkKEhUVFBfU1RBQ0spLGNocm9tZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXApAQCAtMTIzLDYgKzE5MiwxMCBAQAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIAoraWZlcSAoJChCVUlMRF9XSVRIX1NPRlRXQVJFX0RFQ09ERVJTKSx0cnVlKQorICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfU09GVFdBUkVfREVDT0RFUlMKK2VuZGlmCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0CiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBiZDA0YTI2Li5kZDY5ZTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC04NCw3ICs4NCwxMyBAQAogCiAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwogCi0gICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmbUZpcnN0QnVmZmVyKTsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKKyAgICBpZiAobVNlZWtpbmcpIHsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOworICAgICAgICBtU2Vla2luZyA9IGZhbHNlOworICAgIH0KKworICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlciwgJm9wdGlvbnMpOwogICAgIGlmIChtRmlyc3RCdWZmZXJSZXN1bHQgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogICAgICAgICBMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7CiAKQEAgLTExMCw3ICsxMTYsNyBAQAogCiAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBudW1DaGFubmVscywgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKICAgICAgICAgICAgICAgICAmQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLCB0aGlzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTMyLDEwICsxMzgsMTAgQEAKICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpNVVNJQywgbVNhbXBsZVJhdGUsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAorICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgICAgIChudW1DaGFubmVscyA9PSAyKQotICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgICAgICAgICAgICAgOiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgOiBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgICAgIDAsIDAsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKIAogICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKQEAgLTI4MCwxNyArMjg2LDM5IEBACiAgICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOwogfQogCit1aW50MzJfdCBBdWRpb1BsYXllcjo6Z2V0TnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQoKSBjb25zdCB7CisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkT3V0OworICAgIHN0YXR1c190IGVycjsKKworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZE91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWRPdXQpOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0sgfHwgbU51bUZyYW1lc1BsYXllZCA8IG51bUZyYW1lc1BsYXllZE91dCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBtTnVtRnJhbWVzUGxheWVkIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Ym1pdHRlZAorICAgIC8vIHRvIHRoZSBhdWRpbyBzaW5rIGZvciBwbGF5YmFjaywgYnV0IG5vdCBhbGwgb2YgdGhlbQorICAgIC8vIG1heSBoYXZlIHBsYXllZCBvdXQgYnkgbm93LgorICAgIHJldHVybiBtTnVtRnJhbWVzUGxheWVkIC0gbnVtRnJhbWVzUGxheWVkT3V0OworfQorCiBzaXplX3QgQXVkaW9QbGF5ZXI6OmZpbGxCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAobU51bUZyYW1lc1BsYXllZCA9PSAwKSB7CiAgICAgICAgIExPR1YoIkF1ZGlvQ2FsbGJhY2siKTsKICAgICB9CiAKICAgICBpZiAobVJlYWNoZWRFT1MpIHsKLSAgICAgICAgbWVtc2V0KGRhdGEsIDAsIHNpemUpOwotCi0gICAgICAgIHJldHVybiBzaXplOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKKyAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKKyAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKwogICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwogICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7CiAgICAgd2hpbGUgKHNpemVfcmVtYWluaW5nID4gMCkgewpAQCAtMzE3LDcgKzM0NSw3IEBACiAKICAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlZWtDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNDIsNyArMzcwLDM1IEBACiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyICYmICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUygpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHBvc3QgRU9TIHJpZ2h0IGF3YXkgYnV0IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYWxsIGZyYW1lcyBoYXZlIGFjdHVhbGx5IGJlZW4gcGxheWVkIG91dC4KKworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIG51bWJlciBvZiBmcmFtZXMgc3VibWl0dGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrIHRoYXQgeW91IGhhdmVuJ3QgaGVhcmQgeWV0LgorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXROdW1GcmFtZXNQZW5kaW5nUGxheW91dCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyB3ZSdyZSBnb2luZyB0bworICAgICAgICAgICAgICAgICAgICAvLyBzdWJtaXQgdG8gdGhlIEF1ZGlvVHJhY2sgYnkgcmV0dXJuaW5nIGZyb20gdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQWRkaXRpb25hbEZyYW1lcyA9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKz0gbnVtQWRkaXRpb25hbEZyYW1lczsKKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVUb0NvbXBsZXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMGxsICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQpIC8gbVNhbXBsZVJhdGU7CisKKyAgICAgICAgICAgICAgICAgICAgTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICVsbGQgKCVsbGQgdXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1BsYXllZCArIG51bUFkZGl0aW9uYWxGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAqIChtTnVtRnJhbWVzUGxheWVkICsgbnVtQWRkaXRpb25hbEZyYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiJWQgZnJhbWVzIGxlZnQgdG8gcGxheSwgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVRvQ29tcGxldGlvblVzLCB0aW1lVG9Db21wbGV0aW9uVXMgLyAxRTYpOworCisgICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IHRpbWVUb0NvbXBsZXRpb25VcyArIG1MYXRlbmN5VXM7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwpAQCAtMzg2LDggKzQ0MiwxOCBAQAogICAgICAgICBzaXplX3JlbWFpbmluZyAtPSBjb3B5OwogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbU51bUZyYW1lc1BsYXllZCArPSBzaXplX2RvbmUgLyBtRnJhbWVTaXplOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbU51bUZyYW1lc1BsYXllZCArPSBzaXplX2RvbmUgLyBtRnJhbWVTaXplOworICAgIH0KKworICAgIGlmIChwb3N0RU9TKSB7CisgICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvRU9TKHBvc3RFT1NEZWxheVVzKTsKKyAgICB9CisKKyAgICBpZiAocG9zdFNlZWtDb21wbGV0ZSkgeworICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOworICAgIH0KIAogICAgIHJldHVybiBzaXplX2RvbmU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggYmJkZWMwMi4uOTljMzY4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtNjAsOCArNjAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQ6OlJFQ09SRF9OU19FTkFCTEUgIHwKICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkOjpSRUNPUkRfSUlSX0VOQUJMRTsKICAgICBtUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAotICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBjaGFubmVscyA+IDE/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX1NURVJFTzogQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgY2hhbm5lbHMgPiAxPyBBVURJT19DSEFOTkVMX0lOX1NURVJFTzogQVVESU9fQ0hBTk5FTF9JTl9NT05PLAogICAgICAgICAgICAgICAgIDQgKiBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSwgLyogRW5hYmxlIHBpbmctcG9uZyBidWZmZXJzICovCiAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDYWxsYmFja0Z1bmN0aW9uLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCA1OTYyNDU0Li5hYTdlZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvV1ZNRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlICJ0aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgiCisKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgpAQCAtNTcsNyArNTksNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNkZWZpbmUgVVNFX1NVUkZBQ0VfQUxMT0MgMQotI2RlZmluZSBGUkFNRV9EUk9QX0ZSRVEgMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4Nyw3ICsxODgsOSBAQAogICAgICAgbUZsYWdzKDApLAogICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAogICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAotICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCkgeworICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCisgICAgICBtTGFzdFZpZGVvVGltZVVzKC0xKSwKKyAgICAgIG1UZXh0UGxheWVyKE5VTEwpIHsKICAgICBDSEVDS19FUShtQ2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKIAogICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CkBAIC0yNjIsNyArMjY1LDcgQEAKICAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyLgogICAgICAgICAgICAgbVVyaUhlYWRlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAKLSAgICAgICAgICAgIG1GbGFncyB8PSBJTkNPR05JVE87CisgICAgICAgICAgICBtb2RpZnlGbGFncyhJTkNPR05JVE8sIFNFVCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3Niw2ICsyNzksMTIgQEAKICAgICAvLyA6OmZpbmlzaFNldERhdGFTb3VyY2VfbCB0byBhdm9pZCBibG9ja2luZyB0aGUgY2FsbGluZyB0aHJlYWQgaW4KICAgICAvLyBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUZkID0gLTE7CisgICAgICAgIG1TdGF0cy5tVVJJID0gbVVyaTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI5NSw2ICszMDQsMTIgQEAKIAogICAgIG1GaWxlU291cmNlID0gZGF0YVNvdXJjZTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUZkID0gZmQ7CisgICAgICAgIG1TdGF0cy5tVVJJID0gU3RyaW5nOCgpOworICAgIH0KKwogICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZGF0YVNvdXJjZSk7CiB9CiAKQEAgLTMxMCw3ICszMjUsNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKCZtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKG1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOwogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKICAgICAgICAgaWYgKFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEICE9IG1EZWNyeXB0SGFuZGxlLT5zdGF0dXMpIHsKQEAgLTMzMyw2ICszNDgsMTAgQEAKIAogICAgICAgICBpbnQzMl90IGJpdHJhdGU7CiAgICAgICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICBMT0dXKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CisKICAgICAgICAgICAgIHRvdGFsQml0UmF0ZSA9IC0xOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM0NCw2ICszNjMsMTQgQEAKIAogICAgIExPR1YoIm1CaXRyYXRlID0gJWxsZCBiaXRzL3NlYyIsIG1CaXRyYXRlKTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgbVN0YXRzLm1UcmFja3MuY2xlYXIoKTsKKyAgICAgICAgbVN0YXRzLm1BdWRpb1RyYWNrSW5kZXggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXggPSAtMTsKKyAgICB9CisKICAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgewpAQCAtMzY3LDEwICszOTQsMjcgQEAKICAgICAgICAgICAgICAgICBtRGlzcGxheUhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXggPSBtU3RhdHMubVRyYWNrcy5zaXplKCk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm1UcmFja3MucHVzaCgpOworICAgICAgICAgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9CisgICAgICAgICAgICAgICAgICAgICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBzdGF0LT5tTUlNRSA9IG1pbWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICBzZXRBdWRpb1NvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm1BdWRpb1RyYWNrSW5kZXggPSBtU3RhdHMubVRyYWNrcy5zaXplKCk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm1UcmFja3MucHVzaCgpOworICAgICAgICAgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9CisgICAgICAgICAgICAgICAgICAgICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tQXVkaW9UcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBzdGF0LT5tTUlNRSA9IG1pbWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGZvciB2b3JiaXMgYXVkaW8sIG5vbmUgb2YgdGhlIG90aGVyIGF1ZGlvCiAgICAgICAgICAgICAgICAgLy8gZm9ybWF0cyBldmVuIHN1cHBvcnQgdGhpcyByaW5ndG9uZSBzcGVjaWZpYyBoYWNrIGFuZApAQCAtMzgwLDEzICs0MjQsMTEgQEAKICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3A7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkgJiYgbG9vcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVVRPX0xPT1BJTkc7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKEFVVE9fTE9PUElORywgU0VUKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgeworICAgICAgICAgICAgYWRkVGV4dFNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDMwLDcgKzQ3Miw3IEBACiAgICAgfQogCiAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CisgICAgICAgIG1vZGlmeUZsYWdzKFBSRVBBUkVfQ0FOQ0VMTEVELCBTRVQpOwogICAgICAgICBpZiAobUNvbm5lY3RpbmdEYXRhU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIExPR0koImludGVycnVwdGluZyB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIik7CiAgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmRpc2Nvbm5lY3QoKTsKQEAgLTQ3NiwzNSArNTE4LDI0IEBACiAgICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwogCi0gICAgbVZpZGVvUmVuZGVyZXIuY2xlYXIoKTsKLQotICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CisgICAgaWYgKG1UZXh0UGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1UZXh0UGxheWVyOworICAgICAgICBtVGV4dFBsYXllciA9IE5VTEw7CiAgICAgfQogCisgICAgbVZpZGVvUmVuZGVyZXIuY2xlYXIoKTsKKwogICAgIGlmIChtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgewogICAgICAgICBtUlRTUENvbnRyb2xsZXItPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgbVJUU1BDb250cm9sbGVyLmNsZWFyKCk7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgICAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgotICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgTE9HSSgidmlkZW8gZGVjb2RlciBzaHV0ZG93biBjb21wbGV0ZWQiKTsKKyAgICAgICAgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwogICAgIH0KIAogICAgIG1EdXJhdGlvblVzID0gLTE7Ci0gICAgbUZsYWdzID0gMDsKKyAgICBtb2RpZnlGbGFncygwLCBBU1NJR04pOwogICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7CiAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKICAgICBtVmlkZW9UaW1lVXMgPSAwOwpAQCAtNTE5LDYgKzU1MCwyMyBAQAogICAgIG1GaWxlU291cmNlLmNsZWFyKCk7CiAKICAgICBtQml0cmF0ZSA9IC0xOworICAgIG1MYXN0VmlkZW9UaW1lVXMgPSAtMTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUZkID0gLTE7CisgICAgICAgIG1TdGF0cy5tVVJJID0gU3RyaW5nOCgpOworICAgICAgICBtU3RhdHMubUJpdHJhdGUgPSAtMTsKKyAgICAgICAgbVN0YXRzLm1BdWRpb1RyYWNrSW5kZXggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQgPSAwOworICAgICAgICBtU3RhdHMubU51bVZpZGVvRnJhbWVzRHJvcHBlZCA9IDA7CisgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCA9IC0xOworICAgICAgICBtU3RhdHMubVZpZGVvSGVpZ2h0ID0gLTE7CisgICAgICAgIG1TdGF0cy5tRmxhZ3MgPSAwOworICAgICAgICBtU3RhdHMubVRyYWNrcy5jbGVhcigpOworICAgIH0KKwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CkBAIC02NDAsMTUgKzY4OCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhY2hlZERhdGFSZW1haW5pbmcgPCBrTG93V2F0ZXJNYXJrQnl0ZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICVkKSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrTG93V2F0ZXJNYXJrQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQ0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBTRVQpOwogICAgICAgICAgICAgICAgICAgICBwYXVzZV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewogICAgICAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHJlc3VtaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKQEAgLTY5OCwxNSArNzQ3LDE2IEBACiAgICAgICAgICAgICAgICAgJiYgKGNhY2hlZER1cmF0aW9uVXMgPCBrTG93V2F0ZXJNYXJrVXMpKSB7CiAgICAgICAgICAgICBMT0dJKCJjYWNoZSBpcyBydW5uaW5nIGxvdyAoJS4yZiBzZWNzKSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gQ0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgU0VUKTsKICAgICAgICAgICAgIHBhdXNlX2woKTsKICAgICAgICAgICAgIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZER1cmF0aW9uVXMgPiBoaWdoV2F0ZXJNYXJrVXMpIHsKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewogICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKCUuMmYgc2VjcyksIHJlc3VtaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgcGxheV9sKCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKQEAgLTcyMCw2ICs3NzAsMTggQEAKICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNlbmRDYWNoZVN0YXRzKCkgeworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMICYmIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGticHMgPSAwOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgKKyAgICAgICAgICAgICAgICBNRURJQV9JTkZPLCBNRURJQV9JTkZPX05FVFdPUktfQkFORFdJRFRILCBrYnBzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUoKSB7CiAgICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KIApAQCAtNzM3LDcgKzc5OSw3IEBACiAKICAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7CiAKLSAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVRfRU9TLCBTRVQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC03NjEsMjAgKzgyMywyMCBAQAogCiAgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwogCi0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CisgICAgICAgIG1vZGlmeUZsYWdzKEFUX0VPUywgU0VUKTsKICAgICB9CiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBsYXkoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKIAogICAgIHJldHVybiBwbGF5X2woKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGxheV9sKCkgewotICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOworICAgIG1vZGlmeUZsYWdzKFNFRUtfUFJFVklFVywgQ0xFQVIpOwogCiAgICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtNzg4LDggKzg1MCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gUExBWUlORzsKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgbW9kaWZ5RmxhZ3MoUExBWUlORywgU0VUKTsKKyAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgU0VUKTsKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgcG9zaXRpb247CkBAIC04MjMsNyArODg1LDcgQEAKICAgICAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvUGxheWVyOwogICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKChQTEFZSU5HIHwgRklSU1RfRlJBTUUpLCBDTEVBUik7CiAKICAgICAgICAgICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMoCkBAIC04NzUsNyArOTM3LDkgQEAKICAgICB9CiAKICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT1BMQVlFUl9TVEFSVEVEKSkgewotICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9QTEFZRVJfU1RBUlRFRCwgU0VUKTsKKworICAgICAgICBib29sIHdhc1NlZWtpbmcgPSBtQXVkaW9QbGF5ZXItPmlzU2Vla2luZygpOwogCiAgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCiAgICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCkBAIC04ODYsMTEgKzk1MCwxOCBAQAogICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KKworICAgICAgICBpZiAod2FzU2Vla2luZykgeworICAgICAgICAgICAgQ0hFQ0soIW1BdWRpb1BsYXllci0+aXNTZWVraW5nKCkpOworCisgICAgICAgICAgICAvLyBXZSB3aWxsIGhhdmUgZmluaXNoZWQgdGhlIHNlZWsgd2hpbGUgc3RhcnRpbmcgdGhlIGF1ZGlvIHBsYXllci4KKyAgICAgICAgICAgIHBvc3RBdWRpb1NlZWtDb21wbGV0ZV9sKCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwogICAgIH0KIAotICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOworICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIFNFVCk7CiAKICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7CiAKQEAgLTkxNyw2ICs5ODgsMTcgQEAKICAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKICAgICB9CiAKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpKSB7CisgICAgICAgIExPR1YoIkRpc3BsYXkgd2lkdGggY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5V2lkdGgsIGRpc3BsYXlXaWR0aCk7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7CisgICAgfQorICAgIGludDMyX3QgZGlzcGxheUhlaWdodDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKKyAgICAgICAgTE9HVigiRGlzcGxheSBoZWlnaHQgY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OworICAgIH0KKwogICAgIGludDMyX3QgdXNhYmxlV2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7CiAgICAgaW50MzJfdCB1c2FibGVIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7CiAgICAgaWYgKG1EaXNwbGF5V2lkdGggIT0gMCkgewpAQCAtOTI2LDYgKzEwMDgsMTIgQEAKICAgICAgICAgdXNhYmxlSGVpZ2h0ID0gbURpc3BsYXlIZWlnaHQ7CiAgICAgfQogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCA9IHVzYWJsZVdpZHRoOworICAgICAgICBtU3RhdHMubVZpZGVvSGVpZ2h0ID0gdXNhYmxlSGVpZ2h0OworICAgIH0KKwogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewpAQCAtOTY4LDcgKzEwNTYsOSBAQAogICAgIC8vIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuCiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgaWYgKFVTRV9TVVJGQUNFX0FMTE9DICYmIHN0cm5jbXAoY29tcG9uZW50LCAiT01YLiIsIDQpID09IDApIHsKKyAgICBpZiAoVVNFX1NVUkZBQ0VfQUxMT0MKKyAgICAgICAgICAgICYmICFzdHJuY21wKGNvbXBvbmVudCwgIk9NWC4iLCA0KQorICAgICAgICAgICAgJiYgc3RybmNtcChjb21wb25lbnQsICJPTVguZ29vZ2xlLiIsIDExKSkgewogICAgICAgICAvLyBIYXJkd2FyZSBkZWNvZGVycyBhdm9pZCB0aGUgQ1BVIGNvbG9yIGNvbnZlcnNpb24gYnkgZGVjb2RpbmcKICAgICAgICAgLy8gZGlyZWN0bHkgdG8gQU5hdGl2ZUJ1ZmZlcnMsIHNvIHdlIG11c3QgdXNlIGEgcmVuZGVyZXIgdGhhdAogICAgICAgICAvLyBqdXN0IHB1c2hlcyB0aG9zZSBidWZmZXJzIHRvIHRoZSBBTmF0aXZlV2luZG93LgpAQCAtOTg2LDcgKzEwNzYsNyBAQAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGF1c2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKIAogICAgIHJldHVybiBwYXVzZV9sKCk7CiB9CkBAIC0xMDA4LDEwICsxMDk4LDE1IEBACiAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7CisgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIENMRUFSKTsKICAgICB9CiAKLSAgICBtRmxhZ3MgJj0gflBMQVlJTkc7CisgICAgaWYgKG1GbGFncyAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgeworICAgICAgICBtVGV4dFBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBDTEVBUik7CisgICAgfQorCisgICAgbW9kaWZ5RmxhZ3MoUExBWUlORywgQ0xFQVIpOwogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLApAQCAtMTAzOSw3ICsxMTM0LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIG1OYXRpdmVXaW5kb3cgPSBzdXJmYWNlOworICAgIHNldE5hdGl2ZVdpbmRvd19sKHN1cmZhY2UpOwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4gJnN1cmZhY2VUZXh0dXJlKSB7CkBAIC0xMDQ3LDkgKzExNDIsNTggQEAKIAogICAgIG1TdXJmYWNlLmNsZWFyKCk7CiAgICAgaWYgKHN1cmZhY2VUZXh0dXJlICE9IE5VTEwpIHsKLSAgICAgICAgbU5hdGl2ZVdpbmRvdyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChzdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIHNldE5hdGl2ZVdpbmRvd19sKG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChzdXJmYWNlVGV4dHVyZSkpOworICAgIH0KK30KKwordm9pZCBBd2Vzb21lUGxheWVyOjpzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCkgeworICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKKyAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAgICAgfQogCisgICAgbVZpZGVvU291cmNlLT5zdG9wKCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKKyAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5CisgICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCisgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKKyAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKKyAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7CisgICAgICAgIHVzbGVlcCgxMDAwKTsKKyAgICB9CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIExPR0koInZpZGVvIGRlY29kZXIgc2h1dGRvd24gY29tcGxldGVkIik7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6c2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSkgeworICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmU7CisKKyAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR0koImF0dGVtcHRpbmcgdG8gcmVjb25maWd1cmUgdG8gdXNlIG5ldyBzdXJmYWNlIik7CisKKyAgICBib29sIHdhc1BsYXlpbmcgPSAobUZsYWdzICYgUExBWUlORykgIT0gMDsKKworICAgIHBhdXNlX2woKTsKKyAgICBtVmlkZW9SZW5kZXJlci5jbGVhcigpOworCisgICAgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOworCisgICAgQ0hFQ0tfRVEoaW5pdFZpZGVvRGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworCisgICAgaWYgKG1MYXN0VmlkZW9UaW1lVXMgPj0gMCkgeworICAgICAgICBtU2Vla2luZyA9IFNFRUs7CisgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CisgICAgICAgIG1TZWVrVGltZVVzID0gbUxhc3RWaWRlb1RpbWVVczsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoKEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyksIENMRUFSKTsKKyAgICB9CisKKyAgICBpZiAod2FzUGxheWluZykgeworICAgICAgICBwbGF5X2woKTsKKyAgICB9CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0QXVkaW9TaW5rKApAQCAtMTA2MiwxMCArMTIwNiwxMCBAQAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgbUZsYWdzID0gbUZsYWdzICYgfkxPT1BJTkc7CisgICAgbW9kaWZ5RmxhZ3MoTE9PUElORywgQ0xFQVIpOwogCiAgICAgaWYgKHNob3VsZExvb3ApIHsKLSAgICAgICAgbUZsYWdzIHw9IExPT1BJTkc7CisgICAgICAgIG1vZGlmeUZsYWdzKExPT1BJTkcsIFNFVCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTExMSw2ICsxMjU1LDMyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRUaW1lZFRleHRUcmFja0luZGV4KGludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAobVRleHRQbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeyAvLyB0byB0dXJuIG9uIGEgdGV4dCB0cmFjaworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRleHRQbGF5ZXItPnNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW5kZXgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRfUlVOTklORywgU0VUKTsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRQTEFZRVJfU1RBUlRFRCwgU0VUKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIHsgLy8gdG8gdHVybiBvZmYgdGhlIHRleHQgdHJhY2sgZGlzcGxheQorICAgICAgICAgICAgaWYgKG1GbGFncyAgJiBURVhUX1JVTk5JTkcpIHsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmxhZ3MgICYgVEVYVFBMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVFBMQVlFUl9TVEFSVEVELCBDTEVBUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtVGV4dFBsYXllci0+c2V0VGltZWRUZXh0VHJhY2tJbmRleChpbmRleCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCiAvLyBzdGF0aWMKIHZvaWQgQXdlc29tZVBsYXllcjo6T25SVFNQU2Vla0RvbmVXcmFwcGVyKHZvaWQgKmNvb2tpZSkgewogICAgIHN0YXRpY19jYXN0PEF3ZXNvbWVQbGF5ZXIgKj4oY29va2llKS0+b25SVFNQU2Vla0RvbmUoKTsKQEAgLTExMjgsNyArMTI5OCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgIHBsYXlfbCgpOwogICAgIH0KIApAQCAtMTE0MywxMCArMTMxMywxNCBAQAogICAgIG1TZWVraW5nID0gU0VFSzsKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKICAgICBtU2Vla1RpbWVVcyA9IHRpbWVVczsKLSAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOworICAgIG1vZGlmeUZsYWdzKChBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpLCBDTEVBUik7CiAKICAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAKKyAgICBpZiAobUZsYWdzICYgVEVYVFBMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgIG1UZXh0UGxheWVyLT5zZWVrVG8obVNlZWtUaW1lVXMpOworICAgIH0KKwogICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7CiAgICAgICAgIExPR1YoInNlZWtpbmcgd2hpbGUgcGF1c2VkLCBzZW5kaW5nIFNFRUtfQ09NUExFVEUgbm90aWZpY2F0aW9uIgogICAgICAgICAgICAgICIgaW1tZWRpYXRlbHkuIik7CkBAIC0xMTU1LDcgKzEzMjksNyBAQAogICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogCiAgICAgICAgIGlmICgobUZsYWdzICYgUFJFUEFSRUQpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gU0VFS19QUkVWSUVXOworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoU0VFS19QUkVWSUVXLCBTRVQpOwogICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE2OSw3ICsxMzQzLDYgQEAKIAogICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7CiAKICAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKQEAgLTExODYsNiArMTM1OSwxNyBAQAogICAgIG1BdWRpb1RyYWNrID0gc291cmNlOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OmFkZFRleHRTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOworCisgICAgaWYgKG1UZXh0UGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgbVRleHRQbGF5ZXIgPSBuZXcgVGltZWRUZXh0UGxheWVyKHRoaXMsIG1MaXN0ZW5lciwgJm1RdWV1ZSk7CisgICAgfQorCisgICAgbVRleHRQbGF5ZXItPmFkZFRleHRTb3VyY2Uoc291cmNlKTsKK30KKwogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6aW5pdEF1ZGlvRGVjb2RlcigpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKTsKIApAQCAtMTIyMyw2ICsxNDA3LDE5IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBUcmFja1N0YXQgKnN0YXQgPSAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50OworICAgICAgICBpZiAoIW1BdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCkKKyAgICAgICAgICAgICAgICAtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmY29tcG9uZW50KSkgeworICAgICAgICAgICAgY29tcG9uZW50ID0gIm5vbmUiOworICAgICAgICB9CisKKyAgICAgICAgc3RhdC0+bURlY29kZXJOYW1lID0gY29tcG9uZW50OworICAgIH0KKwogICAgIHJldHVybiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIApAQCAtMTMwMiw2ICsxNDk5LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBUcmFja1N0YXQgKnN0YXQgPSAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubVZpZGVvVHJhY2tJbmRleCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50OworICAgICAgICBDSEVDSyhtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNvbXBvbmVudCkpOworCisgICAgICAgIHN0YXQtPm1EZWNvZGVyTmFtZSA9IGNvbXBvbmVudDsKKyAgICB9CisKICAgICByZXR1cm4gbVZpZGVvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKQEAgLTEzMjgsMTEgKzE1MzYsMTEgQEAKICAgICAgICAgLy8gSWYgd2UncmUgcGxheWluZyB2aWRlbyBvbmx5LCByZXBvcnQgc2VlayBjb21wbGV0ZSBub3csCiAgICAgICAgIC8vIG90aGVyd2lzZSBhdWRpbyBwbGF5ZXIgd2lsbCBub3RpZnkgdXMgbGF0ZXIuCiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7CisgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOworICAgIG1vZGlmeUZsYWdzKEZJUlNUX0ZSQU1FLCBTRVQpOwogICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKQEAgLTEzNzAsNyArMTU3OCw3IEBACiAgICAgICAgICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwogCi0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX1JVTk5JTkcsIENMRUFSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKICAgICAgICAgfQpAQCAtMTQxOSw3ICsxNjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhcnRBdWRpb1BsYXllcl9sKCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhWSURFT19BVF9FT1MsIFNFVCk7CiAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTQzNSwxMSArMTY0MywxOCBAQAogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgICAgICsrbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAorICAgIG1MYXN0VmlkZW9UaW1lVXMgPSB0aW1lVXM7CisKICAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7CiAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+IHRpbWVVcykgewogICAgICAgICAgICAgTE9HSSgiWFhYIG1TZWVrVGltZVVzID0gJWxsZCB1cywgdGltZVVzID0gJWxsZCB1cyIsCkBAIC0xNDYzLDExICsxNjc4LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoKG1GbGFncyAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgJiYgIShtRmxhZ3MgJiAoVEVYVF9SVU5OSU5HIHwgU0VFS19QUkVWSUVXKSkpIHsKKyAgICAgICAgbVRleHRQbGF5ZXItPnJlc3VtZSgpOworICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIFNFVCk7CisgICAgfQorCiAgICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwogCiAgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7Ci0gICAgICAgIG1TaW5jZUxhc3REcm9wcGVkID0gMDsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIENMRUFSKTsKICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIHRpbWVVczsKICAgICB9CiAKQEAgLTE1MTQsMTcgKzE3MzMsMTggQEAKIAogICAgICAgICBpZiAobGF0ZW5lc3NVcyA+IDQwMDAwKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gNDBtcyBsYXRlLgotICAgICAgICAgICAgTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7Ci0gICAgICAgICAgICBpZiAoIG1TaW5jZUxhc3REcm9wcGVkID4gRlJBTUVfRFJPUF9GUkVRKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR1YoIndlJ3JlIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSBkcm9wcGluZyBvbmUgYWZ0ZXIgJWQgZnJhbWVzIiwgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNiwgbVNpbmNlTGFzdERyb3BwZWQpOwotICAgICAgICAgICAgICAgIG1TaW5jZUxhc3REcm9wcGVkID0gMDsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpLCBkcm9wcGluZyBmcmFtZSIsCisgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYpOworICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgICAgICAgICAgKyttU3RhdHMubU51bVZpZGVvRnJhbWVzRHJvcHBlZDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMTAwMDApIHsKQEAgLTE1NDIsNyArMTc2Miw2IEBACiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVNpbmNlTGFzdERyb3BwZWQrKzsKICAgICAgICAgbVZpZGVvUmVuZGVyZXItPnJlbmRlcihtVmlkZW9CdWZmZXIpOwogICAgIH0KIApAQCAtMTU1MCw3ICsxNzY5LDcgQEAKICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwogCiAgICAgaWYgKHdhc1NlZWtpbmcgIT0gTk9fU0VFSyAmJiAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgewotICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoU0VFS19QUkVWSUVXLCBDTEVBUik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE1OTIsMTIgKzE4MTEsMTIgQEAKICAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1WaWRlb0xhZ0V2ZW50LCAxMDAwMDAwbGwpOwogfQogCi12b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgpIHsKK3ZvaWQgQXdlc29tZVBsYXllcjo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcykgewogICAgIGlmIChtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudCk7CisgICAgbVF1ZXVlLnBvc3RFdmVudFdpdGhEZWxheShtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50LCBkZWxheVVzKTsKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMoKSB7CkBAIC0xNjI0LDggKzE4NDMsOCBAQAogICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwogICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX0FUX0VPUywgU0VUKTsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIFNFVCk7CiAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7CiAgICAgfQogfQpAQCAtMTY3OSw3ICsxODk4LDcgQEAKICAgICAgICAgbVF1ZXVlU3RhcnRlZCA9IHRydWU7CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IFBSRVBBUklORzsKKyAgICBtb2RpZnlGbGFncyhQUkVQQVJJTkcsIFNFVCk7CiAgICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gbmV3IEF3ZXNvbWVFdmVudCgKICAgICAgICAgICAgIHRoaXMsICZBd2Vzb21lUGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KTsKIApAQCAtMTcwNCw4ICsxOTIzLDEwIEBACiAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIG1Vcmkuc3RyaW5nKCksIDcpCiAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgbVVyaS5zdHJpbmcoKSwgOCkKICAgICAgICAgICAgIHx8IGlzV2lkZXZpbmVTdHJlYW1pbmcpIHsKLSAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IE51SFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIElOQ09HTklUTykgPyBOdUhUVFBEYXRhU291cmNlOjprRmxhZ0luY29nbml0byA6IDApOworICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKAorICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBJTkNPR05JVE8pCisgICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCisgICAgICAgICAgICAgICAgICAgIDogMCk7CiAKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdChtVXJpLCAmbVVyaUhlYWRlcnMpOwpAQCAtMTczNiwzNCArMTk1Nyw0OCBAQAogCiAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKworICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlID0gZGF0YVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKKworICAgICAgICBpZiAoc3RybmNhc2VjbXAoY29udGVudFR5cGUuc3RyaW5nKCksICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgLy8gV2UncmUgbm90IGRvaW5nIHRoaXMgZm9yIHN0cmVhbXMgdGhhdCBhcHBlYXIgdG8gYmUgYXVkaW8tb25seQorICAgICAgICAgICAgLy8gc3RyZWFtcyB0byBlbnN1cmUgdGhhdCBldmVuIGxvdyBiYW5kd2lkdGggc3RyZWFtcyBzdGFydAorICAgICAgICAgICAgLy8gcGxheWluZyBiYWNrIGZhaXJseSBpbnN0YW50bHkuCisKICAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHByZWZpbGwgdGhlIGNhY2hlIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFudGlhdGUKICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0b3IgYmVsb3csIGFzIHRoZSBsYXR0ZXIgaXMgYW4gb3BlcmF0aW9uIHRoYXQgb3RoZXJ3aXNlCiAgICAgICAgICAgICAvLyBjb3VsZCBibG9jayBvbiB0aGUgZGF0YXNvdXJjZSBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KICAgICAgICAgICAgIC8vIER1cmluZyB0aGF0IHRpbWUgd2UnZCBiZSB1bmFibGUgdG8gYWJvcnQgdGhlIHByZXBhcmF0aW9uIHBoYXNlCiAgICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMgcHJlZmlsbC4KKyAgICAgICAgICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBwcmVmaWxsIHRoZSBjYWNoZSBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlCisgICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBiZWxvdywgYXMgdGhlIGxhdHRlciBpcyBhbiBvcGVyYXRpb24gdGhhdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvLyBjb3VsZCBibG9jayBvbiB0aGUgZGF0YXNvdXJjZSBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KKyAgICAgICAgICAgICAgICAvLyBEdXJpbmcgdGhhdCB0aW1lIHdlJ2QgYmUgdW5hYmxlIHRvIGFib3J0IHRoZSBwcmVwYXJhdGlvbiBwaGFzZQorICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcyBwcmVmaWxsLgogCi0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKIAotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICAgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKIAotICAgICAgICAgICAgICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSyB8fCBjYWNoZWREYXRhUmVtYWluaW5nID49IGtIaWdoV2F0ZXJNYXJrQnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSyB8fCBjYWNoZWREYXRhUmVtYWluaW5nID49IGtIaWdoV2F0ZXJNYXJrQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVzbGVlcCgyMDAwMDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHVzbGVlcCgyMDAwMDApOworICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7Ci0gICAgICAgICAgICBMT0dJKCJQcmVwYXJlIGNhbmNlbGxlZCB3aGlsZSB3YWl0aW5nIGZvciBpbml0aWFsIGNhY2hlIGZpbGwuIik7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgeworICAgICAgICAgICAgICAgIExPR0koIlByZXBhcmUgY2FuY2VsbGVkIHdoaWxlIHdhaXRpbmcgZm9yIGluaXRpYWwgY2FjaGUgZmlsbC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykpIHsKICAgICAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewpAQCAtMTgyMiw3ICsyMDU3LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8oJm1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOworICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8obURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CiAgICAgICAgIGlmIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CkBAIC0xODQ5LDcgKzIwODUsNyBAQAogICAgIH0KIAogICAgIG1QcmVwYXJlUmVzdWx0ID0gZXJyOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKTsKKyAgICBtb2RpZnlGbGFncygoUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpLCBDTEVBUik7CiAgICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKICAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7CiB9CkBAIC0xODk3LDcgKzIxMzMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IFBSRVBBUklOR19DT05ORUNURUQ7CisgICAgbW9kaWZ5RmxhZ3MoUFJFUEFSSU5HX0NPTk5FQ1RFRCwgU0VUKTsKIAogICAgIGlmIChpc1N0cmVhbWluZ0hUVFAoKSB8fCBtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgewogICAgICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOwpAQCAtMTkxOCw4ICsyMTU0LDggQEAKICAgICB9CiAKICAgICBtUHJlcGFyZVJlc3VsdCA9IE9LOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKTsKLSAgICBtRmxhZ3MgfD0gUFJFUEFSRUQ7CisgICAgbW9kaWZ5RmxhZ3MoKFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKSwgQ0xFQVIpOworICAgIG1vZGlmeUZsYWdzKFBSRVBBUkVELCBTRVQpOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CiAgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwogfQpAQCAtMTkyOCwxNiArMjE2NCwxMzQgQEAKICAgICByZXR1cm4gbUV4dHJhY3RvckZsYWdzOwogfQogCi12b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RBdWRpb0VPUygpIHsKLSAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woKTsKK3ZvaWQgQXdlc29tZVBsYXllcjo6cG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGRlbGF5VXMpOwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpIHsKLSAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHBvc3RBdWRpb1NlZWtDb21wbGV0ZV9sKCk7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6cG9zdEF1ZGlvU2Vla0NvbXBsZXRlX2woKSB7CisgICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKDAgLyogZGVsYXlVcyAqLyk7Cit9CisKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9UUkFDS19JTkRFWDoKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lZFRleHRMb2NrKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRUaW1lZFRleHRUcmFja0luZGV4KHJlcXVlc3QucmVhZEludDMyKCkpOworICAgICAgICB9CisgICAgICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX0FERF9PVVRfT0ZfQkFORF9TT1VSQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgICAgICAgICBpZiAobVRleHRQbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UZXh0UGxheWVyID0gbmV3IFRpbWVkVGV4dFBsYXllcih0aGlzLCBtTGlzdGVuZXIsICZtUXVldWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVRleHRQbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldENhY2hlU3RhdENvbGxlY3RGcmVxKHJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGZyZXFNcyA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgIExPR0QoIlJlcXVlc3QgdG8ga2VlcCBjYWNoZSBzdGF0cyBpbiB0aGUgcGFzdCAlZCBtcyIsCisgICAgICAgICAgICBmcmVxTXMpOworICAgICAgICByZXR1cm4gbUNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoZnJlcU1zKTsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgIHJldHVybiBPSzsKIH0KIAogYm9vbCBBd2Vzb21lUGxheWVyOjppc1N0cmVhbWluZ0hUVFAoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCB8fCBtV1ZNRXh0cmFjdG9yICE9IE5VTEw7CiB9CiAKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworCisgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CisKKyAgICBmcHJpbnRmKG91dCwgIiBBd2Vzb21lUGxheWVyXG4iKTsKKyAgICBpZiAobVN0YXRzLm1GZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSSglcykiLCBtU3RhdHMubVVSSS5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIGZkKCVkKSIsIG1TdGF0cy5tRmQpOworICAgIH0KKworICAgIGZwcmludGYob3V0LCAiLCBmbGFncygweCUwOHgpIiwgbVN0YXRzLm1GbGFncyk7CisKKyAgICBpZiAobVN0YXRzLm1CaXRyYXRlID49IDApIHsKKyAgICAgICAgZnByaW50ZihvdXQsICIsIGJpdHJhdGUoJWxsZCBicHMpIiwgbVN0YXRzLm1CaXRyYXRlKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKG91dCwgIlxuIik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdGF0cy5tVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IFRyYWNrU3RhdCAmc3RhdCA9IG1TdGF0cy5tVHJhY2tzLml0ZW1BdChpKTsKKworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVHJhY2sgJWRcbiIsIGkgKyAxKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgICBNSU1FKCVzKSIsIHN0YXQubU1JTUUuc3RyaW5nKCkpOworCisgICAgICAgIGlmICghc3RhdC5tRGVjb2Rlck5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiwgZGVjb2RlciglcykiLCBzdGF0Lm1EZWNvZGVyTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKG91dCwgIlxuIik7CisKKyAgICAgICAgaWYgKChzc2l6ZV90KWkgPT0gbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIGZwcmludGYob3V0LAorICAgICAgICAgICAgICAgICAgICAiICAgdmlkZW9EaW1lbnNpb25zKCVkIHggJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0RlY29kZWQoJWxsZCksICIKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRHJvcHBlZCglbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMubVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMubU51bVZpZGVvRnJhbWVzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0Ryb3BwZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgZmNsb3NlKG91dCk7CisgICAgb3V0ID0gTlVMTDsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBd2Vzb21lUGxheWVyOjptb2RpZnlGbGFncyh1bnNpZ25lZCB2YWx1ZSwgRmxhZ01vZGUgbW9kZSkgeworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFNFVDoKKyAgICAgICAgICAgIG1GbGFncyB8PSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENMRUFSOgorICAgICAgICAgICAgbUZsYWdzICY9IH52YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIG1GbGFncyA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUZsYWdzID0gbUZsYWdzOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDhhMjRiYzQuLjYxYmIyYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNzAxLDEyICs3MDEsMTEgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPiAwICYmCi0gICAgICAgIHRpbWVzdGFtcFVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzID4gbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMpIHsKLSAgICAgICAgaWYgKG1OdW1HbGl0Y2hlcyAlIDEwID09IDApIHsgIC8vIERvbid0IHNwYW0gdGhlIGxvZwotICAgICAgICAgICAgTE9HVigiTG9uZyBkZWxheSBkZXRlY3RlZCBpbiB2aWRlbyByZWNvcmRpbmciKTsKKyAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID4gMCkgeworICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyAtIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA+IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKSB7CisgICAgICAgICAgICArK21OdW1HbGl0Y2hlczsKICAgICAgICAgfQotICAgICAgICArK21OdW1HbGl0Y2hlczsKICAgICB9CiAKICAgICAvLyBNYXkgbmVlZCB0byBza2lwIGZyYW1lIG9yIG1vZGlmeSB0aW1lc3RhbXAuIEN1cnJlbnRseSBpbXBsZW1lbnRlZApAQCAtNzMyLDYgKzczMSw3IEBACiAgICAgfQogICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwogCisgICAgQ0hFQ0soZGF0YSAhPSBOVUxMICYmIGRhdGEtPnNpemUoKSA+IDApOwogICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CiAgICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7CkBAIC03NDAsMjggKzc0MCw2IEBACiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogfQogCi1zaXplX3QgQ2FtZXJhU291cmNlOjpnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0IHsKLSAgICBMT0dWKCJnZXROdW1iZXJPZlZpZGVvQnVmZmVycyIpOwotICAgIHNpemVfdCBuQnVmZmVycyA9IDA7Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0sgJiYgbUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgIG5CdWZmZXJzID0gbUNhbWVyYS0+Z2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgcmV0dXJuIG5CdWZmZXJzOwotfQotCi1zcDxJTWVtb3J5PiBDYW1lcmFTb3VyY2U6OmdldFZpZGVvQnVmZmVyKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIExPR1YoImdldFZpZGVvQnVmZmVyOiAlZCIsIGluZGV4KTsKLSAgICBzcDxJTWVtb3J5PiBidWZmZXIgPSAwOwotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIGlmIChtSW5pdENoZWNrID09IE9LICYmIG1DYW1lcmEgIT0gMCkgewotICAgICAgICBidWZmZXIgPSBtQ2FtZXJhLT5nZXRWaWRlb0J1ZmZlcihpbmRleCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KIGJvb2wgQ2FtZXJhU291cmNlOjppc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSBjb25zdCB7CiAgICAgTE9HVigiaXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzIik7CiAgICAgcmV0dXJuIG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcAppbmRleCA2ZGI5MjJlLi4xZjNkNTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAKQEAgLTQxLDcgKzQxLDcgQEAKIGNsYXNzIERSTVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgRFJNU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmbWVkaWFTb3VyY2UsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlICpkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptYW5hZ2VyQ2xpZW50LAogICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkLCBEcm1CdWZmZXIgKmlwbXBCb3gpOwogCkBAIC01Niw3ICs1Niw3IEBACiAKIHByaXZhdGU6CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1PcmlnaW5hbE1lZGlhU291cmNlOwotICAgIERlY3J5cHRIYW5kbGUqIG1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQqIG1Ecm1NYW5hZ2VyQ2xpZW50OwogICAgIHNpemVfdCBtVHJhY2tJZDsKICAgICBtdXRhYmxlIE11dGV4IG1EUk1Mb2NrOwpAQCAtNzAsNyArNzAsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogRFJNU291cmNlOjpEUk1Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZtZWRpYVNvdXJjZSwKLSAgICAgICAgRGVjcnlwdEhhbmRsZSAqZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCiAgICAgICAgIERybU1hbmFnZXJDbGllbnQgKm1hbmFnZXJDbGllbnQsCiAgICAgICAgIGludDMyX3QgdHJhY2tJZCwgRHJtQnVmZmVyICppcG1wQm94KQogICAgIDogbU9yaWdpbmFsTWVkaWFTb3VyY2UobWVkaWFTb3VyY2UpLApAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgbU9yaWdpbmFsRXh0cmFjdG9yLT5zZXREcm1GbGFnKHRydWUpOwogICAgIG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKS0+c2V0SW50MzIoa0tleUlzRFJNLCAxKTsKIAotICAgIHNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgc291cmNlLT5nZXREcm1JbmZvKG1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOwogfQogCiBEUk1FeHRyYWN0b3I6On5EUk1FeHRyYWN0b3IoKSB7CkBAIC0yNzcsNyArMjc3LDcgQEAKIGJvb2wgU25pZmZEUk0oCiAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIERlY3J5cHRIYW5kbGUgKmRlY3J5cHRIYW5kbGUgPSBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKCk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gZGVjcnlwdEhhbmRsZSA9IHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24oKTsKIAogICAgIGlmIChkZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID09IERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggM2IzODIwOC4uYzE2YjNiNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTE1LDEzICsxNSwxNCBAQAogICovCiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCIKQEAgLTExMSw2ICsxMTIsNyBAQAogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QRUcyVFMpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QMyk7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmQUFDKTsKKyAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZBVkkpOwogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoImRybS5zZXJ2aWNlLmVuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKQEAgLTEyNyw3ICsxMjksNyBAQAogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkgKyA3KTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgIHNwPE51SFRUUERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xNDQsNCArMTQ2LDggQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitTdHJpbmc4IERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggMDJhNzhjOS4uZjJmMzUwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotRGVjcnlwdEhhbmRsZSogRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CiAgICAgfQpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi12b2lkIEZpbGVTb3VyY2U6OmdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgICpoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKK3ZvaWQgRmlsZVNvdXJjZTo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7CisgICAgaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7CiAKICAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhZTI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSFRUUEJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKKyNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKKyNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0hUVFBCYXNlOjpIVFRQQmFzZSgpCisgICAgOiBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAorICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCisgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAorICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzKDApLAorICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzKDApLAorICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgeworfQorCisvLyBzdGF0aWMKK3NwPEhUVFBCYXNlPiBIVFRQQmFzZTo6Q3JlYXRlKHVpbnQzMl90IGZsYWdzKSB7CisjaWYgQ0hST01JVU1fQVZBSUxBQkxFCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmICghcHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtY2hyb21pdW0iLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgIHx8IChzdHJjYXNlY21wKCJmYWxzZSIsIHZhbHVlKSAmJiBzdHJjbXAoIjAiLCB2YWx1ZSkpKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTnVIVFRQRGF0YVNvdXJjZShmbGFncyk7CisgICAgfQorfQorCit2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQmFuZHdpZHRoRW50cnkgZW50cnk7CisgICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOworICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOworICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7CisgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKKworICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7CisgICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgeworICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKKyAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOworICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKKyAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworCisgICAgICAgIGludDY0X3QgdGltZU5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaWYgKHRpbWVOb3dVcyAtIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyA+PQorICAgICAgICAgICAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zICogMTAwMExMKSB7CisKKyAgICAgICAgICAgIGlmIChtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcyA9CisgICAgICAgICAgICAgICAgICAgIChtVG90YWxUcmFuc2ZlckJ5dGVzICogOEUzIC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID0gdGltZU5vd1VzOworICAgICAgICB9CisgICAgfQorCit9CisKK2Jvb2wgSFRUUEJhc2U6OmVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPCAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSFRUUEJhc2U6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmticHMgPSBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIVFRQQmFzZTo6c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChmcmVxTXMgPCBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcworICAgICAgICAgICAgfHwgZnJlcU1zID4ga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMpIHsKKworICAgICAgICBMT0dFKCJmcmVxdWVuY3kgKCVkIG1zKSBpcyBvdXQgb2YgcmFuZ2UgWzEwMDAsIDYwMDAwXSIsIGZyZXFNcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTE9HSSgiZnJlcXVlbmN5IHNldCB0byAlZCBtcyIsIGZyZXFNcyk7CisgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgPSBmcmVxTXM7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKaW5kZXggMDNjZTIwMi4uNWJiZWQ1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL01QM0V4dHJhY3Rvci5oIgogCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKICNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgogI2luY2x1ZGUgImluY2x1ZGUvVkJSSVNlZWtlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvWElOR1NlZWtlci5oIgpAQCAtNDQsMTQzICs0NSw2IEBACiAvLyBZZXMgLi4uIHRoZXJlIGFyZSB0aGluZ3MgdGhhdCBtdXN0IGluZGVlZCBtYXRjaC4uLgogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAotLy8gc3RhdGljCi1ib29sIE1QM0V4dHJhY3Rvcjo6Z2V0X21wM19mcmFtZV9zaXplKAotICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKLSAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSwgaW50ICpvdXRfY2hhbm5lbHMsCi0gICAgICAgIGludCAqb3V0X2JpdHJhdGUpIHsKLSAgICAqZnJhbWVfc2l6ZSA9IDA7Ci0KLSAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKLSAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAob3V0X2NoYW5uZWxzKSB7Ci0gICAgICAgICpvdXRfY2hhbm5lbHMgPSAwOwotICAgIH0KLQotICAgIGlmIChvdXRfYml0cmF0ZSkgewotICAgICAgICAqb3V0X2JpdHJhdGUgPSAwOwotICAgIH0KLQotICAgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKLQotICAgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGxheWVyID0gKGhlYWRlciA+PiAxNykgJiAzOwotCi0gICAgaWYgKGxheWVyID09IDB4MDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gPSAoaGVhZGVyID4+IDE2KSAmIDE7Ci0KLSAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOwotCi0gICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHsKLSAgICAgICAgLy8gRGlzYWxsb3cgImZyZWUiIGJpdHJhdGUuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMCkgJiAzOwotCi0gICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OwotICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOwotICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKLSAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOwotICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKLSAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OwotICAgIH0KLQotICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKLQotICAgIGlmIChsYXllciA9PSAzKSB7Ci0gICAgICAgIC8vIGxheWVyIEkKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHsKLSAgICAgICAgICAgIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LAotICAgICAgICAgICAgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gewotICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsCi0gICAgICAgICAgICAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGJpdHJhdGUgPQotICAgICAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykKLSAgICAgICAgICAgICAgICA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdCi0gICAgICAgICAgICAgICAgOiBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKLQotICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKLSAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGxheWVyIElJIG9yIElJSQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPSB7Ci0gICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKLSAgICAgICAgICAgIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0gewotICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwKLSAgICAgICAgICAgIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKLSAgICAgICAgICAgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LAotICAgICAgICAgICAgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgYml0cmF0ZTsKLSAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgewotICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKQotICAgICAgICAgICAgICAgID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXQotICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFYyIChvciAyLjUpCi0KLSAgICAgICAgICAgIGJpdHJhdGUgPSBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRfYml0cmF0ZSkgewotICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKLSAgICAgICAgICAgICpmcmFtZV9zaXplID0gMTQ0MDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVjIgb3IgVjIuNQotICAgICAgICAgICAgKmZyYW1lX3NpemUgPSA3MjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgewotICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOwotICAgIH0KLQotICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKLSAgICAgICAgaW50IGNoYW5uZWxfbW9kZSA9IChoZWFkZXIgPj4gNikgJiAzOwotCi0gICAgICAgICpvdXRfY2hhbm5lbHMgPSAoY2hhbm5lbF9tb2RlID09IDMpID8gMSA6IDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyBib29sIFJlc3luYygKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKQEAgLTI4Miw3ICsxNDYsNyBAQAogCiAgICAgICAgIHNpemVfdCBmcmFtZV9zaXplOwogICAgICAgICBpbnQgc2FtcGxlX3JhdGUsIG51bV9jaGFubmVscywgYml0cmF0ZTsKLSAgICAgICAgaWYgKCFNUDNFeHRyYWN0b3I6OmdldF9tcDNfZnJhbWVfc2l6ZSgKKyAgICAgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoCiAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVfcmF0ZSwgJm51bV9jaGFubmVscywgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICArK3BvczsKQEAgLTMxNiw3ICsxODAsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzaXplX3QgdGVzdF9mcmFtZV9zaXplOwotICAgICAgICAgICAgaWYgKCFNUDNFeHRyYWN0b3I6OmdldF9tcDNfZnJhbWVfc2l6ZSgKKyAgICAgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAogICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9oZWFkZXIsICZ0ZXN0X2ZyYW1lX3NpemUpKSB7CiAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3NCw2ICsyMzgsOSBAQAogICAgIHNwPE1QM1NlZWtlcj4gbVNlZWtlcjsKICAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKKyAgICBpbnQ2NF90IG1CYXNpc1RpbWVVczsKKyAgICBpbnQ2NF90IG1TYW1wbGVzUmVhZDsKKwogICAgIE1QM1NvdXJjZShjb25zdCBNUDNTb3VyY2UgJik7CiAgICAgTVAzU291cmNlICZvcGVyYXRvcj0oY29uc3QgTVAzU291cmNlICYpOwogfTsKQEAgLTQxOSw3ICsyODYsNyBAQAogICAgIGludCBzYW1wbGVfcmF0ZTsKICAgICBpbnQgbnVtX2NoYW5uZWxzOwogICAgIGludCBiaXRyYXRlOwotICAgIGdldF9tcDNfZnJhbWVfc2l6ZSgKKyAgICBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCiAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKIAogICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOwpAQCAtNDg5LDcgKzM1Niw5IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSB7CisgICAgICBtR3JvdXAoTlVMTCksCisgICAgICBtQmFzaXNUaW1lVXMoMCksCisgICAgICBtU2FtcGxlc1JlYWQoMCkgewogfQogCiBNUDNTb3VyY2U6On5NUDNTb3VyY2UoKSB7CkBAIC01MDksNiArMzc4LDkgQEAKICAgICBtQ3VycmVudFBvcyA9IG1GaXJzdEZyYW1lUG9zOwogICAgIG1DdXJyZW50VGltZVVzID0gMDsKIAorICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOworICAgIG1TYW1wbGVzUmVhZCA9IDA7CisKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICByZXR1cm4gT0s7CkBAIC01NTIsNiArNDI0LDkgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gYWN0dWFsU2Vla1RpbWVVczsKICAgICAgICAgfQorCisgICAgICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOworICAgICAgICBtU2FtcGxlc1JlYWQgPSAwOwogICAgIH0KIAogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CkBAIC01NjIsNiArNDM3LDggQEAKIAogICAgIHNpemVfdCBmcmFtZV9zaXplOwogICAgIGludCBiaXRyYXRlOworICAgIGludCBudW1fc2FtcGxlczsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CiAgICAgZm9yICg7OykgewogICAgICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwgNCk7CiAgICAgICAgIGlmIChuIDwgNCkgewpAQCAtNTc0LDggKzQ1MSw5IEBACiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKIAogICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCi0gICAgICAgICAgICAmJiBNUDNFeHRyYWN0b3I6OmdldF9tcDNfZnJhbWVfc2l6ZSgKLSAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCBOVUxMLCBOVUxMLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgICYmIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsIE5VTEwsCisgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1fc2FtcGxlcykpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYxMyw3ICs0OTEsOSBAQAogICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CiAKICAgICBtQ3VycmVudFBvcyArPSBmcmFtZV9zaXplOwotICAgIG1DdXJyZW50VGltZVVzICs9IGZyYW1lX3NpemUgKiA4MDAwbGwgLyBiaXRyYXRlOworCisgICAgbVNhbXBsZXNSZWFkICs9IG51bV9zYW1wbGVzOworICAgIG1DdXJyZW50VGltZVVzID0gbUJhc2lzVGltZVVzICsgKChtU2FtcGxlc1JlYWQgKiAxMDAwMDAwKSAvIHNhbXBsZV9yYXRlKTsKIAogICAgICpvdXQgPSBidWZmZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCA3Yjk2ZDAxLi41ZmU1MTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TYW1wbGVUYWJsZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgorI2luY2x1ZGUgInRpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuaCIKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCkBAIC0yOSw3ICszMSw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTI2Miw3ICsyNjMsNyBAQAogCiBNUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtSGF2ZU1ldGFkYXRhKGZhbHNlKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSGFzVmlkZW8oZmFsc2UpLAogICAgICAgbUZpcnN0VHJhY2soTlVMTCksCiAgICAgICBtTGFzdFRyYWNrKE5VTEwpLApAQCAtMzYxLDggKzM2Miw4IEBACiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7Ci0gICAgaWYgKG1IYXZlTWV0YWRhdGEpIHsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0lOSVQpIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwpAQCAtMzcwLDE3ICszNzEsMjAgQEAKICAgICB3aGlsZSAoKGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCkpID09IE9LKSB7CiAgICAgfQogCi0gICAgaWYgKG1IYXZlTWV0YWRhdGEpIHsKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewogICAgICAgICBpZiAobUhhc1ZpZGVvKSB7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgInZpZGVvL21wNCIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CiAgICAgfQogCi0gICAgcmV0dXJuIGVycjsKKyAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClOT19JTklUKTsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAogdm9pZCBNUEVHNEV4dHJhY3Rvcjo6c2V0RHJtRmxhZyhib29sIGZsYWcpIHsKQEAgLTY0OSw2ICs2NTMsNyBAQAogICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gKm9mZnNldCArIGNodW5rX3NpemUgLSBkYXRhX29mZnNldDsKIAogICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnYycsICdwJywgJ3InLCAndCcpCisgICAgICAgICAgICAmJiBjaHVua190eXBlICE9IEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpCiAgICAgICAgICAgICAmJiBtUGF0aC5zaXplKCkgPT0gNSAmJiB1bmRlck1ldGFEYXRhUGF0aChtUGF0aCkpIHsKICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CkBAIC03NTUsNyArNzYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZU1ldGFkYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAKICAgICAgICAgICAgICAgICBpZiAoIW1Jc0RybSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgpAQCAtODI5LDYgKzgzNCwzMyBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uICogMTAwMDAwMCkgLyBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOwogCisgICAgICAgICAgICB1aW50OF90IGxhbmdbMl07CisgICAgICAgICAgICBvZmY2NF90IGxhbmdfb2Zmc2V0OworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGxhbmdfb2Zmc2V0ID0gdGltZXNjYWxlX29mZnNldCArIDQgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICBsYW5nX29mZnNldCA9IHRpbWVzY2FsZV9vZmZzZXQgKyA0ICsgNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChsYW5nX29mZnNldCwgJmxhbmcsIHNpemVvZihsYW5nKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobGFuZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgSVNPLTYzOS0yL1QgdGhyZWUgY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUKKyAgICAgICAgICAgIC8vIDEgYml0IHBhZCBmb2xsb3dlZCBieSAzIDUtYml0cyBjaGFyYWN0ZXJzLiBFYWNoIGNoYXJhY3RlcgorICAgICAgICAgICAgLy8gaXMgcGFja2VkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaXRzIEFTQ0lJIHZhbHVlIGFuZCAweDYwLgorICAgICAgICAgICAgY2hhciBsYW5nX2NvZGVbNF07CisgICAgICAgICAgICBsYW5nX2NvZGVbMF0gPSAoKGxhbmdbMF0gPj4gMikgJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbMV0gPSAoKGxhbmdbMF0gJiAweDMpIDw8IDMgfCAobGFuZ1sxXSA+PiA1KSkgKyAweDYwOworICAgICAgICAgICAgbGFuZ19jb2RlWzJdID0gKGxhbmdbMV0gJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbM10gPSAnXDAnOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKwogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEyOTIsNiArMTMyNCwzNyBAQAogICAgICAgICAgICAgcmV0dXJuIHBhcnNlRHJtU0lORihvZmZzZXQsIGRhdGFfb2Zmc2V0KTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlbGxkIGFuZCBkYXRhX29mZnNldCA9ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CisgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3RbY2h1bmtfZGF0YV9zaXplICsgMV07CisgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgIT0gKHNzaXplX3QpY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IGludCBrU2tpcEJ5dGVzT2ZEYXRhQm94ID0gMTY7CisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0xOTAxLDcgKzE5NjQsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgdWludDMyX3QgZHRzOworICAgIHVpbnQzMl90IGN0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTE5MDksNyArMTk3Miw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmZHRzLCAmaXNTeW5jU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xOTM5LDcgKzIwMDIsNyBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpZHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0yMDI1LDE0ICsyMDg4LDE4IEBACiAgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhzcmNPZmZzZXQgKyBtTkFMTGVuZ3RoU2l6ZSA8PSBzaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gKHNyY09mZnNldCArIG1OQUxMZW5ndGhTaXplID4gc2l6ZSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSBzcmNPZmZzZXQgKyBuYWxMZW5ndGggPiBzaXplOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxMZW5ndGggPiBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yMDU3LDcgKzIxMjQsNyBAQAogCiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOwogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdClkdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTIwNzcsNiArMjE0NCwyMCBAQAogICAgIH0KIH0KIAorTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAorICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CisgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBpZiAodHJhY2stPm1ldGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIHRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLCBtaW1lUHJlZml4LCBzdHJsZW4obWltZVByZWZpeCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNCgKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CkBAIC0yMTA5LDYgKzIxOTAsMTQgQEAKICAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAncCcsICc0JyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzInKSwKKworICAgICAgICAvLyBXb24ndCBwcm9taXNlIHRoYXQgdGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGNhbiBiZSBwbGF5ZWQuCisgICAgICAgIC8vIEp1c3QgZ2l2ZSB0aGVzZSBmaWxlIHR5cGVzIGEgY2hhbmNlLgorICAgICAgICBGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCisgICAgICAgIEZPVVJDQygnTScsICdTJywgJ04nLCAnVicpLCAgLy8gU29ueSdzIFBTUAorCisgICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYScpLCAgLy8gM0dQUDIKKyAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAnMicsICdiJyksCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDVkNmVhN2MuLjkwN2ViNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgpAQCAtNDUsNiArNDYsNyBAQAogc3RhdGljIGNvbnN0IGludDY0X3Qga01heDMyQml0RmlsZVNpemUgPSAweDAwN2ZmZmZmZmZMTDsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0ID0gMHgwNzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtJbml0aWFsRGVsYXlUaW1lVXMgICAgID0gNzAwMDAwTEw7CiAKIC8vIFVzaW5nIGxvbmdlciBhZGp1c3RtZW50IHBlcmlvZCB0byBzdXBwcmVzcyBmbHVjdHVhdGlvbnMgaW4KIC8vIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRocwpAQCAtNTIsNyArNTQsNyBAQAogCiBjbGFzcyBNUEVHNFdyaXRlcjo6VHJhY2sgewogcHVibGljOgotICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKTsKIAogICAgIH5UcmFjaygpOwogCkBAIC02MywxMiArNjUsMTMgQEAKIAogICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIGNvbnN0OwogICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdDsKLSAgICB2b2lkIHdyaXRlVHJhY2tIZWFkZXIoaW50MzJfdCB0cmFja0lELCBib29sIHVzZTMyQml0T2Zmc2V0ID0gdHJ1ZSk7CisgICAgdm9pZCB3cml0ZVRyYWNrSGVhZGVyKGJvb2wgdXNlMzJCaXRPZmZzZXQgPSB0cnVlKTsKICAgICB2b2lkIGJ1ZmZlckNodW5rKGludDY0X3QgdGltZXN0YW1wVXMpOwogICAgIGJvb2wgaXNBdmMoKSBjb25zdCB7IHJldHVybiBtSXNBdmM7IH0KICAgICBib29sIGlzQXVkaW8oKSBjb25zdCB7IHJldHVybiBtSXNBdWRpbzsgfQogICAgIGJvb2wgaXNNUEVHNCgpIGNvbnN0IHsgcmV0dXJuIG1Jc01QRUc0OyB9CiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CisgICAgaW50MzJfdCBnZXRUcmFja0lkKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrSWQ7IH0KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC04Miw3ICs4NSw5IEBACiAgICAgYm9vbCBtSXNBdmM7CiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBib29sIG1Jc01QRUc0OworICAgIGludDMyX3QgbVRyYWNrSWQ7CiAgICAgaW50NjRfdCBtVHJhY2tEdXJhdGlvblVzOworICAgIGludDY0X3QgbU1heENodW5rRHVyYXRpb25VczsKIAogICAgIC8vIEZvciByZWFsdGltZSBhcHBsaWNhdGlvbnMsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBtZWRpYSBjbG9jawogICAgIC8vIGZvciB2aWRlbyB0cmFjayBiYXNlZCBvbiB0aGUgYXVkaW8gbWVkaWEgY2xvY2sKQEAgLTE1NSw2ICsxNjAsOCBAQAogCiAgICAgYm9vbCBtUmVhY2hlZEVPUzsKICAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworICAgIGludDY0X3QgbVN0YXJ0VGltZVJlYWxVczsKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVSZWFsVXM7CiAgICAgaW50NjRfdCBtUHJldmlvdXNUcmFja1RpbWVVczsKICAgICBpbnQ2NF90IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXM7CiAKQEAgLTE4NiwxMiArMTkzLDkgQEAKICAgICBjb25zdCB1aW50OF90ICpwYXJzZVBhcmFtU2V0KAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgdHlwZSwgc2l6ZV90ICpwYXJhbVNldExlbik7CiAKLSAgICBzdGF0dXNfdCBtYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgY29weUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgbWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgLy8gVHJhY2sgYXV0aG9yaW5nIHByb2dyZXNzIHN0YXR1cwogICAgIHZvaWQgdHJhY2tQcm9ncmVzc1N0YXR1cyhpbnQ2NF90IHRpbWVVcywgc3RhdHVzX3QgZXJyID0gT0spOwpAQCAtMjEzLDYgKzIxNywzMSBAQAogICAgIHZvaWQgYWRkT25lU3RzY1RhYmxlRW50cnkoc2l6ZV90IGNodW5rSWQsIHNpemVfdCBzYW1wbGVJZCk7CiAgICAgdm9pZCBhZGRPbmVTdHNzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlSWQpOwogICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgc2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKTsKKworICAgIC8vIFdyaXRlIHRoZSBib3hlcworICAgIHZvaWQgd3JpdGVTdGNvQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOworICAgIHZvaWQgd3JpdGVTdHNjQm94KCk7CisgICAgdm9pZCB3cml0ZVN0c3pCb3goKTsKKyAgICB2b2lkIHdyaXRlU3Rzc0JveCgpOworICAgIHZvaWQgd3JpdGVTdHRzQm94KCk7CisgICAgdm9pZCB3cml0ZUQyNjNCb3goKTsKKyAgICB2b2lkIHdyaXRlUGFzcEJveCgpOworICAgIHZvaWQgd3JpdGVBdmNjQm94KCk7CisgICAgdm9pZCB3cml0ZVVybEJveCgpOworICAgIHZvaWQgd3JpdGVEcmVmQm94KCk7CisgICAgdm9pZCB3cml0ZURpbmZCb3goKTsKKyAgICB2b2lkIHdyaXRlRGFtckJveCgpOworICAgIHZvaWQgd3JpdGVNZGhkQm94KHRpbWVfdCBub3cpOworICAgIHZvaWQgd3JpdGVTbWhkQm94KCk7CisgICAgdm9pZCB3cml0ZVZtaGRCb3goKTsKKyAgICB2b2lkIHdyaXRlSGRsckJveCgpOworICAgIHZvaWQgd3JpdGVUa2hkQm94KHRpbWVfdCBub3cpOworICAgIHZvaWQgd3JpdGVNcDRhRXNkc0JveCgpOworICAgIHZvaWQgd3JpdGVNcDR2RXNkc0JveCgpOworICAgIHZvaWQgd3JpdGVBdWRpb0ZvdXJDQ0JveCgpOworICAgIHZvaWQgd3JpdGVWaWRlb0ZvdXJDQ0JveCgpOworICAgIHZvaWQgd3JpdGVTdGJsQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOwogCiAgICAgVHJhY2soY29uc3QgVHJhY2sgJik7CiAgICAgVHJhY2sgJm9wZXJhdG9yPShjb25zdCBUcmFjayAmKTsKQEAgLTIyOSw5ICsyNTgsMTMgQEAKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtTWRhdE9mZnNldCgwKSwKICAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSgwKSwKLSAgICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcygxMDAwMDAwKSB7CisgICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCksCisgICAgICBtTGF0aXR1ZGV4MTAwMDAoMCksCisgICAgICBtTG9uZ2l0dWRleDEwMDAwKDApLAorICAgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUoZmFsc2UpLAorICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKC0xKSB7CiAKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSKTsKICAgICBpZiAobUZkID49IDApIHsKICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogICAgIH0KQEAgLTI0OCw3ICsyODEsMTEgQEAKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtTWRhdE9mZnNldCgwKSwKICAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSgwKSwKLSAgICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcygxMDAwMDAwKSB7CisgICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCksCisgICAgICBtTGF0aXR1ZGV4MTAwMDAoMCksCisgICAgICBtTG9uZ2l0dWRleDEwMDAwKDApLAorICAgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUoZmFsc2UpLAorICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKC0xKSB7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC0yOTUsNyArMzMyLDEyIEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgc291cmNlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHQgdG8gYWRkIHNvdXJjZSBBRlRFUiByZWNvcmRpbmcgaXMgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgVHJhY2sgKnRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHNvdXJjZSwgbVRyYWNrcy5zaXplKCkpOwogICAgIG1UcmFja3MucHVzaF9iYWNrKHRyYWNrKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTQ0NCwyMCArNDg2LDcgQEAKICAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CiAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOwogCi0gICAgYmVnaW5Cb3goImZ0eXAiKTsKLSAgICAgIHsKLSAgICAgICAgaW50MzJfdCBmaWxlVHlwZTsKLSAgICAgICAgaWYgKHBhcmFtICYmIHBhcmFtLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmZmlsZVR5cGUpICYmCi0gICAgICAgICAgICBmaWxlVHlwZSAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewotICAgICAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOwotICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKLSAgICBlbmRCb3goKTsKKyAgICB3cml0ZUZ0eXBCb3gocGFyYW0pOwogCiAgICAgbUZyZWVCb3hPZmZzZXQgPSBtT2Zmc2V0OwogCkBAIC02MzcsNDMgKzY2NiwxMiBAQAogICAgIH0KICAgICBsc2VlazY0KG1GZCwgbU9mZnNldCwgU0VFS19TRVQpOwogCi0gICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgICAgY29uc3Qgb2ZmNjRfdCBtb292T2Zmc2V0ID0gbU9mZnNldDsKICAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSB0cnVlOwogICAgIG1Nb292Qm94QnVmZmVyID0gKHVpbnQ4X3QgKikgbWFsbG9jKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CiAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOwogICAgIENIRUNLKG1Nb292Qm94QnVmZmVyICE9IE5VTEwpOwotICAgIGludDMyX3QgZHVyYXRpb24gPSAobWF4RHVyYXRpb25VcyAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OwotCi0gICAgYmVnaW5Cb3goIm1vb3YiKTsKLQotICAgICAgYmVnaW5Cb3goIm12aGQiKTsKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgIHdyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKLSAgICAgICAgd3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKLSAgICAgICAgd3JpdGVJbnQzMihtVGltZVNjYWxlKTsgICAgLy8gbXZoZCB0aW1lc2NhbGUKLSAgICAgICAgd3JpdGVJbnQzMihkdXJhdGlvbik7Ci0gICAgICAgIHdyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIHJhdGU6IDEuMAotICAgICAgICB3cml0ZUludDE2KDB4MTAwKTsgICAgICAgICAvLyB2b2x1bWUKLSAgICAgICAgd3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgd3JpdGVDb21wb3NpdGlvbk1hdHJpeCgwKTsgLy8gbWF0cml4Ci0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIHdyaXRlSW50MzIobVRyYWNrcy5zaXplKCkgKyAxKTsgIC8vIG5leHRUcmFja0lECi0gICAgICBlbmRCb3goKTsgIC8vIG12aGQKLQotICAgICAgaW50MzJfdCBpZCA9IDE7Ci0gICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwotICAgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0LCArK2lkKSB7Ci0gICAgICAgICAgKCppdCktPndyaXRlVHJhY2tIZWFkZXIoaWQsIG1Vc2UzMkJpdE9mZnNldCk7Ci0gICAgICB9Ci0gICAgZW5kQm94KCk7ICAvLyBtb292CisgICAgd3JpdGVNb292Qm94KG1heER1cmF0aW9uVXMpOwogCiAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CiAgICAgaWYgKG1TdHJlYW1hYmxlRmlsZSkgewpAQCAtNzAzLDkgKzcwMSw5NiBAQAogICAgIG1GZCA9IC0xOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogICAgIG1TdGFydGVkID0gZmFsc2U7CisKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZU12aGRCb3goaW50NjRfdCBkdXJhdGlvblVzKSB7CisgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgICAgYmVnaW5Cb3goIm12aGQiKTsKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICB3cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCisgICAgd3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKKyAgICB3cml0ZUludDMyKG1UaW1lU2NhbGUpOyAgICAvLyBtdmhkIHRpbWVzY2FsZQorICAgIGludDMyX3QgZHVyYXRpb24gPSAoZHVyYXRpb25VcyAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgIHdyaXRlSW50MzIoZHVyYXRpb24pOworICAgIHdyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIHJhdGU6IDEuMAorICAgIHdyaXRlSW50MTYoMHgxMDApOyAgICAgICAgIC8vIHZvbHVtZQorICAgIHdyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIHdyaXRlQ29tcG9zaXRpb25NYXRyaXgoMCk7IC8vIG1hdHJpeAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIHdyaXRlSW50MzIobVRyYWNrcy5zaXplKCkgKyAxKTsgIC8vIG5leHRUcmFja0lECisgICAgZW5kQm94KCk7ICAvLyBtdmhkCit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlTW9vdkJveChpbnQ2NF90IGR1cmF0aW9uVXMpIHsKKyAgICBiZWdpbkJveCgibW9vdiIpOworICAgIHdyaXRlTXZoZEJveChkdXJhdGlvblVzKTsKKyAgICBpZiAobUFyZUdlb1RhZ3NBdmFpbGFibGUpIHsKKyAgICAgICAgd3JpdGVVZHRhQm94KCk7CisgICAgfQorICAgIGludDMyX3QgaWQgPSAxOworICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQsICsraWQpIHsKKyAgICAgICAgKCppdCktPndyaXRlVHJhY2tIZWFkZXIobVVzZTMyQml0T2Zmc2V0KTsKKyAgICB9CisgICAgZW5kQm94KCk7ICAvLyBtb292Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlRnR5cEJveChNZXRhRGF0YSAqcGFyYW0pIHsKKyAgICBiZWdpbkJveCgiZnR5cCIpOworCisgICAgaW50MzJfdCBmaWxlVHlwZTsKKyAgICBpZiAocGFyYW0gJiYgcGFyYW0tPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZmaWxlVHlwZSkgJiYKKyAgICAgICAgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgIH0KKworICAgIHdyaXRlSW50MzIoMCk7CisgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICB3cml0ZUZvdXJjYygiM2dwNCIpOworICAgIGVuZEJveCgpOworfQorCitzdGF0aWMgYm9vbCBpc1Rlc3RNb2RlRW5hYmxlZCgpIHsKKyNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgNSkKKyNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgNSIKKyNlbmRpZgorCisgICAgLy8gVGVzdCBtb2RlIGlzIGVuYWJsZWQgb25seSBpZiBydy5tZWRpYS5yZWNvcmQudGVzdCBzeXN0ZW0KKyAgICAvLyBwcm9wZXJ0eSBpcyBlbmFibGVkLgorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJydy5tZWRpYS5yZWNvcmQudGVzdCIsIHZhbHVlLCBOVUxMKSAmJgorICAgICAgICAoIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICIxIikpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OnNlbmRTZXNzaW9uU3VtbWFyeSgpIHsKKyAgICAvLyBTZW5kIHNlc3Npb24gc3VtbWFyeSBvbmx5IGlmIHRlc3QgbW9kZSBpcyBlbmFibGVkCisgICAgaWYgKCFpc1Rlc3RNb2RlRW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKExpc3Q8Q2h1bmtJbmZvPjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtJbmZvcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbUNodW5rSW5mb3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaW50IHRyYWNrTnVtID0gaXQtPm1UcmFjay0+Z2V0VHJhY2tJZCgpIDw8IDI4OworICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfSU5GTywKKyAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lOVEVSX0NIVU5LX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgaXQtPm1NYXhJbnRlckNodW5rRHVyVXMpOworICAgIH0KK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnNldEludGVybGVhdmVEdXJhdGlvbih1aW50MzJfdCBkdXJhdGlvblVzKSB7CiAgICAgbUludGVybGVhdmVEdXJhdGlvblVzID0gZHVyYXRpb25VczsKICAgICByZXR1cm4gT0s7CkBAIC04NjgsNiArOTUzLDc3IEBACiAgICAgd3JpdGUocywgMSwgNCk7CiB9CiAKKworLy8gV3JpdHRlbiBpbiArLy1ERC5EREREIGZvcm1hdAordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVMYXRpdHVkZShpbnQgZGVncmVleDEwMDAwKSB7CisgICAgYm9vbCBpc05lZ2F0aXZlID0gKGRlZ3JlZXgxMDAwMCA8IDApOworICAgIGNoYXIgc2lnbiA9IGlzTmVnYXRpdmU/ICctJzogJysnOworCisgICAgLy8gSGFuZGxlIHRoZSB3aG9sZSBwYXJ0CisgICAgY2hhciBzdHJbOV07CisgICAgaW50IHdob2xlUGFydCA9IGRlZ3JlZXgxMDAwMCAvIDEwMDAwOworICAgIGlmICh3aG9sZVBhcnQgPT0gMCkgeworICAgICAgICBzbnByaW50ZihzdHIsIDUsICIlYyUuMmQuIiwgc2lnbiwgd2hvbGVQYXJ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihzdHIsIDUsICIlKy4yZC4iLCB3aG9sZVBhcnQpOworICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGUgZnJhY3Rpb25hbCBwYXJ0CisgICAgaW50IGZyYWN0aW9uYWxQYXJ0ID0gZGVncmVleDEwMDAwIC0gKHdob2xlUGFydCAqIDEwMDAwKTsKKyAgICBpZiAoZnJhY3Rpb25hbFBhcnQgPCAwKSB7CisgICAgICAgIGZyYWN0aW9uYWxQYXJ0ID0gLWZyYWN0aW9uYWxQYXJ0OworICAgIH0KKyAgICBzbnByaW50Zigmc3RyWzRdLCA1LCAiJS40ZCIsIGZyYWN0aW9uYWxQYXJ0KTsKKworICAgIC8vIERvIG5vdCB3cml0ZSB0aGUgbnVsbCB0ZXJtaW5hdG9yCisgICAgd3JpdGUoc3RyLCAxLCA4KTsKK30KKworLy8gV3JpdHRlbiBpbiArLy0gRERELkREREQgZm9ybWF0Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUxvbmdpdHVkZShpbnQgZGVncmVleDEwMDAwKSB7CisgICAgYm9vbCBpc05lZ2F0aXZlID0gKGRlZ3JlZXgxMDAwMCA8IDApOworICAgIGNoYXIgc2lnbiA9IGlzTmVnYXRpdmU/ICctJzogJysnOworCisgICAgLy8gSGFuZGxlIHRoZSB3aG9sZSBwYXJ0CisgICAgY2hhciBzdHJbMTBdOworICAgIGludCB3aG9sZVBhcnQgPSBkZWdyZWV4MTAwMDAgLyAxMDAwMDsKKyAgICBpZiAod2hvbGVQYXJ0ID09IDApIHsKKyAgICAgICAgc25wcmludGYoc3RyLCA2LCAiJWMlLjNkLiIsIHNpZ24sIHdob2xlUGFydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoc3RyLCA2LCAiJSsuM2QuIiwgd2hvbGVQYXJ0KTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGZyYWN0aW9uYWwgcGFydAorICAgIGludCBmcmFjdGlvbmFsUGFydCA9IGRlZ3JlZXgxMDAwMCAtICh3aG9sZVBhcnQgKiAxMDAwMCk7CisgICAgaWYgKGZyYWN0aW9uYWxQYXJ0IDwgMCkgeworICAgICAgICBmcmFjdGlvbmFsUGFydCA9IC1mcmFjdGlvbmFsUGFydDsKKyAgICB9CisgICAgc25wcmludGYoJnN0cls1XSwgNSwgIiUuNGQiLCBmcmFjdGlvbmFsUGFydCk7CisKKyAgICAvLyBEbyBub3Qgd3JpdGUgdGhlIG51bGwgdGVybWluYXRvcgorICAgIHdyaXRlKHN0ciwgMSwgOSk7Cit9CisKKy8qCisgKiBHZW9kYXRhIGlzIHN0b3JlZCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCisgKiBsYXRpdHVkZXgxMDAwMCBpcyBsYXRpdHVkZSBpbiBkZWdyZWVzIHRpbWVzIDEwMDAwLCBhbmQKKyAqIGxvbmdpdHVkZXgxMDAwMCBpcyBsb25naXR1ZGUgaW4gZGVncmVlcyB0aW1lcyAxMDAwMC4KKyAqIFRoZSByYW5nZSBmb3IgdGhlIGxhdGl0dWRlIGlzIGluIFstOTAsICs5MF0sIGFuZAorICogVGhlIHJhbmdlIGZvciB0aGUgbG9uZ2l0dWRlIGlzIGluIFstMTgwLCArMTgwXQorICovCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0R2VvRGF0YShpbnQgbGF0aXR1ZGV4MTAwMDAsIGludCBsb25naXR1ZGV4MTAwMDApIHsKKyAgICAvLyBJcyBsYXRpdHVkZSBvciBsb25naXR1ZGUgb3V0IG9mIHJhbmdlPworICAgIGlmIChsYXRpdHVkZXgxMDAwMCA8IC05MDAwMDAgfHwgbGF0aXR1ZGV4MTAwMDAgPiA5MDAwMDAgfHwKKyAgICAgICAgbG9uZ2l0dWRleDEwMDAwIDwgLTE4MDAwMDAgfHwgbG9uZ2l0dWRleDEwMDAwID4gMTgwMDAwMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1MYXRpdHVkZXgxMDAwMCA9IGxhdGl0dWRleDEwMDAwOworICAgIG1Mb25naXR1ZGV4MTAwMDAgPSBsb25naXR1ZGV4MTAwMDA7CisgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICB3cml0ZShkYXRhLCAxLCBzaXplKTsKIH0KQEAgLTk0NSw3ICsxMTAxLDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0V3JpdGVyOjpUcmFjazo6VHJhY2soCi0gICAgICAgIE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKQogICAgIDogbU93bmVyKG93bmVyKSwKICAgICAgIG1NZXRhKHNvdXJjZS0+Z2V0Rm9ybWF0KCkpLAogICAgICAgbVNvdXJjZShzb3VyY2UpLApAQCAtOTUzLDYgKzExMDksNyBAQAogICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICBtUmVzdW1lZChmYWxzZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtVHJhY2tJZCh0cmFja0lkKSwKICAgICAgIG1UcmFja0R1cmF0aW9uVXMoMCksCiAgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoMCksCiAgICAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSh0cnVlKSwKQEAgLTExNDksMTggKzEzMDYsMTQgQEAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQWxsQ2h1bmtzKCkgewogICAgIExPR1YoIndyaXRlQWxsQ2h1bmtzIik7CiAgICAgc2l6ZV90IG91dHN0YW5kaW5nQ2h1bmtzID0gMDsKLSAgICB3aGlsZSAoIW1DaHVua0luZm9zLmVtcHR5KCkpIHsKLSAgICAgICAgTGlzdDxDaHVua0luZm8+OjppdGVyYXRvciBpdCA9IG1DaHVua0luZm9zLmJlZ2luKCk7Ci0gICAgICAgIHdoaWxlICghaXQtPm1DaHVua3MuZW1wdHkoKSkgewotICAgICAgICAgICAgQ2h1bmsgY2h1bms7Ci0gICAgICAgICAgICBpZiAoZmluZENodW5rVG9Xcml0ZSgmY2h1bmspKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVDaHVua1RvRmlsZSgmY2h1bmspOwotICAgICAgICAgICAgICAgICsrb3V0c3RhbmRpbmdDaHVua3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaXQtPm1UcmFjayA9IE5VTEw7Ci0gICAgICAgIG1DaHVua0luZm9zLmVyYXNlKGl0KTsKKyAgICBDaHVuayBjaHVuazsKKyAgICB3aGlsZSAoZmluZENodW5rVG9Xcml0ZSgmY2h1bmspKSB7CisgICAgICAgIHdyaXRlQ2h1bmtUb0ZpbGUoJmNodW5rKTsKKyAgICAgICAgKytvdXRzdGFuZGluZ0NodW5rczsKICAgICB9CisKKyAgICBzZW5kU2Vzc2lvblN1bW1hcnkoKTsKKwogICAgIG1DaHVua0luZm9zLmNsZWFyKCk7CiAgICAgTE9HRCgiJWQgY2h1bmtzIGFyZSB3cml0dGVuIGluIHRoZSBsYXN0IGJhdGNoIiwgb3V0c3RhbmRpbmdDaHVua3MpOwogfQpAQCAtMTE2OCw4ICsxMzIxLDYgQEAKIGJvb2wgTVBFRzRXcml0ZXI6OmZpbmRDaHVua1RvV3JpdGUoQ2h1bmsgKmNodW5rKSB7CiAgICAgTE9HVigiZmluZENodW5rVG9Xcml0ZSIpOwogCi0gICAgLy8gRmluZCB0aGUgc21hbGxlc3QgdGltZXN0YW1wLCBhbmQgd3JpdGUgdGhhdCBjaHVuayBvdXQKLSAgICAvLyBYWFg6IFdoYXQgaWYgc29tZSB0cmFjayBpcyBqdXN0IHRvbyBzbG93PwogICAgIGludDY0X3QgbWluVGltZXN0YW1wVXMgPSAweDdGRkZGRkZGRkZGRkZGRkZMTDsKICAgICBUcmFjayAqdHJhY2sgPSBOVUxMOwogICAgIGZvciAoTGlzdDxDaHVua0luZm8+OjppdGVyYXRvciBpdCA9IG1DaHVua0luZm9zLmJlZ2luKCk7CkBAIC0xMTk4LDYgKzEzNDksMTMgQEAKICAgICAgICAgICAgICpjaHVuayA9ICooaXQtPm1DaHVua3MuYmVnaW4oKSk7CiAgICAgICAgICAgICBpdC0+bUNodW5rcy5lcmFzZShpdC0+bUNodW5rcy5iZWdpbigpKTsKICAgICAgICAgICAgIENIRUNLX0VRKGNodW5rLT5tVHJhY2ssIHRyYWNrKTsKKworICAgICAgICAgICAgaW50NjRfdCBpbnRlckNodW5rVGltZVVzID0KKyAgICAgICAgICAgICAgICBjaHVuay0+bVRpbWVTdGFtcFVzIC0gaXQtPm1QcmV2Q2h1bmtUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIGlmIChpbnRlckNodW5rVGltZVVzID4gaXQtPm1QcmV2Q2h1bmtUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgIGl0LT5tTWF4SW50ZXJDaHVua0R1clVzID0gaW50ZXJDaHVua1RpbWVVczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjQxLDYgKzEzOTksOCBAQAogICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBDaHVua0luZm8gaW5mbzsKICAgICAgICAgaW5mby5tVHJhY2sgPSAqaXQ7CisgICAgICAgIGluZm8ubVByZXZDaHVua1RpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgaW5mby5tTWF4SW50ZXJDaHVua0R1clVzID0gMDsKICAgICAgICAgbUNodW5rSW5mb3MucHVzaF9iYWNrKGluZm8pOwogICAgIH0KIApAQCAtMTI2NCw2ICsxNDI0LDcgQEAKICAgICBpZiAocGFyYW1zID09IE5VTEwgfHwgIXBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7CiAgICAgICAgIHN0YXJ0VGltZVVzID0gMDsKICAgICB9CisgICAgbVN0YXJ0VGltZVJlYWxVcyA9IHN0YXJ0VGltZVVzOwogCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKCFtSXNBdWRpbyAmJiBwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewpAQCAtMTI4OCwxMCArMTQ0OSwxNSBAQAogICAgICAgICAgKiBzZXNzaW9uLCBhbmQgaXQgYWxzbyBoZWxwcyBlbGltaW5hdGUgdGhlICJyZWNvcmRpbmciIHNvdW5kIGZvcgogICAgICAgICAgKiBjYW1jb3JkZXIgYXBwbGljYXRpb25zLgogICAgICAgICAgKgotICAgICAgICAgKiBJZGVhbGx5LCB0aGlzIHBsYXRmb3JtLXNwZWNpZmljIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkCi0gICAgICAgICAqIGluIG1lZGlhX3Byb2ZpbGVzLnhtbCBmaWxlCisgICAgICAgICAqIElmIGNsaWVudCBkb2VzIG5vdCBzZXQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0LCB3ZSBmYWxsIGJhY2sgdG8KKyAgICAgICAgICogdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgZGVsYXkgdmFsdWUuCiAgICAgICAgICAqLwotICAgICAgICBzdGFydFRpbWVVcyArPSA3MDAwMDA7CisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lT2Zmc2V0VXMgPSBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldE1zKCkgKiAxMDAwTEw7CisgICAgICAgIGlmIChzdGFydFRpbWVPZmZzZXRVcyA8IDApIHsgIC8vIFN0YXJ0IHRpbWUgb2Zmc2V0IHdhcyBub3Qgc2V0CisgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lVXMgKz0gc3RhcnRUaW1lT2Zmc2V0VXM7CisgICAgICAgIExPR0koIlN0YXJ0IHRpbWUgb2Zmc2V0OiAlbGxkIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOwogICAgIH0KIAogICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CkBAIC0xMzIyLDYgKzE0ODgsNyBAQAogICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0U2FtcGxlID0gMDsKICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzID0gMDsKICAgICBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyA9IDA7CisgICAgbU1heENodW5rRHVyYXRpb25VcyA9IDA7CiAKICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgJmF0dHIsIFRocmVhZFdyYXBwZXIsIHRoaXMpOwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKQEAgLTE3NTksNiArMTkyNiw3IEBACiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnRocmVhZEVudHJ5KCkgewogICAgIGludDMyX3QgY291bnQgPSAwOwogICAgIGNvbnN0IGludDY0X3QgaW50ZXJsZWF2ZUR1cmF0aW9uVXMgPSBtT3duZXItPmludGVybGVhdmVEdXJhdGlvbigpOworICAgIGNvbnN0IGJvb2wgaGFzTXVsdGlwbGVUcmFja3MgPSAobU93bmVyLT5udW1UcmFja3MoKSA+IDEpOwogICAgIGludDY0X3QgY2h1bmtUaW1lc3RhbXBVcyA9IDA7CiAgICAgaW50MzJfdCBuQ2h1bmtzID0gMDsKICAgICBpbnQzMl90IG5aZXJvTGVuZ3RoRnJhbWVzID0gMDsKQEAgLTE4OTYsNyArMjA2NCw4IEBACiAgICAgICAgIExPR1YoIiVzIHRpbWVzdGFtcFVzOiAlbGxkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgaWYgKG1TYW1wbGVTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgICAgICBtT3duZXItPnNldFN0YXJ0VGltZXN0YW1wVXMobVN0YXJ0VGltZXN0YW1wVXMpOwogICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CkBAIC0xOTkxLDcgKzIxNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJhY2tQcm9ncmVzc1N0YXR1cyh0aW1lc3RhbXBVcyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Pd25lci0+bnVtVHJhY2tzKCkgPT0gMSkgeworICAgICAgICBpZiAoIWhhc011bHRpcGxlVHJhY2tzKSB7CiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Jc0F2Yz8gbU93bmVyLT5hZGRMZW5ndGhQcmVmaXhlZFNhbXBsZV9sKGNvcHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSk7CiAgICAgICAgICAgICBpZiAobUNodW5rT2Zmc2V0cy5lbXB0eSgpKSB7CkBAIC0yMDEwLDcgKzIxNzksMTEgQEAKICAgICAgICAgICAgIGlmIChjaHVua1RpbWVzdGFtcFVzID09IDApIHsKICAgICAgICAgICAgICAgICBjaHVua1RpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBVcyAtIGNodW5rVGltZXN0YW1wVXMgPiBpbnRlcmxlYXZlRHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgIGludDY0X3QgY2h1bmtEdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBjaHVua1RpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIGlmIChjaHVua0R1cmF0aW9uVXMgPiBpbnRlcmxlYXZlRHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtEdXJhdGlvblVzID4gbU1heENodW5rRHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1heENodW5rRHVyYXRpb25VcyA9IGNodW5rRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICArK25DaHVua3M7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuQ2h1bmtzID09IDEgfHwgIC8vIEZpcnN0IGNodW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAoLS0obVN0c2NUYWJsZUVudHJpZXMuZW5kKCkpKS0+c2FtcGxlc1BlckNodW5rICE9CkBAIC0yMDMwLDEwICsyMjAzLDEwIEBACiAgICAgICAgIChPSyAhPSBjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkpKSB7ICAgICAgICAgIC8vIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBtT3duZXItPnRyYWNrUHJvZ3Jlc3NTdGF0dXModGhpcywgLTEsIGVycik7CisgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKG1UcmFja0lkLCAtMSwgZXJyKTsKIAogICAgIC8vIExhc3QgY2h1bmsKLSAgICBpZiAobU93bmVyLT5udW1UcmFja3MoKSA9PSAxKSB7CisgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgxLCBtTnVtU2FtcGxlcyk7CiAgICAgfSBlbHNlIGlmICghbUNodW5rU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KCsrbkNodW5rcywgbUNodW5rU2FtcGxlcy5zaXplKCkpOwpAQCAtMjA2MCw2ICsyMjMzLDkgQEAKIAogICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CiAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgc2VuZFRyYWNrU3VtbWFyeShoYXNNdWx0aXBsZVRyYWNrcyk7CisKICAgICBMT0dJKCJSZWNlaXZlZCB0b3RhbC8wLWxlbmd0aCAoJWQvJWQpIGJ1ZmZlcnMgYW5kIGVuY29kZWQgJWQgZnJhbWVzLiAtICVzIiwKICAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbU51bVNhbXBsZXMsIG1Jc0F1ZGlvPyAiYXVkaW8iOiAidmlkZW8iKTsKICAgICBpZiAobUlzQXVkaW8pIHsKQEAgLTIwNzIsNDYgKzIyNDgsOTQgQEAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6c2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKSB7CisKKyAgICAvLyBTZW5kIHRyYWNrIHN1bW1hcnkgb25seSBpZiB0ZXN0IG1vZGUgaXMgZW5hYmxlZC4KKyAgICBpZiAoIWlzVGVzdE1vZGVFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB0cmFja051bSA9IChtVHJhY2tJZCA8PCAyOCk7CisKKyAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8/IDA6IDEpOworCisgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0RVUkFUSU9OX01TLAorICAgICAgICAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzIC8gMTAwMCk7CisKKyAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fRU5DT0RFRF9GUkFNRVMsCisgICAgICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzKTsKKworICAgIHsKKyAgICAgICAgLy8gVGhlIHN5c3RlbSBkZWxheSB0aW1lIGV4Y2x1ZGluZyB0aGUgcmVxdWVzdGVkIGluaXRpYWwgZGVsYXkgdGhhdAorICAgICAgICAvLyBpcyB1c2VkIHRvIGVsaW1pbmF0ZSB0aGUgcmVjb3JkaW5nIHNvdW5kLgorICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRNcygpICogMTAwMExMOworICAgICAgICBpZiAoc3RhcnRUaW1lT2Zmc2V0VXMgPCAwKSB7ICAvLyBTdGFydCB0aW1lIG9mZnNldCB3YXMgbm90IHNldAorICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgaW5pdGlhbERlbGF5VXMgPQorICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyAtIG1TdGFydFRpbWVSZWFsVXMgLSBzdGFydFRpbWVPZmZzZXRVczsKKworICAgICAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fSU5JVElBTF9ERUxBWV9NUywKKyAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxEZWxheVVzKSAvIDEwMDApOworICAgIH0KKworICAgIG1Pd25lci0+bm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19EQVRBX0tCWVRFUywKKyAgICAgICAgICAgICAgICAgICAgbU1kYXRTaXplQnl0ZXMgLyAxMDI0KTsKKworICAgIGlmIChoYXNNdWx0aXBsZVRyYWNrcykgeworICAgICAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fTUFYX0NIVU5LX0RVUl9NUywKKyAgICAgICAgICAgICAgICAgICAgbU1heENodW5rRHVyYXRpb25VcyAvIDEwMDApOworCisgICAgICAgIGludDY0X3QgbW9vdlN0YXJ0VGltZVVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVzdGFtcFVzKCk7CisgICAgICAgIGlmIChtU3RhcnRUaW1lc3RhbXBVcyAhPSBtb292U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lT2Zmc2V0VXMgPSBtU3RhcnRUaW1lc3RhbXBVcyAtIG1vb3ZTdGFydFRpbWVVczsKKyAgICAgICAgICAgIG1Pd25lci0+bm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19TVEFSVF9PRkZTRVRfTVMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZU9mZnNldFVzIC8gMTAwMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKICAgICBMT0dWKCJ0cmFja1Byb2dyZXNzU3RhdHVzOiAlbGxkIHVzIiwgdGltZVVzKTsKICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDAgJiYKICAgICAgICAgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMgPj0gbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcykgewogICAgICAgICBMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOwotICAgICAgICBtT3duZXItPnRyYWNrUHJvZ3Jlc3NTdGF0dXModGhpcywgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CisgICAgICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyhtVHJhY2tJZCwgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CiAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOwogICAgIH0KIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6dHJhY2tQcm9ncmVzc1N0YXR1cygKLSAgICAgICAgY29uc3QgTVBFRzRXcml0ZXI6OlRyYWNrKiB0cmFjaywgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgeworICAgICAgICBzaXplX3QgdHJhY2tJZCwgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpbnQzMl90IG5UcmFja3MgPSBtVHJhY2tzLnNpemUoKTsKLSAgICBDSEVDSyhuVHJhY2tzID49IDEpOwotICAgIENIRUNLKG5UcmFja3MgPCA2NCk7ICAvLyBBcmJpdHJhcnkgbnVtYmVyCi0KLSAgICBpbnQzMl90IHRyYWNrTnVtID0gMDsKLSAgICBDSEVDSyh0cmFja051bSA8IG5UcmFja3MpOwotICAgIHRyYWNrTnVtIDw8PSAxNjsKKyAgICBpbnQzMl90IHRyYWNrTnVtID0gKHRyYWNrSWQgPDwgMjgpOwogCiAgICAgLy8gRXJyb3Igbm90aWZpY2F0aW9uCiAgICAgLy8gRG8gbm90IGNvbnNpZGVyIEVSUk9SX0VORF9PRl9TVFJFQU0gYW4gZXJyb3IKICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9FUlJPUiwKLSAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiwKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0VSUk9SLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19FUlJPUl9HRU5FUkFMLAogICAgICAgICAgICAgICAgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmICh0aW1lVXMgPT0gLTEpIHsKICAgICAgICAgLy8gU2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbgotICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywKLSAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUywKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fQ09NUExFVElPTl9TVEFUVVMsCiAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gU2VuZCBwcm9ncmVzcyBzdGF0dXMKLSAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sCi0gICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX0lORk9fUFJPR1JFU1NfVElNRV9TVEFUVVMsCisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX1BST0dSRVNTX0lOX1RJTUUsCiAgICAgICAgICAgICAgICB0aW1lVXMgLyAxMDAwKTsKICAgICB9CiB9CkBAIC0yMTY5LDM4OCArMjM5Myw0ODQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKAotICAgICAgICBpbnQzMl90IHRyYWNrSUQsIGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKIAogICAgIExPR1YoIiVzIHRyYWNrIHRpbWUgc2NhbGU6ICVkIiwKICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIG1UaW1lU2NhbGUpOwogCiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICBtT3duZXItPmJlZ2luQm94KCJ0cmFrIik7CisgICAgICAgIHdyaXRlVGtoZEJveChub3cpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CisgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKKyAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOworICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWluZiIpOworICAgICAgICAgICAgICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVNtaGRCb3goKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVZtaGRCb3goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVEaW5mQm94KCk7CisgICAgICAgICAgICAgICAgd3JpdGVTdGJsQm94KHVzZTMyQml0T2Zmc2V0KTsKKyAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtaW5mCisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtZGlhCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHRyYWsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlU3RibEJveChib29sIHVzZTMyQml0T2Zmc2V0KSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgic3RibCIpOworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c2QiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDMyKDEpOyAgICAgICAgICAgICAgIC8vIGVudHJ5IGNvdW50CisgICAgaWYgKG1Jc0F1ZGlvKSB7CisgICAgICAgIHdyaXRlQXVkaW9Gb3VyQ0NCb3goKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZVZpZGVvRm91ckNDQm94KCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCisgICAgd3JpdGVTdHRzQm94KCk7CisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICB3cml0ZVN0c3NCb3goKTsKKyAgICB9CisgICAgd3JpdGVTdHN6Qm94KCk7CisgICAgd3JpdGVTdHNjQm94KCk7CisgICAgd3JpdGVTdGNvQm94KHVzZTMyQml0T2Zmc2V0KTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RibAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVWaWRlb0ZvdXJDQ0JveCgpIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1wNHYiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInMyNjMiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZSkpIHsKKyAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjMSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CisgICAgICAgIENIRUNLKCEic2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG1pbWUgdHlwZS4iKTsKKyAgICB9CisKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBzdWNjZXNzID0gbU1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQxNih3aWR0aCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGhlaWdodCk7CisgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gaG9yaXogcmVzb2x1dGlvbgorICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDQ4MDAwMCk7ICAgIC8vIHZlcnQgcmVzb2x1dGlvbgorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZnJhbWUgY291bnQKKyAgICBtT3duZXItPndyaXRlKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIDMyKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgxOCk7ICAgICAgICAvLyBkZXB0aAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigtMSk7ICAgICAgICAgIC8vIHByZWRlZmluZWQKKworICAgIENIRUNLKDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA8IDEyOCk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlTXA0dkVzZHNCb3goKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlRDI2M0JveCgpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgeworICAgICAgICB3cml0ZUF2Y2NCb3goKTsKKyAgICB9CisKKyAgICB3cml0ZVBhc3BCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbXA0diwgczI2MyBvciBhdmMxCit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUF1ZGlvRm91ckNDQm94KCkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IE5VTEw7CisgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkpIHsKKyAgICAgICAgZm91cmNjID0gInNhbXIiOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgeworICAgICAgICBmb3VyY2MgPSAic2F3YiI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgIGZvdXJjYyA9ICJtcDRhIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOworICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgLy8gYXVkaW8gZm9ybWF0CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDEpOyAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIGludDMyX3QgbkNoYW5uZWxzOworICAgIENIRUNLX0VRKHRydWUsIG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihuQ2hhbm5lbHMpOyAgIC8vIGNoYW5uZWwgY291bnQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMTYpOyAgICAgICAgICAvLyBzYW1wbGUgc2l6ZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorCisgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisgICAgbU93bmVyLT53cml0ZUludDMyKHNhbXBsZXJhdGUgPDwgMTYpOworICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlTXA0YUVzZHNCb3goKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkgfHwKKyAgICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKKyAgICAgICAgd3JpdGVEYW1yQm94KCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1wNGFFc2RzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKKyAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOworICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPiAwKTsKKworICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIDIzIDwgMTI4KTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsvLyBFU19JRAorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOworCisgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50OCgweDQwKTsgICAvLyBvYmplY3RUeXBlSW5kaWNhdGlvbiBJU08vSUVDIDE0NDkyLTIKKyAgICBtT3duZXItPndyaXRlSW50OCgweDE1KTsgICAvLyBzdHJlYW1UeXBlIEF1ZGlvU3RyZWFtCisKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMyk7ICAvLyBYWFgKKyAgICBtT3duZXItPndyaXRlSW50OCgweDAwKTsgICAvLyBidWZmZXIgc2l6ZSAyNC1iaXQKKyAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBtYXggYml0IHJhdGUKKyAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBhdmcgYml0IHJhdGUKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKKyAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKKyAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZworICAgICAgICAweDAxLAorICAgICAgICAweDAyCisgICAgfTsKKyAgICBtT3duZXItPndyaXRlKGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGVzZHMKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTXA0dkVzZHNCb3goKSB7CisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKKyAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7CisgICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOworCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgLy8gRVNfRGVzY3JUYWcKKyAgICBtT3duZXItPndyaXRlSW50OCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOyAgLy8gRVNfSUQKKyAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDQpOyAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50OCgweDIwKTsgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTEpOyAgLy8gc3RyZWFtVHlwZSBWaXN1YWxTdHJlYW0KKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7CisgICAgICAgIDB4MDEsIDB4NzcsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDMsIDB4ZTgsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDMsIDB4ZTgsIDB4MDAKKyAgICB9OworICAgIG1Pd25lci0+d3JpdGUoa0RhdGEsIHNpemVvZihrRGF0YSkpOworCisgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCisKKyAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKKyAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZworICAgICAgICAweDAxLAorICAgICAgICAweDAyCisgICAgfTsKKyAgICBtT3duZXItPndyaXRlKGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGVzZHMKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlVGtoZEJveCh0aW1lX3Qgbm93KSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgidGtoZCIpOworICAgIC8vIEZsYWdzID0gNyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFjayBpcyBlbmFibGVkLCBhbmQKKyAgICAvLyBwYXJ0IG9mIHRoZSBwcmVzZW50YXRpb24KKyAgICBtT3duZXItPndyaXRlSW50MzIoMHgwNyk7ICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9NworICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gY3JlYXRpb24gdGltZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKKyAgICBtT3duZXItPndyaXRlSW50MzIobVRyYWNrSWQgKyAxKTsgIC8vIHRyYWNrIGlkIHN0YXJ0cyB3aXRoIDEKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgaW50NjRfdCB0cmFrRHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXMoKTsKKyAgICBpbnQzMl90IG12aGRUaW1lU2NhbGUgPSBtT3duZXItPmdldFRpbWVTY2FsZSgpOworICAgIGludDMyX3QgdGtoZER1cmF0aW9uID0KKyAgICAgICAgKHRyYWtEdXJhdGlvblVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgbU93bmVyLT53cml0ZUludDMyKHRraGREdXJhdGlvbik7ICAvLyBpbiBtdmhkIHRpbWVzY2FsZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBsYXllcgorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGdyb3VwCisgICAgbU93bmVyLT53cml0ZUludDE2KG1Jc0F1ZGlvID8gMHgxMDAgOiAwKTsgIC8vIHZvbHVtZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKworICAgIG1Pd25lci0+d3JpdGVDb21wb3NpdGlvbk1hdHJpeChtUm90YXRpb24pOyAgICAgICAvLyBtYXRyaXgKKworICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgICAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgICAgICBtT3duZXItPndyaXRlSW50MzIod2lkdGggPDwgMTYpOyAgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQorICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaGVpZ2h0IDw8IDE2KTsgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQorICAgIH0KKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gdGtoZAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVWbWhkQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInZtaGQiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMHgwMSk7ICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTEKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBncmFwaGljcyBtb2RlCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gb3Bjb2xvcgorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7CisgICAgbU93bmVyLT5lbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlU21oZEJveCgpIHsKKyAgICBtT3duZXItPmJlZ2luQm94KCJzbWhkIik7CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gYmFsYW5jZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT5lbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlSGRsckJveCgpIHsKKyAgICBtT3duZXItPmJlZ2luQm94KCJoZGxyIik7CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0eXBlOiBzaG91bGQgYmUgbWhscgorICAgIG1Pd25lci0+d3JpdGVGb3VyY2MobUlzQXVkaW8gPyAic291biIgOiAidmlkZSIpOyAgLy8gY29tcG9uZW50IHN1YnR5cGUKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAvLyBSZW1vdmluZyAiciIgZm9yIHRoZSBuYW1lIHN0cmluZyBqdXN0IG1ha2VzIHRoZSBzdHJpbmcgNCBieXRlIGFsaWduZWQKKyAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtSXNBdWRpbyA/ICJTb3VuZEhhbmRsZSI6ICJWaWRlb0hhbmRsZSIpOyAgLy8gbmFtZQorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1kaGRCb3godGltZV90IG5vdykgeworICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CisgICAgbU93bmVyLT5iZWdpbkJveCgibWRoZCIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCisgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtVGltZVNjYWxlKTsgICAgLy8gbWVkaWEgdGltZXNjYWxlCisgICAgaW50MzJfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICBtT3duZXItPndyaXRlSW50MzIobWRoZER1cmF0aW9uKTsgIC8vIHVzZSBtZWRpYSB0aW1lc2NhbGUKKyAgICAvLyBMYW5ndWFnZSBmb2xsb3dzIHRoZSB0aHJlZSBsZXR0ZXIgc3RhbmRhcmQgSVNPLTYzOS0yL1QKKyAgICAvLyAnZScsICduJywgJ2cnIGZvciAiRW5nbGlzaCIsIGZvciBpbnN0YW5jZS4KKyAgICAvLyBFYWNoIGNoYXJhY3RlciBpcyBwYWNrZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpdHMgQVNDSUkgdmFsdWUgYW5kIDB4NjAuCisgICAgLy8gRm9yICJFbmdsaXNoIiwgdGhlc2UgYXJlIDAwMTAxLCAwMTExMCwgMDAxMTEuCisgICAgLy8gWFhYOiBXaGVyZSBpcyB0aGUgcGFkZGluZyBiaXQgbG9jYXRlZDogMHgxNUM3PworICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZURhbXJCb3goKSB7CisgICAgLy8gM2dwcDIgU3BlYyBBTVJTYW1wbGVFbnRyeSBmaWVsZHMKKyAgICBtT3duZXItPmJlZ2luQm94KCJkYW1yIik7CisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcoIiAgICIpOyAgLy8gdmVuZG9yOiA0IGJ5dGVzCisgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gZGVjb2RlciB2ZXJzaW9uCisgICAgbU93bmVyLT53cml0ZUludDE2KDB4ODNGRik7ICAgLy8gbW9kZSBzZXQ6IGFsbCBlbmFibGVkCisgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gbW9kZSBjaGFuZ2UgcGVyaW9kCisgICAgbU93bmVyLT53cml0ZUludDgoMSk7ICAgICAgICAgLy8gZnJhbWVzIHBlciBzYW1wbGUKKyAgICBtT3duZXItPmVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVVcmxCb3goKSB7CisgICAgLy8gVGhlIHRhYmxlIGluZGV4IGhlcmUgcmVmZXJzIHRvIHRoZSBzYW1wbGUgZGVzY3JpcHRpb24gaW5kZXgKKyAgICAvLyBpbiB0aGUgc2FtcGxlIHRhYmxlIGVudHJpZXMuCisgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MSAoc2VsZi1jb250YWluZWQpCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHVybAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEcmVmQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImRyZWYiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAvLyBlbnRyeSBjb3VudCAoZWl0aGVyIHVybCBvciB1cm4pCisgICAgd3JpdGVVcmxCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZHJlZgorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEaW5mQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImRpbmYiKTsKKyAgICB3cml0ZURyZWZCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZGluZgorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVBdmNjQm94KCkgeworICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA+PSA1KTsKKworICAgIC8vIFBhdGNoIGF2Y2MncyBsZW5ndGhTaXplIGZpZWxkIHRvIG1hdGNoIHRoZSBudW1iZXIKKyAgICAvLyBvZiBieXRlcyB3ZSB1c2UgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgYSBuYWwgdW5pdC4KKyAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKW1Db2RlY1NwZWNpZmljRGF0YTsKKyAgICBwdHJbNF0gPSAocHRyWzRdICYgMHhmYykgfCAobU93bmVyLT51c2VOYWxMZW5ndGhGb3VyKCkgPyAzIDogMSk7CisgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjQyIpOworICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gYXZjQworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEMjYzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImQyNjMiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZW5kb3IKKyAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBkZWNvZGVyIHZlcnNpb24KKyAgICBtT3duZXItPndyaXRlSW50OCgxMCk7ICAvLyBsZXZlbDogMTAKKyAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBwcm9maWxlOiAwCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGQyNjMKK30KKworLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVBhc3BCb3goKSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgicGFzcCIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigxIDw8IDE2KTsgIC8vIGhzcGFjaW5nCisgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gcGFzcAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHRzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0dHMiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0dHNUYWJsZUVudHJpZXMpOwogCiAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igc21hbGwgc3RhcnQgdGltZSBkaWZmZXJlbmNlIGZyb20gZGlmZmVyZW50IG1lZGlhIHRyYWNrcwogICAgIGludDY0X3QgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IDA7CisgICAgaW50NjRfdCBtb292U3RhcnRUaW1lVXMgPSBtT3duZXItPmdldFN0YXJ0VGltZXN0YW1wVXMoKTsKKyAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgIT0gbW9vdlN0YXJ0VGltZVVzKSB7CisgICAgICAgIENIRUNLKG1TdGFydFRpbWVzdGFtcFVzID4gbW9vdlN0YXJ0VGltZVVzKTsKKyAgICAgICAgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IG1TdGFydFRpbWVzdGFtcFVzIC0gbW9vdlN0YXJ0VGltZVVzOworICAgIH0KKyAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXM7CisgICAgZm9yIChMaXN0PFN0dHNUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3R0c1RhYmxlRW50cmllcy5iZWdpbigpOworICAgICAgICBpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKIAotICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgYXJlIGNhbGN1bGF0aW5nIHRoZSBzYW1wbGUgZHVyYXRpb24gdGhlIGV4YWN0bHkKKyAgICAgICAgLy8gc2FtZSB3YXkgYXMgd2UgbWFkZSBkZWNpc2lvbiBvbiBob3cgdG8gY3JlYXRlIHN0dHMgZW50cmllcy4KKyAgICAgICAgaW50NjRfdCBjdXJyVGltZXN0YW1wVXMgPSBwcmV2VGltZXN0YW1wVXMgKyBpdC0+c2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgaW50MzJfdCBkdXIgPSAoKGN1cnJUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwgLQorICAgICAgICAgICAgKHByZXZUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOworICAgICAgICBwcmV2VGltZXN0YW1wVXMgKz0gKGl0LT5zYW1wbGVDb3VudCAqIGl0LT5zYW1wbGVEdXJhdGlvblVzKTsKIAotICAgICAgbU93bmVyLT5iZWdpbkJveCgidGtoZCIpOwotICAgICAgICAvLyBGbGFncyA9IDcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdHJhY2sgaXMgZW5hYmxlZCwgYW5kCi0gICAgICAgIC8vIHBhcnQgb2YgdGhlIHByZXNlbnRhdGlvbgotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMHgwNyk7ICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9NwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZQotICAgICAgICBtT3duZXItPndyaXRlSW50MzIodHJhY2tJRCk7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgaW50MzJfdCB0a2hkRHVyYXRpb24gPQotICAgICAgICAgICAgKHRyYWtEdXJhdGlvblVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMih0a2hkRHVyYXRpb24pOyAgLy8gaW4gbXZoZCB0aW1lc2NhbGUKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGF5ZXIKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBhbHRlcm5hdGUgZ3JvdXAKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KG1Jc0F1ZGlvID8gMHgxMDAgOiAwKTsgIC8vIHZvbHVtZQotICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIpOworICAgIH0KKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3R0cworfQogCi0gICAgICAgIG1Pd25lci0+d3JpdGVDb21wb3NpdGlvbk1hdHJpeChtUm90YXRpb24pOyAgICAgICAvLyBtYXRyaXgKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVN0c3NCb3goKSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgic3RzcyIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3Rzc1RhYmxlRW50cmllcyk7ICAvLyBudW1iZXIgb2Ygc3luYyBmcmFtZXMKKyAgICBmb3IgKExpc3Q8aW50MzJfdD46Oml0ZXJhdG9yIGl0ID0gbVN0c3NUYWJsZUVudHJpZXMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbVN0c3NUYWJsZUVudHJpZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCppdCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNzCit9CiAKLSAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7Ci0gICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHdpZHRoIDw8IDE2KTsgICAvLyAzMi1iaXQgZml4ZWQtcG9pbnQgdmFsdWUKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihoZWlnaHQgPDwgMTYpOyAgLy8gMzItYml0IGZpeGVkLXBvaW50IHZhbHVlCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHN6Qm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3oiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBpZiAobVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKKyAgICAgICAgTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKml0KTsgIC8vIGRlZmF1bHQgc2FtcGxlIHNpemUKKyAgICB9IGVsc2UgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CisgICAgfQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU2FtcGxlcyk7CisgICAgaWYgKCFtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgeworICAgICAgICBmb3IgKExpc3Q8c2l6ZV90Pjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlU2l6ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1TYW1wbGVTaXplcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCppdCk7CiAgICAgICAgIH0KLSAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB0a2hkCisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHN6Cit9CiAKLSAgICAgIGludDY0X3QgbW9vdlN0YXJ0VGltZVVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVzdGFtcFVzKCk7Ci0gICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgIT0gbW9vdlN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgQ0hFQ0sobVN0YXJ0VGltZXN0YW1wVXMgPiBtb292U3RhcnRUaW1lVXMpOwotICAgICAgICAgIHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXMgPSBtU3RhcnRUaW1lc3RhbXBVcyAtIG1vb3ZTdGFydFRpbWVVczsKLSAgICAgIH0KK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVN0c2NCb3goKSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgic3RzYyIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3RzY1RhYmxlRW50cmllcyk7CisgICAgZm9yIChMaXN0PFN0c2NUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3RzY1RhYmxlRW50cmllcy5iZWdpbigpOworICAgICAgICBpdCAhPSBtU3RzY1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPmZpcnN0Q2h1bmspOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZXNQZXJDaHVuayk7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlRGVzY3JpcHRpb25JZCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNjCit9CiAKLSAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1kaWEiKTsKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVN0Y29Cb3goYm9vbCB1c2UzMkJpdE9mZnNldCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3godXNlMzJCaXRPZmZzZXQ/ICJzdGNvIjogImNvNjQiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0Y29UYWJsZUVudHJpZXMpOworICAgIGZvciAoTGlzdDxvZmY2NF90Pjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtPZmZzZXRzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1DaHVua09mZnNldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKHVzZTMyQml0T2Zmc2V0KSB7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oKml0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50NjQoKCppdCkpOworICAgICAgICB9CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdGNvIG9yIGNvNjQKK30KIAotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGhkIik7Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1UaW1lU2NhbGUpOyAgICAvLyBtZWRpYSB0aW1lc2NhbGUKLSAgICAgICAgICBpbnQzMl90IG1kaGREdXJhdGlvbiA9ICh0cmFrRHVyYXRpb25VcyAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OwotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtZGhkRHVyYXRpb24pOyAgLy8gdXNlIG1lZGlhIHRpbWVzY2FsZQotICAgICAgICAgIC8vIExhbmd1YWdlIGZvbGxvd3MgdGhlIHRocmVlIGxldHRlciBzdGFuZGFyZCBJU08tNjM5LTIvVAotICAgICAgICAgIC8vICdlJywgJ24nLCAnZycgZm9yICJFbmdsaXNoIiwgZm9yIGluc3RhbmNlLgotICAgICAgICAgIC8vIEVhY2ggY2hhcmFjdGVyIGlzIHBhY2tlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0cyBBU0NJSSB2YWx1ZSBhbmQgMHg2MC4KLSAgICAgICAgICAvLyBGb3IgIkVuZ2xpc2giLCB0aGVzZSBhcmUgMDAxMDEsIDAxMTEwLCAwMDExMS4KLSAgICAgICAgICAvLyBYWFg6IFdoZXJlIGlzIHRoZSBwYWRkaW5nIGJpdCBsb2NhdGVkOiAweDE1Qzc/Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIG1Pd25lci0+ZW5kQm94KCk7Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZVVkdGFCb3goKSB7CisgICAgYmVnaW5Cb3goInVkdGEiKTsKKyAgICB3cml0ZUdlb0RhdGFCb3goKTsKKyAgICBlbmRCb3goKTsKK30KIAotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJoZGxyIik7Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0eXBlOiBzaG91bGQgYmUgbWhscgotICAgICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MobUlzQXVkaW8gPyAic291biIgOiAidmlkZSIpOyAgLy8gY29tcG9uZW50IHN1YnR5cGUKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAvLyBSZW1vdmluZyAiciIgZm9yIHRoZSBuYW1lIHN0cmluZyBqdXN0IG1ha2VzIHRoZSBzdHJpbmcgNCBieXRlIGFsaWduZWQKLSAgICAgICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtSXNBdWRpbyA/ICJTb3VuZEhhbmRsZSI6ICJWaWRlb0hhbmRsZSIpOyAgLy8gbmFtZQotICAgICAgICBtT3duZXItPmVuZEJveCgpOwotCi0gICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1pbmYiKTsKLSAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic21oZCIpOwotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gYmFsYW5jZQotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInZtaGQiKTsKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MDEpOyAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0xCi0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIGdyYXBoaWNzIG1vZGUKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gb3Bjb2xvcgotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7Ci0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKLSAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkaW5mIik7Ci0gICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkcmVmIik7Ci0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAvLyBlbnRyeSBjb3VudCAoZWl0aGVyIHVybCBvciB1cm4pCi0gICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBpbmRleCBoZXJlIHJlZmVycyB0byB0aGUgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4Ci0gICAgICAgICAgICAgIC8vIGluIHRoZSBzYW1wbGUgdGFibGUgZW50cmllcy4KLSAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MSAoc2VsZi1jb250YWluZWQpCi0gICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB1cmwKLSAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkcmVmCi0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGRpbmYKLQotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdGJsIik7Ci0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHNkIik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAgICAgICAgICAgICAgLy8gZW50cnkgY291bnQKLSAgICAgICAgICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91cmNjID0gInNhbXIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSAic2F3YiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdXJjYyA9ICJtcDRhIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgICAvLyBhdWRpbyBmb3JtYXQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MSk7ICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICBDSEVDS19FUSh0cnVlLCBtTWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihuQ2hhbm5lbHMpOyAgIC8vIGNoYW5uZWwgY291bnQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigxNik7ICAgICAgICAgIC8vIHNhbXBsZSBzaXplCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7Ci0gICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSk7Ci0gICAgICAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzYW1wbGVyYXRlIDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplICsgMjMgPCAxMjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDAwMCk7Ly8gRVNfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDA0KTsgICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDE1ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDQwKTsgICAvLyBvYmplY3RUeXBlSW5kaWNhdGlvbiBJU08vSUVDIDE0NDkyLTIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTUpOyAgIC8vIHN0cmVhbVR5cGUgQXVkaW9TdHJlYW0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDMpOyAgLy8gWFhYCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDAwKTsgICAvLyBidWZmZXIgc2l6ZSAyNC1iaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMig5NjAwMCk7IC8vIG1heCBiaXQgcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gYXZnIGJpdCByYXRlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShtQ29kZWNTcGVjaWZpY0RhdGEsIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAgLy8gU0xDb25maWdEZXNjcmlwdG9yVGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShrRGF0YTIsIHNpemVvZihrRGF0YTIpKTsKLQotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZXNkcwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIG1pbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gM2dwcDIgU3BlYyBBTVJTYW1wbGVFbnRyeSBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZGFtciIpOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKCIgICAiKTsgIC8vIHZlbmRvcjogNCBieXRlcwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDApOyAgICAgICAgIC8vIGRlY29kZXIgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDgzRkYpOyAgIC8vIG1vZGUgc2V0OiBhbGwgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDApOyAgICAgICAgIC8vIG1vZGUgY2hhbmdlIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDEpOyAgICAgICAgIC8vIGZyYW1lcyBwZXIgc2FtcGxlCi0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtcDR2Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzMjYzIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImF2YzEiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigxKTsgICAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4Ci0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKLSAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gaG9yaXogcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gdmVydCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZnJhbWUgY291bnQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgMzIpOwotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MTgpOyAgICAgICAgLy8gZGVwdGgKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigtMSk7ICAgICAgICAgIC8vIHByZWRlZmluZWQKLQotICAgICAgICAgICAgICAgICAgQ0hFQ0soMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDwgMTI4KTsKLQotICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA+IDApOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgLy8gRVNfRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsgIC8vIEVTX0lECi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDE1ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDIwKTsgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgxMSk7ICAvLyBzdHJlYW1UeXBlIFZpc3VhbFN0cmVhbQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YVtdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4NzcsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMywgMHhlOCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAzLCAweGU4LCAweDAwCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShrRGF0YSwgc2l6ZW9mKGtEYXRhKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgLy8gRGVjb2RlclNwZWNpZmljSW5mb1RhZwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEyW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoa0RhdGEyLCBzaXplb2Yoa0RhdGEyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZXNkcwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImQyNjMiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZW5kb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgLy8gZGVjb2RlciB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDEwKTsgIC8vIGxldmVsOiAxMAotICAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBwcm9maWxlOiAwCi0KLSAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZDI2MwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID49IDUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgLy8gUGF0Y2ggYXZjYydzIGxlbmd0aFNpemUgZmllbGQgdG8gbWF0Y2ggdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGJ5dGVzIHdlIHVzZSB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiBhIG5hbCB1bml0LgotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopbUNvZGVjU3BlY2lmaWNEYXRhOwotICAgICAgICAgICAgICAgICAgICAgIHB0cls0XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChwdHJbNF0gJiAweGZjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpID8gMyA6IDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShtQ29kZWNTcGVjaWZpY0RhdGEsIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBhdmNDCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInBhc3AiKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gaHNwYWNpbmcKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBwYXNwCi0gICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1wNHYsIHMyNjMgb3IgYXZjMQotICAgICAgICAgICAgfQotICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCi0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHRzIik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3R0c1RhYmxlRW50cmllcyk7Ci0gICAgICAgICAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgIGl0ICE9IG1TdHRzVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVDb3VudCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgY2FsY3VsYXRpbmcgdGhlIHNhbXBsZSBkdXJhdGlvbiB0aGUgZXhhY3RseQotICAgICAgICAgICAgICAgIC8vIHNhbWUgd2F5IGFzIHdlIG1hZGUgZGVjaXNpb24gb24gaG93IHRvIGNyZWF0ZSBzdHRzIGVudHJpZXMuCi0gICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyVGltZXN0YW1wVXMgPSBwcmV2VGltZXN0YW1wVXMgKyBpdC0+c2FtcGxlRHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGR1ciA9ICgoY3VyclRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwotICAgICAgICAgICAgICAgIHByZXZUaW1lc3RhbXBVcyArPSAoaXQtPnNhbXBsZUNvdW50ICogaXQtPnNhbXBsZUR1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGR1cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKLQotICAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKLSAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3MiKTsKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3Rzc1RhYmxlRW50cmllcyk7ICAvLyBudW1iZXIgb2Ygc3luYyBmcmFtZXMKLSAgICAgICAgICAgICAgZm9yIChMaXN0PGludDMyX3Q+OjppdGVyYXRvciBpdCA9IG1TdHNzVGFibGVFbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgaXQgIT0gbVN0c3NUYWJsZUVudHJpZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzcwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3oiKTsKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOyAgLy8gZGVmYXVsdCBzYW1wbGUgc2l6ZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVNhbXBsZXMpOwotICAgICAgICAgICAgaWYgKCFtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgewotICAgICAgICAgICAgICAgIGZvciAoTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbVNhbXBsZVNpemVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzegotCi0gICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic3RzYyIpOwotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0c2NUYWJsZUVudHJpZXMpOwotICAgICAgICAgICAgZm9yIChMaXN0PFN0c2NUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3RzY1RhYmxlRW50cmllcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtU3RzY1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+Zmlyc3RDaHVuayk7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVzUGVyQ2h1bmspOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlRGVzY3JpcHRpb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0c2MKLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KHVzZTMyQml0T2Zmc2V0PyAic3RjbyI6ICJjbzY0Iik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3Rjb1RhYmxlRW50cmllcyk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8b2ZmNjRfdD46Oml0ZXJhdG9yIGl0ID0gbUNodW5rT2Zmc2V0cy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtQ2h1bmtPZmZzZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZTMyQml0T2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PigqaXQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50NjQoKCppdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RjbyBvciBjbzY0Ci0KLSAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0YmwKLSAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbWluZgotICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1kaWEKLSAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gdHJhaworLyoKKyAqIEdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KKyAqLwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVHZW9EYXRhQm94KCkgeworICAgIGJlZ2luQm94KCJceEE5eHl6Iik7CisgICAgLyoKKyAgICAgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBhbnkgdXNlciBkYXRhIHN0YXJ0CisgICAgICogd2l0aCAiXDB4QTkiLCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0cyBhc3NvaWNhdGVkCisgICAgICogbGFuZ3VhZ2UgY29kZS4KKyAgICAgKiAweDAwMTI6IHRleHQgc3RyaW5nIGxlbmd0aAorICAgICAqIDB4MTVjNzogbGFuZyAobG9jYWxlKSBjb2RlOiBlbgorICAgICAqLworICAgIHdyaXRlSW50MzIoMHgwMDEyMTVjNyk7CisgICAgd3JpdGVMYXRpdHVkZShtTGF0aXR1ZGV4MTAwMDApOworICAgIHdyaXRlTG9uZ2l0dWRlKG1Mb25naXR1ZGV4MTAwMDApOworICAgIHdyaXRlSW50OCgweDJGKTsKKyAgICBlbmRCb3goKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDBiZTcyNjEuLjAxZjFmYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiA9ICJ2aWRlby9tcGVnMiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVcgPSAidmlkZW8vcmF3IjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOwpAQCAtNDMsNyArNDQsMTAgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXBwbGljYXRpb24vb2dnIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSA9ICJ2aWRlby94LW1hdHJvc2thIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTID0gInZpZGVvL21wMnRzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkgPSAidmlkZW8vYXZpIjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSA9ICJ2aWRlby93dm0iOwogCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAgPSAidGV4dC8zZ3BwLXR0IjsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAyM2JhZDViLi5hZjAxMzFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKQEAgLTEwOCw2ICsxMDksOCBAQAogICAgICAgICByZXQgPSBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgewogICAgICAgICByZXQgPSBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSkpIHsKKyAgICAgICAgcmV0ID0gbmV3IEFWSUV4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSkpIHsKICAgICAgICAgcmV0ID0gbmV3IFdWTUV4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAyNDhiNjc4Li43N2E2NjAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yMDEsNiArMjAyLDIyIEBACiAgICAgbUNhY2hlID0gTlVMTDsKIH0KIAorc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpnZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGludDMyX3QgKmticHMpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBIVFRQQmFzZSogc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBzb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoa2Jwcyk7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgeworICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CisgICAgICAgIEhUVFBCYXNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZS0+c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGZyZXFNcyk7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjppbml0Q2hlY2soKSBjb25zdCB7CiAgICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwogfQpAQCAtMjEwLDcgKzIyNyw5IEBACiB9CiAKIHVpbnQzMl90IE51Q2FjaGVkU291cmNlMjo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIChtU291cmNlLT5mbGFncygpICYgfmtXYW50c1ByZWZldGNoaW5nKSB8IGtJc0NhY2hpbmdEYXRhU291cmNlOworICAgIC8vIFJlbW92ZSBIVFRQIHJlbGF0ZWQgZmxhZ3Mgc2luY2UgTnVDYWNoZWRTb3VyY2UyIGlzIG5vdCBIVFRQLWJhc2VkLgorICAgIHVpbnQzMl90IGZsYWdzID0gbVNvdXJjZS0+ZmxhZ3MoKSAmIH4oa1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2UpOworICAgIHJldHVybiAoZmxhZ3MgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZSk7CiB9CiAKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMzIzLDI1ICszNDIsMjggQEAKIH0KIAogdm9pZCBOdUNhY2hlZFNvdXJjZTI6OnJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgKLSAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCkgeworICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkLCBib29sIGZvcmNlKSB7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrR3JheUFyZWEgPSAxMDI0ICogMTAyNDsKIAogICAgIGlmIChtRmV0Y2hpbmcgfHwgbUZpbmFsU3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoIWlnbm9yZUxvd1dhdGVyVGhyZXNob2xkCisgICAgaWYgKCFpZ25vcmVMb3dXYXRlclRocmVzaG9sZCAmJiAhZm9yY2UKICAgICAgICAgICAgICYmIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkgLSBtTGFzdEFjY2Vzc1BvcwogICAgICAgICAgICAgICAgID49IGtMb3dXYXRlclRocmVzaG9sZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc2l6ZV90IG1heEJ5dGVzID0gbUxhc3RBY2Nlc3NQb3MgLSBtQ2FjaGVPZmZzZXQ7Ci0gICAgaWYgKG1heEJ5dGVzIDwga0dyYXlBcmVhKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAKLSAgICBtYXhCeXRlcyAtPSBrR3JheUFyZWE7CisgICAgaWYgKCFmb3JjZSkgeworICAgICAgICBpZiAobWF4Qnl0ZXMgPCBrR3JheUFyZWEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1heEJ5dGVzIC09IGtHcmF5QXJlYTsKKyAgICB9CiAKICAgICBzaXplX3QgYWN0dWFsQnl0ZXMgPSBtQ2FjaGUtPnJlbGVhc2VGcm9tU3RhcnQobWF4Qnl0ZXMpOwogICAgIG1DYWNoZU9mZnNldCArPSBhY3R1YWxCeXRlczsKQEAgLTQxMywxMCArNDM1LDE5IEBACiB9CiAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0tfTEUoc2l6ZSwgKHNpemVfdClrSGlnaFdhdGVyVGhyZXNob2xkKTsKKwogICAgIExPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBpZiAoIW1GZXRjaGluZykgeworICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldDsKKyAgICAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKAorICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBpZ25vcmVMb3dXYXRlclRocmVzaG9sZAorICAgICAgICAgICAgICAgIHRydWUpOyAvLyBmb3JjZQorICAgIH0KKwogICAgIGlmIChvZmZzZXQgPCBtQ2FjaGVPZmZzZXQKICAgICAgICAgICAgIHx8IG9mZnNldCA+PSAob2ZmNjRfdCkobUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSkpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IG9mZjY0X3Qga1BhZGRpbmcgPSAyNTYgKiAxMDI0OwpAQCAtNDM4LDYgKzQ2OSwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGF2YWlsID0gbUNhY2hlLT50b3RhbFNpemUoKSAtIGRlbHRhOworCisgICAgICAgIGlmIChhdmFpbCA+IHNpemUpIHsKKyAgICAgICAgICAgIGF2YWlsID0gc2l6ZTsKKyAgICAgICAgfQorCiAgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgYXZhaWwpOwogCiAgICAgICAgIHJldHVybiBhdmFpbDsKQEAgLTQ4MSwxMSArNTE3LDExIEBACiAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKHRydWUgLyogaWdub3JlIGxvdyB3YXRlciB0aHJlc2hvbGQgKi8pOwogfQogCi1EZWNyeXB0SGFuZGxlKiBOdUNhY2hlZFNvdXJjZTI6OkRybUluaXRpYWxpemF0aW9uKCkgeworc3A8RGVjcnlwdEhhbmRsZT4gTnVDYWNoZWRTb3VyY2UyOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICByZXR1cm4gbVNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24oKTsKIH0KIAotdm9pZCBOdUNhY2hlZFNvdXJjZTI6OmdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewogICAgIG1Tb3VyY2UtPmdldERybUluZm8oaGFuZGxlLCBjbGllbnQpOwogfQogCkBAIC00OTMsNCArNTI5LDggQEAKICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0VXJpKCk7CiB9CiAKK1N0cmluZzggTnVDYWNoZWRTb3VyY2UyOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggNjJmYjczMi4uZGFjMmVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTk3LDEwICs5Nyw2IEBACiAgICAgICBtQ29udGVudExlbmd0aFZhbGlkKGZhbHNlKSwKICAgICAgIG1IYXNDaHVua2VkVHJhbnNmZXJFbmNvZGluZyhmYWxzZSksCiAgICAgICBtQ2h1bmtEYXRhQnl0ZXNMZWZ0KDApLAotICAgICAgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKLSAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewogfQpAQCAtMTM3LDYgKzEzMyw3IEBACiAgICAgdW5zaWduZWQgcG9ydDsKIAogICAgIG1VcmkgPSB1cmk7CisgICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAKICAgICBib29sIGh0dHBzOwogICAgIGlmICghUGFyc2VVUkwodXJpLCAmaG9zdCwgJnBvcnQsICZwYXRoLCAmaHR0cHMpKSB7CkBAIC0yNjYsNiArMjYzLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICB7CisgICAgICAgICAgICBBU3RyaW5nIHZhbHVlOworICAgICAgICAgICAgaWYgKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKCJDb250ZW50LVR5cGUiLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOCh2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwogCiAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewpAQCAtNDIyLDcgKzQyOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7Ci0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2wobiwgZGVsYXlVcyk7CisgICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG4sIGRlbGF5VXMpOwogCiAgICAgICAgIG51bUJ5dGVzUmVhZCArPSAoc2l6ZV90KW47CiAKQEAgLTQ1OCw3ICs0NjQsNyBAQAogfQogCiB1aW50MzJfdCBOdUhUVFBEYXRhU291cmNlOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmc7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwogfQogCiAvLyBzdGF0aWMKQEAgLTUwOCw0NyArNTE0LDcgQEAKICAgICB9CiB9CiAKLWJvb2wgTnVIVFRQRGF0YVNvdXJjZTo6ZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICpiYW5kd2lkdGhfYnBzID0gKChkb3VibGUpbVRvdGFsVHJhbnNmZXJCeXRlcyAqIDhFNiAvIG1Ub3RhbFRyYW5zZmVyVGltZVVzKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE51SFRUUERhdGFTb3VyY2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2woCi0gICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgQmFuZHdpZHRoRW50cnkgZW50cnk7Ci0gICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOwotICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOwotICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKLQotICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgewotICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7Ci0gICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOwotICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKLSAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgICAgICBpbnQ2NF90IHRpbWVOb3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIGlmICh0aW1lTm93VXMgLSBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgPiAyMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGlmIChtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGRvdWJsZSBlc3RpbWF0ZWRCYW5kd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEUzIC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotICAgICAgICAgICAgICAgIExPR0koImVzdGltYXRlZCBhdmcgYmFuZHdpZHRoIGlzICU4LjJmIGticHMgaW4gdGhlIHBhc3QgJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZEJhbmR3aWR0aCwgdGltZU5vd1VzIC0gbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyA9IHRpbWVOb3dVczsKLSAgICAgICAgfQotICAgIH0KLX0KLQotRGVjcnlwdEhhbmRsZSogTnVIVFRQRGF0YVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBOdUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CiAgICAgfQpAQCAtNTcyLDggKzUzOCw4IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi12b2lkIE51SFRUUERhdGFTb3VyY2U6OmdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgICpoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKK3ZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7CisgICAgaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7CiAKICAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7CiB9CkBAIC01ODIsNCArNTQ4LDggQEAKICAgICByZXR1cm4gbVVyaTsKIH0KIAorU3RyaW5nOCBOdUhUVFBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGU5NmNlMjguLjcyZDBkMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTUzLDIzICs1MywxOSBAQAogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAorI2lmIEhBVkVfU09GVFdBUkVfREVDT0RFUlMKICNpbmNsdWRlICJpbmNsdWRlL1RocmVhZGVkU291cmNlLmgiCisjZW5kaWYKKwogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IGludCBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMDsKLQogc3RydWN0IENvZGVjSW5mbyB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBjb25zdCBjaGFyICpjb2RlYzsKIH07CiAKLSNkZWZpbmUgRkFDVE9SWV9DUkVBVEUobmFtZSkgXAotc3RhdGljIHNwPE1lZGlhU291cmNlPiBNYWtlIyNuYW1lKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7IFwKLSAgICByZXR1cm4gbmV3IG5hbWUoc291cmNlKTsgXAotfQotCiAjZGVmaW5lIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIobmFtZSkgXAogc3RhdGljIHNwPE1lZGlhU291cmNlPiBNYWtlIyNuYW1lKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsgXAogICAgIHJldHVybiBuZXcgbmFtZShzb3VyY2UsIG1ldGEpOyBcCkBAIC03NywyMSArNzMsMzAgQEAKIAogI2RlZmluZSBGQUNUT1JZX1JFRihuYW1lKSB7ICNuYW1lLCBNYWtlIyNuYW1lIH0sCiAKLUZBQ1RPUllfQ1JFQVRFKE1QM0RlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBTVJOQkRlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBTVJXQkRlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBQUNEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoQVZDRGVjb2RlcikKLUZBQ1RPUllfQ1JFQVRFKEc3MTFEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoTTR2SDI2M0RlY29kZXIpCi1GQUNUT1JZX0NSRUFURShWb3JiaXNEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoVlBYRGVjb2RlcikKIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQU1STkJFbmNvZGVyKQogRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJXQkVuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFBQ0VuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFWQ0VuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKE00dkgyNjNFbmNvZGVyKQogCisjaWYgSEFWRV9TT0ZUV0FSRV9ERUNPREVSUworCisjZGVmaW5lIEZBQ1RPUllfQ1JFQVRFKG5hbWUpIFwKK3N0YXRpYyBzcDxNZWRpYVNvdXJjZT4gTWFrZSMjbmFtZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeyBcCisgICAgcmV0dXJuIG5ldyBuYW1lKHNvdXJjZSk7IFwKK30KKworRkFDVE9SWV9DUkVBVEUoQU1STkJEZWNvZGVyKQorRkFDVE9SWV9DUkVBVEUoQU1SV0JEZWNvZGVyKQorRkFDVE9SWV9DUkVBVEUoQUFDRGVjb2RlcikKK0ZBQ1RPUllfQ1JFQVRFKEFWQ0RlY29kZXIpCitGQUNUT1JZX0NSRUFURShHNzExRGVjb2RlcikKK0ZBQ1RPUllfQ1JFQVRFKE1QM0RlY29kZXIpCitGQUNUT1JZX0NSRUFURShNNHZIMjYzRGVjb2RlcikKK0ZBQ1RPUllfQ1JFQVRFKFZvcmJpc0RlY29kZXIpCitGQUNUT1JZX0NSRUFURShWUFhEZWNvZGVyKQorI2VuZGlmCisKIHN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gSW5zdGFudGlhdGVTb2Z0d2FyZUVuY29kZXIoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKQEAgLTExOSwxOCArMTI0LDE5IEBACiAKIHN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gSW5zdGFudGlhdGVTb2Z0d2FyZUNvZGVjKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworI2lmIEhBVkVfU09GVFdBUkVfREVDT0RFUlMKICAgICBzdHJ1Y3QgRmFjdG9yeUluZm8gewogICAgICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKCpDcmVhdGVGdW5jKShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJik7CiAgICAgfTsKIAogICAgIHN0YXRpYyBjb25zdCBGYWN0b3J5SW5mbyBrRmFjdG9yeUluZm9bXSA9IHsKLSAgICAgICAgRkFDVE9SWV9SRUYoTVAzRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoQU1STkJEZWNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihBTVJXQkRlY29kZXIpCiAgICAgICAgIEZBQ1RPUllfUkVGKEFBQ0RlY29kZXIpCiAgICAgICAgIEZBQ1RPUllfUkVGKEFWQ0RlY29kZXIpCiAgICAgICAgIEZBQ1RPUllfUkVGKEc3MTFEZWNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihNUDNEZWNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihNNHZIMjYzRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoVm9yYmlzRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoVlBYRGVjb2RlcikKQEAgLTE0NSw2ICsxNTEsNyBAQAogICAgICAgICAgICAgcmV0dXJuICgqa0ZhY3RvcnlJbmZvW2ldLkNyZWF0ZUZ1bmMpKHNvdXJjZSk7CiAgICAgICAgIH0KICAgICB9CisjZW5kaWYKIAogICAgIHJldHVybiBOVUxMOwogfQpAQCAtMTU0LDM5ICsxNjEsNTEgQEAKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRGVjb2RlckluZm9bXSA9IHsKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICJPTVguVEkuSlBFRy5kZWNvZGUiIH0sCi0vLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLlRJLk1QMy5kZWNvZGUiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJNUDNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguVEkuQU1SLmRlY29kZSIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIkFNUk5CRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLk52aWRpYS5hbXJ3Yi5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiT01YLlRJLldCQU1SLmRlY29kZSIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5nb29nbGUuYW1yd2IuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIkFNUldCRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5USS5BQUMuZGVjb2RlIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0RlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCAiRzcxMURlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLCAiRzcxMURlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5OdmlkaWEubXA0LmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlNFQy5NUEVHNC5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNEZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5TRUMuSDI2My5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLk52aWRpYS5oMjY0LmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5EZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlNFQy5BVkMuRGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLmdvb2dsZS5hdmMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0RlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiVm9yYmlzRGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWCwgIk9NWC5nb29nbGUudnB4LmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19WUFgsICJWUFhEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsICJPTVguTnZpZGlhLm1wZWcydi5kZWNvZGUiIH0sCiB9OwogCiBzdGF0aWMgY29uc3QgQ29kZWNJbmZvIGtFbmNvZGVySW5mb1tdID0gewpAQCAtMjc3LDYgKzI5NiwxMCBAQAogfQogCiBzdGF0aWMgYm9vbCBJc1NvZnR3YXJlQ29kZWMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgeworICAgIGlmICghc3RybmNtcCgiT01YLmdvb2dsZS4iLCBjb21wb25lbnROYW1lLCAxMSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgaWYgKCFzdHJuY21wKCJPTVguIiwgY29tcG9uZW50TmFtZSwgNCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI4NCwyNiArMzA3LDI5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8vIEEgc29ydCBvcmRlciBpbiB3aGljaCBub24tT01YIGNvbXBvbmVudHMgYXJlIGZpcnN0LAotLy8gZm9sbG93ZWQgYnkgc29mdHdhcmUgY29kZWNzLCBhbmQgZm9sbG93ZWQgYnkgYWxsIHRoZSBvdGhlcnMuCisvLyBBIHNvcnQgb3JkZXIgaW4gd2hpY2ggT01YIHNvZnR3YXJlIGNvZGVjcyBhcmUgZmlyc3QsIGZvbGxvd2VkCisvLyBieSBvdGhlciAobm9uLU9NWCkgc29mdHdhcmUgY29kZWNzLCBmb2xsb3dlZCBieSBldmVyeXRoaW5nIGVsc2UuCiBzdGF0aWMgaW50IENvbXBhcmVTb2Z0d2FyZUNvZGVjc0ZpcnN0KAogICAgICAgICBjb25zdCBTdHJpbmc4ICplbGVtMSwgY29uc3QgU3RyaW5nOCAqZWxlbTIpIHsKLSAgICBib29sIGlzTm90T01YMSA9IHN0cm5jbXAoZWxlbTEtPnN0cmluZygpLCAiT01YLiIsIDQpOwotICAgIGJvb2wgaXNOb3RPTVgyID0gc3RybmNtcChlbGVtMi0+c3RyaW5nKCksICJPTVguIiwgNCk7Ci0KLSAgICBpZiAoaXNOb3RPTVgxKSB7Ci0gICAgICAgIGlmIChpc05vdE9NWDIpIHsgcmV0dXJuIDA7IH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoaXNOb3RPTVgyKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KKyAgICBib29sIGlzT01YMSA9ICFzdHJuY21wKGVsZW0xLT5zdHJpbmcoKSwgIk9NWC4iLCA0KTsKKyAgICBib29sIGlzT01YMiA9ICFzdHJuY21wKGVsZW0yLT5zdHJpbmcoKSwgIk9NWC4iLCA0KTsKIAogICAgIGJvb2wgaXNTb2Z0d2FyZUNvZGVjMSA9IElzU29mdHdhcmVDb2RlYyhlbGVtMS0+c3RyaW5nKCkpOwogICAgIGJvb2wgaXNTb2Z0d2FyZUNvZGVjMiA9IElzU29mdHdhcmVDb2RlYyhlbGVtMi0+c3RyaW5nKCkpOwogCiAgICAgaWYgKGlzU29mdHdhcmVDb2RlYzEpIHsKLSAgICAgICAgaWYgKGlzU29mdHdhcmVDb2RlYzIpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgaWYgKCFpc1NvZnR3YXJlQ29kZWMyKSB7IHJldHVybiAtMTsgfQorCisgICAgICAgIGlmIChpc09NWDEpIHsKKyAgICAgICAgICAgIGlmIChpc09NWDIpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzT01YMikgeyByZXR1cm4gMDsgfQorCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTUwNyw2ICs1MzMsMTAgQEAKICAgICAgICAgICAgIGVyciA9IGNvZGVjLT5jb25maWd1cmVDb2RlYyhtZXRhLCBmbGFncyk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiT01YLk52aWRpYS5tcGVnMnYuZGVjb2RlIiwgY29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPm1Pbmx5U3VibWl0T25lQnVmZmVyQXRPbmVUaW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICByZXR1cm4gY29kZWM7CiAgICAgICAgICAgICB9CiAKQEAgLTYyMiw2ICs2NTIsMTEgQEAKICAgICAgICAgICAgICAgICBMT0dFKCJQcm9maWxlIGFuZC9vciBsZXZlbCBleGNlZWQgdGhlIGRlY29kZXIncyBjYXBhYmlsaXRpZXMuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYzMSwxNiArNjY2LDIzIEBACiAgICAgfQogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIG1NSU1FKSkgewogICAgICAgICBzZXRBTVJGb3JtYXQoZmFsc2UgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbU1JTUUpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1NSU1FKSkgewogICAgICAgICBzZXRBTVJGb3JtYXQodHJ1ZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtTUlNRSkpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbU1JTUUpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCiAgICAgICAgIHNldEFBQ0Zvcm1hdChudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgYml0UmF0ZSk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIG1NSU1FKQorICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLCBtTUlNRSkpIHsKKyAgICAgICAgLy8gVGhlc2UgYXJlIFBDTS1saWtlIGZvcm1hdHMgd2l0aCBhIGZpeGVkIHNhbXBsZSByYXRlIGJ1dAorICAgICAgICAvLyBhIHZhcmlhYmxlIG51bWJlciBvZiBjaGFubmVscy4KKworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisKKyAgICAgICAgc2V0RzcxMUZvcm1hdChudW1DaGFubmVscyk7CiAgICAgfQogCiAgICAgaWYgKCFzdHJuY2FzZWNtcChtTUlNRSwgInZpZGVvLyIsIDYpKSB7CkBAIC0xMzE2LDYgKzEzNTgsMTAgQEAKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIMjYzOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fVlBYLCBtaW1lKSkgeworICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUFg7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgiTm90IGEgc3VwcG9ydGVkIHZpZGVvIG1pbWUgdHlwZTogJXMiLCBtaW1lKTsKICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIE5vdCBhIHN1cHBvcnRlZCB2aWRlbyBtaW1lIHR5cGUuIik7CkBAIC0xMzQxLDggKzEzODcsNiBAQAogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgICAgICBzdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiAgICAgICAgIENIRUNLKGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZCkBAIC0xNDQzLDcgKzE0ODcsOCBAQAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1MZWZ0T3ZlckJ1ZmZlcihOVUxMKSwKICAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpIHsKKyAgICAgIG1OYXRpdmVXaW5kb3coIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5nb29nbGUuIiwgMTEpCisgICAgICAgICAgICAgICAgICAgICAgICA/IE5VTEwgOiBuYXRpdmVXaW5kb3cpIHsKICAgICBtUG9ydFN0YXR1c1trUG9ydEluZGV4SW5wdXRdID0gRU5BQkxFRDsKICAgICBtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSA9IEVOQUJMRUQ7CiAKQEAgLTE1OTgsMTcgKzE2NDMsNyBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7Ci0gICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKLSAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKLQotICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgaWYgKG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgewogICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4SW5wdXQsIE9NWF9UUlVFKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTYxNyw2ICsxNjUyLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBDT0RFQ19MT0dJKCJhbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAogICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplLAogICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CkBAIC0xODMwLDcgKzE4NzYsNyBAQAogCiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCiAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWY7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKICAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKQEAgLTE5MDAsNyArMTk0Niw3IEBACiAKIE9NWENvZGVjOjpCdWZmZXJJbmZvKiBPTVhDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgLy8gRGVxdWV1ZSB0aGUgbmV4dCBidWZmZXIgZnJvbSB0aGUgbmF0aXZlIHdpbmRvdy4KLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgIENPREVDX0xPR0UoImRlcXVldWVCdWZmZXIgZmFpbGVkIHcvIGVycm9yIDB4JTA4eCIsIGVycik7CkBAIC0xOTM2LDYgKzE5ODIsMTEgQEAKIH0KIAogdm9pZCBPTVhDb2RlYzo6b25fbWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBFUlJPUikgeworICAgICAgICBMT0dXKCJEcm9wcGluZyBPTVggbWVzc2FnZSAtIHdlJ3JlIGluIEVSUk9SIHN0YXRlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3dpdGNoIChtc2cudHlwZSkgewogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFVkVOVDoKICAgICAgICAgewpAQCAtMjIzOSwxMyArMjI5MCwxNSBAQAogCiAgICAgICAgICAgICBpZiAoZGF0YTIgPT0gMCB8fCBkYXRhMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSB7CiAgICAgICAgICAgICAgICAgb25Qb3J0U2V0dGluZ3NDaGFuZ2VkKGRhdGExKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YTEgPT0ga1BvcnRJbmRleE91dHB1dAotICAgICAgICAgICAgICAgICAgICAmJiBkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGExID09IGtQb3J0SW5kZXhPdXRwdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uU2NhbGUpKSB7CiAKICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gb2xkT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKICAgICAgICAgICAgICAgICBpbml0T3V0cHV0Rm9ybWF0KG1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKIAotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRIYXNOb3RhYmx5Q2hhbmdlZChvbGRPdXRwdXRGb3JtYXQsIG1PdXRwdXRGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AgJiYKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0SGFzTm90YWJseUNoYW5nZWQob2xkT3V0cHV0Rm9ybWF0LCBtT3V0cHV0Rm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKQEAgLTIyNjQsNiArMjMxNywzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbnZhbGlkLCB3ZSdsbCBrbm93IHNvb24gZW5vdWdoLgogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtTmF0aXZlV2luZG93LmdldCgpLCAmY3JvcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlKSB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFIHNjYWxlOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgICAgICAgICAgICAgICAgIC8vIENoYW5nZSBkaXNwbGF5IGRpbWVuc2lvbiBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgICAgICBpZiAoT0sgPT0gbU9NWC0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZSwgc2l6ZW9mKHNjYWxlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsICZib3R0b20pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNjYWxlIGlzIGluIDE2LjE2IGZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIDEuMCA9IDB4MDEwMDAwLiBXaGVuIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNoYW5nZSB0aGUgZGlzcGxheSwgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIkdldCBPTVhfSW5kZXhDb25maWdTY2FsZTogMHglbHgvMHglbHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS54V2lkdGgsIHNjYWxlLnhIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUueFdpZHRoICE9IDB4MDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmlnaHQgLSBsZWZ0ICsgIDEpICogc2NhbGUueFdpZHRoKSAgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NIYXZlQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZS54SGVpZ2h0ICE9IDB4MDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJvdHRvbSAgLSB0b3AgKyAxKSAqIHNjYWxlLnhIZWlnaHQpID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0yODU5LDYgKzI5NDUsMjMgQEAKIAogICAgICAgICBvZmZzZXQgKz0gc3JjQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAorICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCBtTUlNRSkpIHsKKyAgICAgICAgICAgIENIRUNLKCEobVF1aXJrcyAmIGtTdXBwb3J0c011bHRpcGxlRnJhbWVzUGVySW5wdXRCdWZmZXIpKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGluZm8tPm1TaXplLCBvZmZzZXQgKyBzaXplb2YoaW50MzJfdCkpOworCisgICAgICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgICAgICAgICAgaWYgKCFzcmNCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CisgICAgICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgJm51bVBhZ2VTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZWxlYXNlQnVmZmVyKSB7CiAgICAgICAgICAgICBzcmNCdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIHNyY0J1ZmZlciA9IE5VTEw7CkBAIC0zMTg0LDYgKzMyODcsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgT01YQ29kZWM6OnNldEc3MTFGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscykgeworICAgIENIRUNLKCFtSXNFbmNvZGVyKTsKKyAgICBzZXRSYXdBdWRpb0Zvcm1hdChrUG9ydEluZGV4SW5wdXQsIDgwMDAsIG51bUNoYW5uZWxzKTsKK30KKwogdm9pZCBPTVhDb2RlYzo6c2V0SW1hZ2VPdXRwdXRGb3JtYXQoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZvcm1hdCwgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpIHsKICAgICBDT0RFQ19MT0dWKCJzZXRJbWFnZU91dHB1dEZvcm1hdCglbGQsICVsZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTM5NzQsNiArNDA4MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAoaW50MzJfdClwYXJhbXMublNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJDb2RlYyBvdXRwdXRzIGF0IGRpZmZlcmVudCBzYW1wbGluZyByYXRlIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbnMgKGNvbnRhaW5zIGRhdGEgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBIeiwgY29kZWMgb3V0cHV0cyAlbHUgSHopIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0Q1N0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKIApAQCAtMzk4Niw4ICs0MTAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtUXVpcmtzICYga0RlY29kZXJMaWVzQWJvdXROdW1iZXJPZkNoYW5uZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVtQ2hhbm5lbHMgOiBwYXJhbXMubkNoYW5uZWxzKTsKIAotICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlYy1yZXBvcnRlZCBzYW1wbGVSYXRlIGlzIG5vdCByZWxpYWJsZS4uLgotICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhdWRpb19kZWYtPmVFbmNvZGluZyA9PSBPTVhfQVVESU9fQ29kaW5nQU1SKSB7CiAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgYW1yOwogICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJmFtcik7CkBAIC00MDk0LDYgKzQyMDgsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gSWYgdGhlIGlucHV0IGZvcm1hdCBjb250YWlucyByb3RhdGlvbiBpbmZvcm1hdGlvbiwgZmxhZyB0aGUgb3V0cHV0CisgICAgLy8gZm9ybWF0IGFjY29yZGluZ2x5LgorCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQogfQogCiBzdGF0dXNfdCBPTVhDb2RlYzo6cGF1c2UoKSB7CkBAIC00MTMyLDkgKzQyNTQsMTEgQEAKICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewogICAgICAgICAgICAgLy8gTm90IGFuIE9wZW5NYXggY29tcG9uZW50IGJ1dCBhIHNvZnR3YXJlIGNvZGVjLgogCisjaWYgSEFWRV9TT0ZUV0FSRV9ERUNPREVSUwogICAgICAgICAgICAgcmVzdWx0cy0+cHVzaCgpOwogICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgKmNhcHMgPSAmcmVzdWx0cy0+ZWRpdEl0ZW1BdChyZXN1bHRzLT5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGNhcHMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyNlbmRpZgogCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggNjUzOGEwNS4uMTU2MGI4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0zNzgsMTIgKzM3OCwxOSBAQAogCiBzc2l6ZV90IE15Vm9yYmlzRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzI3XTsKLSAgICBpZiAobVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkKKyAgICBzc2l6ZV90IG47CisgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCiAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIExPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgiLAotICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBvZmZzZXQpOworICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJWxkIGJ5dGVzIiwKKyAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgb2Zmc2V0LCBuKTsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiT2dnUyIsIDQpKSB7CkBAIC00OTgsOCArNTA1LDggQEAKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpcGFja2V0U2l6ZSkgewotICAgICAgICAgICAgICAgIExPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IDB4JTAxNmxseCIsCi0gICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCBkYXRhT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCAweCUwMTZsbHgsIGdvdCAlbGQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgZGF0YU9mZnNldCwgbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggNDIzZGY3MC4uZWIxMzVhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcApAQCAtNTMsNiArNTMsNyBAQAogICAgICAgbU51bVNhbXBsZVNpemVzKDApLAogICAgICAgbVRpbWVUb1NhbXBsZUNvdW50KDApLAogICAgICAgbVRpbWVUb1NhbXBsZShOVUxMKSwKKyAgICAgIG1TYW1wbGVUaW1lRW50cmllcyhOVUxMKSwKICAgICAgIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMoTlVMTCksCiAgICAgICBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzKDApLAogICAgICAgbVN5bmNTYW1wbGVPZmZzZXQoLTEpLApAQCAtNzMsNiArNzQsOSBAQAogICAgIGRlbGV0ZVtdIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CiAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IE5VTEw7CiAKKyAgICBkZWxldGVbXSBtU2FtcGxlVGltZUVudHJpZXM7CisgICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gTlVMTDsKKwogICAgIGRlbGV0ZVtdIG1UaW1lVG9TYW1wbGU7CiAgICAgbVRpbWVUb1NhbXBsZSA9IE5VTEw7CiAKQEAgLTIxNiw3ICsyMjAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCi0gICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gbURlZmF1bHRTYW1wbGVTaXplICYgMHhmOworICAgICAgICBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSA9IG1EZWZhdWx0U2FtcGxlU2l6ZSAmIDB4ZmY7CiAgICAgICAgIG1EZWZhdWx0U2FtcGxlU2l6ZSA9IDA7CiAKICAgICAgICAgaWYgKG1TYW1wbGVTaXplRmllbGRTaXplICE9IDQgJiYgbVNhbXBsZVNpemVGaWVsZFNpemUgIT0gOApAQCAtMzgxLDY3ICszODUsMTMyIEBACiAgICAgcmV0dXJuIHRpbWUxID4gdGltZTIgPyB0aW1lMSAtIHRpbWUyIDogdGltZTIgLSB0aW1lMTsKIH0KIAotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIC8vIFhYWCB0aGlzIGN1cnJlbnRseSB1c2VzIGRlY29kaW5nIHRpbWUsIGluc3RlYWQgb2YgY29tcG9zaXRpb24gdGltZS4KKy8vIHN0YXRpYworaW50IFNhbXBsZVRhYmxlOjpDb21wYXJlSW5jcmVhc2luZ1RpbWUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKSB7CisgICAgY29uc3QgU2FtcGxlVGltZUVudHJ5ICphID0gKGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqKV9hOworICAgIGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqYiA9IChjb25zdCBTYW1wbGVUaW1lRW50cnkgKilfYjsKIAotICAgICpzYW1wbGVfaW5kZXggPSAwOworICAgIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lIDwgYi0+bUNvbXBvc2l0aW9uVGltZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lID4gYi0+bUNvbXBvc2l0aW9uVGltZSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTYW1wbGVUYWJsZTo6YnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHVpbnQzMl90IGN1cl9zYW1wbGUgPSAwOwotICAgIHVpbnQzMl90IHRpbWUgPSAwOworICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gbmV3IFNhbXBsZVRpbWVFbnRyeVttTnVtU2FtcGxlU2l6ZXNdOworCisgICAgdWludDMyX3Qgc2FtcGxlSW5kZXggPSAwOworICAgIHVpbnQzMl90IHNhbXBsZVRpbWUgPSAwOworCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1UaW1lVG9TYW1wbGVDb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQzMl90IG4gPSBtVGltZVRvU2FtcGxlWzIgKiBpXTsKICAgICAgICAgdWludDMyX3QgZGVsdGEgPSBtVGltZVRvU2FtcGxlWzIgKiBpICsgMV07CiAKLSAgICAgICAgaWYgKHJlcV90aW1lIDwgdGltZSArIG4gKiBkZWx0YSkgewotICAgICAgICAgICAgaW50IGogPSAocmVxX3RpbWUgLSB0aW1lKSAvIGRlbHRhOworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBDSEVDSyhzYW1wbGVJbmRleCA8IG1OdW1TYW1wbGVTaXplcyk7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHRpbWUxID0gdGltZSArIGogKiBkZWx0YTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRpbWUyID0gdGltZTEgKyBkZWx0YTsKKyAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVJbmRleF0ubVNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7Ci0gICAgICAgICAgICBpZiAoaSsxID09IG1UaW1lVG9TYW1wbGVDb3VudAotICAgICAgICAgICAgICAgICAgICB8fCAoYWJzX2RpZmZlcmVuY2UocmVxX3RpbWUsIHRpbWUxKQotICAgICAgICAgICAgICAgICAgICAgICAgPCBhYnNfZGlmZmVyZW5jZShyZXFfdGltZSwgdGltZTIpKSkgewotICAgICAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBjdXJfc2FtcGxlICsgajsKLSAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gdGltZTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBjdXJfc2FtcGxlICsgaiArIDE7Ci0gICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IHRpbWUyOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW3NhbXBsZUluZGV4XS5tQ29tcG9zaXRpb25UaW1lID0KKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICsgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKIAotICAgICAgICAgICAgc3dpdGNoIChmbGFncykgewotICAgICAgICAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IHJlcV90aW1lICYmICpzYW1wbGVfaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLSpzYW1wbGVfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPCByZXFfdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICpzYW1wbGVfaW5kZXggKyAxIDwgbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKypzYW1wbGVfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7CisgICAgICAgICAgICBzYW1wbGVUaW1lICs9IGRlbHRhOwogICAgICAgICB9Ci0KLSAgICAgICAgdGltZSArPSBkZWx0YSAqIG47Ci0gICAgICAgIGN1cl9zYW1wbGUgKz0gbjsKICAgICB9CiAKLSAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIHFzb3J0KG1TYW1wbGVUaW1lRW50cmllcywgbU51bVNhbXBsZVNpemVzLCBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKKyAgICAgICAgICBDb21wYXJlSW5jcmVhc2luZ1RpbWUpOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKKyAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKKworICAgIHVpbnQzMl90IGxlZnQgPSAwOworICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVNhbXBsZVNpemVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICB1aW50MzJfdCBjZW50ZXJUaW1lID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubUNvbXBvc2l0aW9uVGltZTsKKworICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7CisgICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlZnQgPT0gbU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgLS1sZWZ0OworICAgIH0KKworICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7CisKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggPiAwCisgICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHJlcV90aW1lKSB7CisgICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGNsb3Nlc3RJbmRleCArIDEgPCBtTnVtU2FtcGxlU2l6ZXMKKyAgICAgICAgICAgICAgICAgICAgJiYgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcmVxX3RpbWUpIHsKKyAgICAgICAgICAgICAgICArK2Nsb3Nlc3RJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKworICAgICAgICAgICAgaWYgKGNsb3Nlc3RJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBsZWZ0IG5laWdoYm91ciBhbmQgcGljayBjbG9zZXN0LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGFic2RpZmYxID0KKyAgICAgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdGltZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNkaWZmMiA9CisgICAgICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXggLSAxXS5tQ29tcG9zaXRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChhYnNkaWZmMSA+IGFic2RpZmYyKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RJbmRleCA9IGNsb3Nlc3RJbmRleCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tU2FtcGxlSW5kZXg7CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU3luY1NhbXBsZU5lYXIoCkBAIC02MTMsNyArNjgyLDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICB1aW50MzJfdCAqZGVjb2RpbmdUaW1lLAorICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAogICAgICAgICBib29sICppc1N5bmNTYW1wbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC02MzAsOCArNjk5LDggQEAKICAgICAgICAgKnNpemUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVNpemUoKTsKICAgICB9CiAKLSAgICBpZiAoZGVjb2RpbmdUaW1lKSB7Ci0gICAgICAgICpkZWNvZGluZ1RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKyAgICBpZiAoY29tcG9zaXRpb25UaW1lKSB7CisgICAgICAgICpjb21wb3NpdGlvblRpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKICAgICB9CiAKICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggODRmNjVmZi4uZjgyZmYzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMzcsNyArMzcsOCBAQAogICAgICAgICAiLm1wMyIsICIubXA0IiwgIi5tNGEiLCAiLjNncCIsICIuM2dwcCIsICIuM2cyIiwgIi4zZ3BwMiIsCiAgICAgICAgICIubXBlZyIsICIub2dnIiwgIi5taWQiLCAiLnNtZiIsICIuaW15IiwgIi53bWEiLCAiLmFhYyIsCiAgICAgICAgICIud2F2IiwgIi5hbXIiLCAiLm1pZGkiLCAiLnhtZiIsICIucnR0dGwiLCAiLnJ0eCIsICIub3RhIiwKLSAgICAgICAgIi5ta3YiLCAiLm1rYSIsICIud2VibSIsICIudHMiLCAiLmZsIiwgIi5mbGFjIgorICAgICAgICAiLm1rdiIsICIubWthIiwgIi53ZWJtIiwgIi50cyIsICIuZmwiLCAiLmZsYWMiLCAiLm14bWYiLAorICAgICAgICAiLmF2aSIsCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1WYWxpZEV4dGVuc2lvbnMgPQogICAgICAgICBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9ucykgLyBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9uc1swXSk7CkBAIC0xMjQsNyArMTI1LDggQEAKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi54bWYiKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLnJ0dHRsIikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5ydHgiKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm90YSIpKSB7CisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIub3RhIikKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5teG1mIikpIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSGFuZGxlTUlESShwYXRoLCAmY2xpZW50KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZWEzYjgwMS4uZGUzOTU3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00OCw3ICs0OSw4IEBACiAgICAgbUNsaWVudC5kaXNjb25uZWN0KCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqdXJpKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOwogCiAgICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7CkBAIC01Niw3ICs1OCw3IEBACiAgICAgZGVsZXRlIG1BbGJ1bUFydDsKICAgICBtQWxidW1BcnQgPSBOVUxMOwogCi0gICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpKTsKKyAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmksIGhlYWRlcnMpOwogCiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTE0NSw3ICsxNDcsOCBAQAogCiAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOwogICAgIGlmIChmcmFtZVRpbWVVcyA8IDApIHsKLSAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpKSB7CisgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQorICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7CiAgICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKICAgICAgICAgfQogICAgICAgICBvcHRpb25zLnNldFNlZWtUbyh0aHVtYk5haWxUaW1lLCBtb2RlKTsKQEAgLTIzMSw2ICsyMzQsMTQgQEAKICAgICBmcmFtZS0+bURhdGEgPSBuZXcgdWludDhfdFtmcmFtZS0+bVNpemVdOwogICAgIGZyYW1lLT5tUm90YXRpb25BbmdsZSA9IHJvdGF0aW9uQW5nbGU7CiAKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpKSB7CisgICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0gZGlzcGxheVdpZHRoOworICAgIH0KKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKKyAgICAgICAgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID0gZGlzcGxheUhlaWdodDsKKyAgICB9CisKICAgICBpbnQzMl90IHNyY0Zvcm1hdDsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7CiAKQEAgLTMwNiw2ICszMTcsMTcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICBpZiAobUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZkYXRhU2l6ZSkKKyAgICAgICAgICAgICYmIG1BbGJ1bUFydCA9PSBOVUxMKSB7CisgICAgICAgIG1BbGJ1bUFydCA9IG5ldyBNZWRpYUFsYnVtQXJ0OworICAgICAgICBtQWxidW1BcnQtPm1TaXplID0gZGF0YVNpemU7CisgICAgICAgIG1BbGJ1bUFydC0+bURhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07CisgICAgICAgIG1lbWNweShtQWxidW1BcnQtPm1EYXRhLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgfQorCiAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPQogICAgICAgICBleHRyYWN0VmlkZW9GcmFtZVdpdGhDb2RlY0ZsYWdzKAogICAgICAgICAgICAgICAgICZtQ2xpZW50LCB0cmFja01ldGEsIHNvdXJjZSwgT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcywKQEAgLTM5Nyw3ICs0MTksOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgdWludDMyX3QgdHlwZTsKICAgICBzaXplX3QgZGF0YVNpemU7Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpKSB7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpCisgICAgICAgICAgICAmJiBtQWxidW1BcnQgPT0gTlVMTCkgewogICAgICAgICBtQWxidW1BcnQgPSBuZXcgTWVkaWFBbGJ1bUFydDsKICAgICAgICAgbUFsYnVtQXJ0LT5tU2l6ZSA9IGRhdGFTaXplOwogICAgICAgICBtQWxidW1BcnQtPm1EYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOwpAQCAtNDExLDggKzQzNCwxNSBAQAogCiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgU3RyaW5nOCh0bXApKTsKIAorICAgIGJvb2wgaGFzQXVkaW8gPSBmYWxzZTsKKyAgICBib29sIGhhc1ZpZGVvID0gZmFsc2U7CisgICAgaW50MzJfdCB2aWRlb1dpZHRoID0gLTE7CisgICAgaW50MzJfdCB2aWRlb0hlaWdodCA9IC0xOworICAgIGludDMyX3QgYXVkaW9CaXRyYXRlID0gLTE7CisKICAgICAvLyBUaGUgb3ZlcmFsbCBkdXJhdGlvbiBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3QgdHJhY2suCiAgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKKyAgICBTdHJpbmc4IHRpbWVkVGV4dExhbmc7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKIApAQCAtNDIyLDEyICs0NTIsNjcgQEAKICAgICAgICAgICAgICAgICBtYXhEdXJhdGlvblVzID0gZHVyYXRpb25VczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICBpZiAoIWhhc0F1ZGlvICYmICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICBoYXNBdWRpbyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYXVkaW9CaXRyYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb0JpdHJhdGUgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNWaWRlbyAmJiAhc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgaGFzVmlkZW8gPSB0cnVlOworCisgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmdmlkZW9XaWR0aCkpOworICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2aWRlb0hlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZzsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCAmbGFuZyk7CisgICAgICAgICAgICAgICAgdGltZWRUZXh0TGFuZy5hcHBlbmQoU3RyaW5nOChsYW5nKSk7CisgICAgICAgICAgICAgICAgdGltZWRUZXh0TGFuZy5hcHBlbmQoU3RyaW5nOCgiOiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRvIHNhdmUgdGhlIGxhbmd1YWdlIGNvZGVzIGZvciBhbGwgdGltZWQgdGV4dCB0cmFja3MKKyAgICAvLyBJZiBtdWx0aXBsZSB0ZXh0IHRyYWNrcyBwcmVzZW50LCB0aGUgZm9ybWF0IHdpbGwgbG9vaworICAgIC8vIGxpa2UgImVuZzpjaGkiCisgICAgaWYgKCF0aW1lZFRleHRMYW5nLmlzRW1wdHkoKSkgeworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9USU1FRF9URVhUX0xBTkdVQUdFUywgdGltZWRUZXh0TGFuZyk7CiAgICAgfQogCiAgICAgLy8gVGhlIGR1cmF0aW9uIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZHVyYXRpb24gaW4gbXMuCiAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRFVSQVRJT04sIFN0cmluZzgodG1wKSk7CiAKKyAgICBpZiAoaGFzQXVkaW8pIHsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX0FVRElPLCBTdHJpbmc4KCJ5ZXMiKSk7CisgICAgfQorCisgICAgaWYgKGhhc1ZpZGVvKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19WSURFTywgU3RyaW5nOCgieWVzIikpOworCisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb1dpZHRoKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fV0lEVEgsIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvSGVpZ2h0KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fSEVJR0hULCBTdHJpbmc4KHRtcCkpOworICAgIH0KKworICAgIGlmIChudW1UcmFja3MgPT0gMSAmJiBoYXNBdWRpbyAmJiBhdWRpb0JpdHJhdGUgPj0gMCkgeworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgYXVkaW9CaXRyYXRlKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQklUUkFURSwgU3RyaW5nOCh0bXApKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmY2NF90IHNvdXJjZVNpemU7CisgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgeworICAgICAgICAgICAgaW50NjRfdCBhdmdCaXRSYXRlID0gKGludDY0X3QpKHNvdXJjZVNpemUgKiA4RTYgLyBtYXhEdXJhdGlvblVzKTsKKworICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgYXZnQml0UmF0ZSk7CisgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG51bVRyYWNrcyA9PSAxKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVNSU1FOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZmaWxlTUlNRSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAppbmRleCA0OGJkZGMyLi42Zjk2OGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9WQlJJU2Vla2VyLmgiCiAKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVAzRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDYsNyArNDcsNyBAQAogICAgIHVpbnQzMl90IHRtcCA9IFUzMl9BVCgmaGVhZGVyWzBdKTsKICAgICBzaXplX3QgZnJhbWVTaXplOwogICAgIGludCBzYW1wbGVSYXRlOwotICAgIGlmICghTVAzRXh0cmFjdG9yOjpnZXRfbXAzX2ZyYW1lX3NpemUodG1wLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSh0bXAsICZmcmFtZVNpemUsICZzYW1wbGVSYXRlKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IDkzMzIxMjAuLmJmOTc4ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcApAQCAtMjY0LDYgKzI2NCw4IEBACiAgICAgICBtR3JvdXAoTlVMTCkgewogICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwogICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOworCisgICAgbU1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNTMsOCArMzU1LDYgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgbUN1cnJlbnRQb3MgKz0gbjsKLQogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewpAQCAtNDA2LDYgKzQwNiw3IEBACiAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGUpOwogCiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBtQ3VycmVudFBvcyArPSBuOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIApAQCAtNDI2LDYgKzQyNywxMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICBpZiAoZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVY7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjNmOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9YSU5HU2Vla2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwCmluZGV4IDYxNjgzNmMuLjBkMGQ2YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwCkBAIC00MSw4ICs0MSw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIExPR0koIkZvdW5kIFhJTkcgaGVhZGVyLiIpOwotCiAgICAgcmV0dXJuIHNlZWtlcjsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKaW5kZXggOTVjZjJkMy4uMDIwZTk0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCkBAIC0zNzYsNSArMzc2LDIzNiBAQAogICAgIHJldHVybiBtZXRhOwogfQogCitib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBBQml0UmVhZGVyIGJyKCZkYXRhWzRdLCBzaXplIC0gNCk7CisgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByYW5kb21fYWNjZXNzaWJsZV92b2wKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uID0gYnIuZ2V0Qml0cyg4KTsKKworICAgIENIRUNLX05FKHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24sCisgICAgICAgICAgICAgMHgyMXUgLyogRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZSAqLyk7CisKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQ7CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5OworICAgIGlmIChici5nZXRCaXRzKDEpKSB7CisgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSA9IGJyLmdldEJpdHMoMyk7CisgICAgfQorICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pbmZvID0gYnIuZ2V0Qml0cyg0KTsKKyAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm8gPT0gMHgwZiAvKiBleHRlbmRlZCBQQVIgKi8pIHsKKyAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfd2lkdGgKKyAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfaGVpZ2h0CisgICAgfQorICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2b2xfY29udHJvbF9wYXJhbWV0ZXJzCisgICAgICAgIGJyLnNraXBCaXRzKDIpOyAgLy8gY2hyb21hX2Zvcm1hdAorICAgICAgICBici5za2lwQml0cygxKTsgIC8vIGxvd19kZWxheQorICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdmJ2X3BhcmFtZXRlcnMKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGZpcnN0X2hhbGZfYml0X3JhdGUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gbGF0dGVyX2hhbGZfYml0X3JhdGUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMyk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDExKTsgIC8vIGZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5CisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSBici5nZXRCaXRzKDIpOworICAgIENIRUNLX0VRKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSwgMHgwMHUgLyogcmVjdGFuZ3VsYXIgKi8pOworCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSBici5nZXRCaXRzKDE2KTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKworICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmaXhlZF92b3BfcmF0ZQorICAgICAgICAvLyByYW5nZSBbMC4udm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24pCisKKyAgICAgICAgLy8gdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24KKyAgICAgICAgLy8gMiA9PiAwLi4xLCAxIGJpdAorICAgICAgICAvLyAzID0+IDAuLjIsIDIgYml0cworICAgICAgICAvLyA0ID0+IDAuLjMsIDIgYml0cworICAgICAgICAvLyA1ID0+IDAuLjQsIDMgYml0cworICAgICAgICAvLyAuLi4KKworICAgICAgICBDSEVDS19HVCh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiwgMHUpOworICAgICAgICAtLXZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCisgICAgICAgIHVuc2lnbmVkIG51bUJpdHMgPSAwOworICAgICAgICB3aGlsZSAodm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwKSB7CisgICAgICAgICAgICArK251bUJpdHM7CisgICAgICAgICAgICB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGJyLnNraXBCaXRzKG51bUJpdHMpOyAgLy8gZml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50CisgICAgfQorCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorCisgICAgdW5zaWduZWQgaW50ZXJsYWNlZCA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CisgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgIHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICBpbnQgKm91dF9zYW1wbGluZ19yYXRlLCBpbnQgKm91dF9jaGFubmVscywKKyAgICAgICAgaW50ICpvdXRfYml0cmF0ZSwgaW50ICpvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAqZnJhbWVfc2l6ZSA9IDA7CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgICpvdXRfY2hhbm5lbHMgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAqb3V0X2JpdHJhdGUgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgfQorCisgICAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB2ZXJzaW9uID0gKGhlYWRlciA+PiAxOSkgJiAzOworCisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisKKyAgICBpZiAobGF5ZXIgPT0gMHgwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgcHJvdGVjdGlvbiA9IChoZWFkZXIgPj4gMTYpICYgMTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisKKyAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAwIHx8IGJpdHJhdGVfaW5kZXggPT0gMHgwZikgeworICAgICAgICAvLyBEaXNhbGxvdyAiZnJlZSIgYml0cmF0ZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisKKyAgICBpZiAoc2FtcGxpbmdfcmF0ZV9pbmRleCA9PSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0geyA0NDEwMCwgNDgwMDAsIDMyMDAwIH07CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgICAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAxOworCisgICAgaWYgKGxheWVyID09IDMpIHsKKyAgICAgICAgLy8gbGF5ZXIgSQorCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMVtdID0geworICAgICAgICAgICAgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsCisgICAgICAgICAgICAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPSB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAgICAgICAgIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZSA9CisgICAgICAgICAgICAodmVyc2lvbiA9PSAzIC8qIFYxICovKQorICAgICAgICAgICAgICAgID8ga0JpdHJhdGVWMVtiaXRyYXRlX2luZGV4IC0gMV0KKyAgICAgICAgICAgICAgICA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgICpmcmFtZV9zaXplID0gKDEyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nKSAqIDQ7CisKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxheWVyIElJIG9yIElJSQorCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPSB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAgICAgICAgIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0geworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwKKyAgICAgICAgICAgIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKKyAgICAgICAgICAgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LAorICAgICAgICAgICAgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKQorICAgICAgICAgICAgICAgID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXQorICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVjIgKG9yIDIuNSkKKworICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSA1NzY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gNzIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKKworICAgICAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiMjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKKyAgICAgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAgICAgICAgIFwKKyAgICAgICAgc3VwcG9ydC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgIGV4dGVybmFsL2Nocm9taXVtIFwKKyAgICAgICAgZXh0ZXJuYWwvY2hyb21pdW0vYW5kcm9pZAorCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydAoraW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKK2VuZGlmCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNocm9taXVtSFRUUERhdGFTb3VyY2UiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworI2luY2x1ZGUgInN1cHBvcnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKQorICAgIDogbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbURlbGVnYXRlKG5ldyBTZkRlbGVnYXRlKSwKKyAgICAgIG1DdXJyZW50T2Zmc2V0KDApLAorICAgICAgbUlPUmVzdWx0KE9LKSwKKyAgICAgIG1Db250ZW50U2l6ZSgtMSksCisgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKKyAgICBtRGVsZWdhdGUtPnNldE93bmVyKHRoaXMpOworfQorCitDaHJvbWl1bUhUVFBEYXRhU291cmNlOjp+Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7CisKKyAgICBkZWxldGUgbURlbGVnYXRlOworICAgIG1EZWxlZ2F0ZSA9IE5VTEw7CisKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHJldHVybiBjb25uZWN0X2wodXJpLCBoZWFkZXJzLCBvZmZzZXQpOworfQorCitzdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjb25uZWN0X2woCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgZGlzY29ubmVjdF9sKCk7CisgICAgfQorCisgICAgaWYgKCEobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pKSB7CisgICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgImNvbm5lY3QgdG8gJXMgQCVsbGQiLCB1cmksIG9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLAorICAgICAgICAgICAgICAgICJjb25uZWN0IHRvIDxVUkwgc3VwcHJlc3NlZD4gQCVsbGQiLCBvZmZzZXQpOworICAgIH0KKworICAgIG1VUkkgPSB1cmk7CisgICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIG1IZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhlYWRlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBDT05ORUNUSU5HOworICAgIG1Db250ZW50U2l6ZSA9IC0xOworICAgIG1DdXJyZW50T2Zmc2V0ID0gb2Zmc2V0OworCisgICAgbURlbGVnYXRlLT5pbml0aWF0ZUNvbm5lY3Rpb24obVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RFRCA/IE9LIDogbUlPUmVzdWx0OworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAorICAgICAgICBpbnQ2NF90IGNvbnRlbnRTaXplLCBjb25zdCBjaGFyICpjb250ZW50VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgIG1Db250ZW50U2l6ZSA9IChjb250ZW50U2l6ZSA8IDApID8gLTEgOiBjb250ZW50U2l6ZSArIG1DdXJyZW50T2Zmc2V0OworICAgIG1Db250ZW50VHlwZSA9IFN0cmluZzgoY29udGVudFR5cGUpOworICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7CisKKyAgICBtVVJJLmNsZWFyKCk7CisKKyAgICBtSU9SZXN1bHQgPSBlcnI7CisKKyAgICBjbGVhckRSTVN0YXRlX2woKTsKK30KKwordm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgZGlzY29ubmVjdF9sKCk7Cit9CisKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdF9sKCkgeworICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNUSU5HOworICAgIG1JT1Jlc3VsdCA9IC1FSU5UUjsKKworICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVEaXNjb25uZWN0KCk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IERJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOworfQorCitzdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IENocm9taXVtSFRUUERhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKG9mZnNldCAhPSBtQ3VycmVudE9mZnNldCkgeworICAgICAgICBBU3RyaW5nIHRtcCA9IG1VUkk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IHRtcEhlYWRlcnMgPSBtSGVhZGVyczsKKworICAgICAgICBkaXNjb25uZWN0X2woKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wodG1wLmNfc3RyKCksICZ0bXBIZWFkZXJzLCBvZmZzZXQpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhdGUgPSBSRUFESU5HOworCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gUkVBRElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGlmIChtSU9SZXN1bHQgPCBPSykgeworICAgICAgICByZXR1cm4gbUlPUmVzdWx0OworICAgIH0KKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7CisKKyAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OworICAgICAgICByZXR1cm4gbUlPUmVzdWx0OworICAgIH0KKworICAgIHJldHVybiBFUlJPUl9JTzsKK30KKwordm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1JT1Jlc3VsdCA9IHNpemU7CisKKyAgICBpZiAobVN0YXRlID09IFJFQURJTkcpIHsKKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtQ29udGVudFNpemUgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1Db250ZW50U2l6ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6SW5pdGlhdGVSZWFkKAorICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBtZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uRGlzY29ubmVjdENvbXBsZXRlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVElORyk7CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgbVVSSS5jbGVhcigpOworCisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKworICAgIGNsZWFyRFJNU3RhdGVfbCgpOworfQorCitzcDxEZWNyeXB0SGFuZGxlPiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgIH0KKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vdGUgaWYgcmVkaXJlY3Qgb2NjdXJzLCBtVXJpIGlzIHRoZSByZWRpcmVjdCB1cmkgaW5zdGVhZCBvZiB0aGUKKyAgICAgICAgICogb3JpZ2luYWwgb25lCisgICAgICAgICAqLworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nOChtVVJJLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Cit9CisKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbygKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK1N0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0VXJpKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gU3RyaW5nOChtVVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNsZWFyRFJNU3RhdGVfbCgpIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCisgICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDViZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcApAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVN1cHBvcnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgInN1cHBvcnQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbmV0L2FuZHJvaWRfbmV0d29ya19saWJyYXJ5X2ltcGwuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9jZXJ0X3ZlcmlmaWVyLmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvaG9zdF9yZXNvbHZlci5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL3NzbF9jb25maWdfc2VydmljZS5oIgorI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfYXV0aF9oYW5kbGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2NhY2hlLmgiCisjaW5jbHVkZSAibmV0L3Byb3h5L3Byb3h5X2NvbmZpZ19zZXJ2aWNlX2FuZHJvaWQuaCIKKworI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBNdXRleCBnTmV0d29ya1RocmVhZExvY2s7CitzdGF0aWMgYmFzZTo6VGhyZWFkICpnTmV0d29ya1RocmVhZCA9IE5VTEw7CitzdGF0aWMgc2NvcGVkX3JlZnB0cjxVUkxSZXF1ZXN0Q29udGV4dD4gZ1JlcUNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdOZXR3b3JrVGhyZWFkTG9jayk7CisgICAgaWYgKGdOZXR3b3JrVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgZ05ldHdvcmtUaHJlYWQgPSBuZXcgYmFzZTo6VGhyZWFkKCJuZXR3b3JrIik7CisgICAgICAgIGJhc2U6OlRocmVhZDo6T3B0aW9ucyBvcHRpb25zOworICAgICAgICBvcHRpb25zLm1lc3NhZ2VfbG9vcF90eXBlID0gTWVzc2FnZUxvb3A6OlRZUEVfSU87CisgICAgICAgIENIRUNLKGdOZXR3b3JrVGhyZWFkLT5TdGFydFdpdGhPcHRpb25zKG9wdGlvbnMpKTsKKworICAgICAgICBnUmVxQ29udGV4dCA9IG5ldyBTZlJlcXVlc3RDb250ZXh0OworCisgICAgICAgIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5OjpSZWdpc3RlclNoYXJlZEluc3RhbmNlKAorICAgICAgICAgICAgICAgIG5ldyBTZk5ldHdvcmtMaWJyYXJ5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIE1ZX0xPR0koY29uc3QgY2hhciAqcykgeworICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIiVzIiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIE1ZX0xPR1YoY29uc3QgY2hhciAqcykgeworI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAorICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgIiVzIiwgcyk7CisjZW5kaWYKK30KKworU2ZOZXRMb2c6OlNmTmV0TG9nKCkKKyAgICA6IG1OZXh0SUQoMSkgeworfQorCit2b2lkIFNmTmV0TG9nOjpBZGRFbnRyeSgKKyAgICAgICAgRXZlbnRUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKKyAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCisgICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCisgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKSB7CisjaWYgMAorICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICJBZGRFbnRyeSB0aW1lPSVzIHR5cGU9JXMgc291cmNlPSVzIHBoYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgIFRpY2tDb3VudFRvU3RyaW5nKHRpbWUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgRXZlbnRUeXBlVG9TdHJpbmcodHlwZSksCisgICAgICAgICAgICAgICAgU291cmNlVHlwZVRvU3RyaW5nKHNvdXJjZS50eXBlKSwKKyAgICAgICAgICAgICAgICBFdmVudFBoYXNlVG9TdHJpbmcocGhhc2UpKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit1aW50MzIgU2ZOZXRMb2c6Ok5leHRJRCgpIHsKKyAgICByZXR1cm4gbU5leHRJRCsrOworfQorCituZXQ6Ok5ldExvZzo6TG9nTGV2ZWwgU2ZOZXRMb2c6OkdldExvZ0xldmVsKCkgY29uc3QgeworICAgIHJldHVybiBMT0dfQUxMOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTZlJlcXVlc3RDb250ZXh0OjpTZlJlcXVlc3RDb250ZXh0KCkgeworICAgIEFTdHJpbmcgdWE7CisgICAgdWEuYXBwZW5kKCJzdGFnZWZyaWdodC8xLjIgKExpbnV4O0FuZHJvaWQgIik7CisKKyNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKKyNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKKyNlbmRpZgorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7CisgICAgdWEuYXBwZW5kKHZhbHVlKTsKKyAgICB1YS5hcHBlbmQoIikiKTsKKworICAgIG1Vc2VyQWdlbnQgPSB1YS5jX3N0cigpOworCisgICAgbmV0X2xvZ18gPSBuZXcgU2ZOZXRMb2c7CisKKyAgICBob3N0X3Jlc29sdmVyXyA9CisgICAgICAgIG5ldDo6Q3JlYXRlU3lzdGVtSG9zdFJlc29sdmVyKAorICAgICAgICAgICAgICAgIG5ldDo6SG9zdFJlc29sdmVyOjprRGVmYXVsdFBhcmFsbGVsaXNtLAorICAgICAgICAgICAgICAgIE5VTEwgLyogcmVzb2x2ZXJfcHJvYyAqLywKKyAgICAgICAgICAgICAgICBuZXRfbG9nXyk7CisKKyAgICBzc2xfY29uZmlnX3NlcnZpY2VfID0KKyAgICAgICAgbmV0OjpTU0xDb25maWdTZXJ2aWNlOjpDcmVhdGVTeXN0ZW1TU0xDb25maWdTZXJ2aWNlKCk7CisKKyAgICBwcm94eV9zZXJ2aWNlXyA9IG5ldDo6UHJveHlTZXJ2aWNlOjpDcmVhdGVXaXRob3V0UHJveHlSZXNvbHZlcigKKyAgICAgICAgICAgIG5ldyBuZXQ6OlByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQsIG5ldF9sb2dfKTsKKworICAgIGh0dHBfdHJhbnNhY3Rpb25fZmFjdG9yeV8gPSBuZXcgbmV0OjpIdHRwQ2FjaGUoCisgICAgICAgICAgICBob3N0X3Jlc29sdmVyXywKKyAgICAgICAgICAgIG5ldyBuZXQ6OkNlcnRWZXJpZmllcigpLAorICAgICAgICAgICAgZG5zcnJfcmVzb2x2ZXJfLAorICAgICAgICAgICAgZG5zX2NlcnRfY2hlY2tlcl8uZ2V0KCksCisgICAgICAgICAgICBwcm94eV9zZXJ2aWNlXy5nZXQoKSwKKyAgICAgICAgICAgIHNzbF9jb25maWdfc2VydmljZV8uZ2V0KCksCisgICAgICAgICAgICBuZXQ6Okh0dHBBdXRoSGFuZGxlckZhY3Rvcnk6OkNyZWF0ZURlZmF1bHQoaG9zdF9yZXNvbHZlcl8pLAorICAgICAgICAgICAgbmV0d29ya19kZWxlZ2F0ZV8sCisgICAgICAgICAgICBuZXRfbG9nXywKKyAgICAgICAgICAgIE5VTEwpOyAgLy8gYmFja2VuZF9mYWN0b3J5Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nICZTZlJlcXVlc3RDb250ZXh0OjpHZXRVc2VyQWdlbnQoY29uc3QgR1VSTCAmdXJsKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2VyQWdlbnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NmTmV0d29ya0xpYnJhcnk6OlNmTmV0d29ya0xpYnJhcnkoKSB7fQorCitTZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlSZXN1bHQgU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5WDUwOUNlcnRDaGFpbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpIHsKKyAgICByZXR1cm4gVkVSSUZZX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTZkRlbGVnYXRlOjpTZkRlbGVnYXRlKCkKKyAgICA6IG1Pd25lcihOVUxMKSwKKyAgICAgIG1VUkxSZXF1ZXN0KE5VTEwpLAorICAgICAgbVJlYWRCdWZmZXIobmV3IG5ldDo6SU9CdWZmZXJXaXRoU2l6ZSg4MTkyKSksCisgICAgICBtTnVtQnl0ZXNSZWFkKDApLAorICAgICAgbU51bUJ5dGVzVG90YWwoMCksCisgICAgICBtRGF0YURlc3RpbmF0aW9uKE5VTEwpLAorICAgICAgbUF0RU9TKGZhbHNlKSB7CisgICAgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpOworfQorCitTZkRlbGVnYXRlOjp+U2ZEZWxlZ2F0ZSgpIHsKKyAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpzZXRPd25lcihDaHJvbWl1bUhUVFBEYXRhU291cmNlICpvd25lcikgeworICAgIG1Pd25lciA9IG93bmVyOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uUmVjZWl2ZWRSZWRpcmVjdCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpIHsKKyAgICBNWV9MT0dJKCJPblJlY2VpdmVkUmVkaXJlY3QiKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkF1dGhSZXF1aXJlZCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKSB7CisgICAgTVlfTE9HSSgiT25BdXRoUmVxdWlyZWQiKTsKKworICAgIGluaGVyaXRlZDo6T25BdXRoUmVxdWlyZWQocmVxdWVzdCwgYXV0aF9pbmZvKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAorICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pIHsKKyAgICBNWV9MT0dJKCJPbkNlcnRpZmljYXRlUmVxdWVzdGVkIik7CisKKyAgICBpbmhlcml0ZWQ6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQocmVxdWVzdCwgY2VydF9yZXF1ZXN0X2luZm8pOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcigKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPblNTTENlcnRpZmljYXRlRXJyb3IgY2VydF9lcnJvcj0lZFxuIiwgY2VydF9lcnJvcik7CisKKyAgICBpbmhlcml0ZWQ6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcihyZXF1ZXN0LCBjZXJ0X2Vycm9yLCBjZXJ0KTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7CisgICAgTVlfTE9HSSgiT25HZXRDb29raWVzIik7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6T25TZXRDb29raWUoCisgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAorICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKKyAgICBNWV9MT0dJKCJPblNldENvb2tpZSIpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBVUkxSZXF1ZXN0U3RhdHVzOjpTVUNDRVNTKSB7CisgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgYW5kIG9zX2Vycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLm9zX2Vycm9yKCkpLmNfc3RyKCkpOworCisgICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKKyAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOworCisgICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKEVSUk9SX0lPKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobVJhbmdlUmVxdWVzdGVkICYmIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpICE9IDIwNikgeworICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIldlIHJlcXVlc3RlZCBhIGNvbnRlbnQgcmFuZ2UsIGJ1dCBzZXJ2ZXIgZGlkbid0ICIKKyAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgdGhhdC4gKHJlc3BvbmRlZCB3aXRoICVkKSIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKKworICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7CisgICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKKworICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZCgtRVBJUEUpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmICgocmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgLyAxMDApICE9IDIpIHsKKyAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggaHR0cCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSkuY19zdHIoKSk7CisKKyAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OworICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7CisKKyAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTVlfTE9HVigiT25SZXNwb25zZVN0YXJ0ZWQiKTsKKworICAgIHN0ZDo6c3RyaW5nIGhlYWRlcnM7CisgICAgcmVxdWVzdC0+R2V0QWxsUmVzcG9uc2VIZWFkZXJzKCZoZWFkZXJzKTsKKworICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJyZXNwb25zZSBoZWFkZXJzOiAlcyIsIGhlYWRlcnMuY19zdHIoKSkuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZTsKKyAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUhlYWRlckJ5TmFtZSgiQ29udGVudC1UeXBlIiwgJmNvbnRlbnRUeXBlKTsKKworICAgIG1Pd25lci0+b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCisgICAgICAgICAgICByZXF1ZXN0LT5HZXRFeHBlY3RlZENvbnRlbnRTaXplKCksIGNvbnRlbnRUeXBlLmNfc3RyKCkpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKSB7CisgICAgaWYgKGJ5dGVzX3JlYWQgPT0gLTEpIHsKKyAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICJPblJlYWRDb21wbGV0ZWQsIHJlYWQgZmFpbGVkLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7CisKKyAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoRVJST1JfSU8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTVlfTE9HVihTdHJpbmdQcmludGYoIk9uUmVhZENvbXBsZXRlZCwgcmVhZCAlZCBieXRlcyIsIGJ5dGVzX3JlYWQpLmNfc3RyKCkpOworCisgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7CisgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiUmVhZCBmYWlsZWQgdy8gc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7CisKKyAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoRVJST1JfSU8pOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQobU51bUJ5dGVzUmVhZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDS19HVChieXRlc19yZWFkLCAwKTsKKyAgICBDSEVDS19MRShtTnVtQnl0ZXNSZWFkICsgYnl0ZXNfcmVhZCwgbU51bUJ5dGVzVG90YWwpOworCisgICAgbWVtY3B5KCh1aW50OF90ICopbURhdGFEZXN0aW5hdGlvbiArIG1OdW1CeXRlc1JlYWQsCisgICAgICAgICAgIG1SZWFkQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgIGJ5dGVzX3JlYWQpOworCisgICAgbU51bUJ5dGVzUmVhZCArPSBieXRlc19yZWFkOworCisgICAgcmVhZE1vcmUocmVxdWVzdCk7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6cmVhZE1vcmUobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KSB7CisgICAgd2hpbGUgKG1OdW1CeXRlc1JlYWQgPCBtTnVtQnl0ZXNUb3RhbCkgeworICAgICAgICBzaXplX3QgY29weSA9IG1OdW1CeXRlc1RvdGFsIC0gbU51bUJ5dGVzUmVhZDsKKyAgICAgICAgaWYgKGNvcHkgPiBtUmVhZEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBjb3B5ID0gbVJlYWRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuOworICAgICAgICBpZiAocmVxdWVzdC0+UmVhZChtUmVhZEJ1ZmZlciwgY29weSwgJm4pKSB7CisgICAgICAgICAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiUmVhZCAlZCBieXRlcyBkaXJlY3RseS4iLCBuKS5jX3N0cigpKTsKKworICAgICAgICAgICAgQ0hFQ0tfTEUoKHNpemVfdCluLCBjb3B5KTsKKworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopbURhdGFEZXN0aW5hdGlvbiArIG1OdW1CeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBuKTsKKworICAgICAgICAgICAgbU51bUJ5dGVzUmVhZCArPSBuOworCisgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1ZX0xPR1YoInJlYWRNb3JlIHBlbmRpbmcgcmVhZCIpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkgIT0gVVJMUmVxdWVzdFN0YXR1czo6SU9fUEVORElORykgeworICAgICAgICAgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3QgcmVhZCBmYWlsZWQgdy8gc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKG1OdW1CeXRlc1JlYWQpOworfQorCit2b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBHVVJMIHVybCh1cmkpOworCisgICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7CisgICAgbG9vcC0+UG9zdFRhc2soCisgICAgICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAorICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIsCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICB1cmwsCisgICAgICAgICAgICAgICAgaGVhZGVycywKKyAgICAgICAgICAgICAgICBvZmZzZXQpKTsKKworfQorCisvLyBzdGF0aWMKK3ZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAorICAgICAgICBTZkRlbGVnYXRlICptZSwgR1VSTCB1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IG9mZnNldCkgeworICAgIG1lLT5vbkluaXRpYXRlQ29ubmVjdGlvbih1cmwsIGhlYWRlcnMsIG9mZnNldCk7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IEdVUkwgJnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmV4dHJhLAorICAgICAgICBvZmY2NF90IG9mZnNldCkgeworICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOworCisgICAgbVVSTFJlcXVlc3QgPSBuZXcgbmV0OjpVUkxSZXF1ZXN0KHVybCwgdGhpcyk7CisgICAgbUF0RU9TID0gZmFsc2U7CisKKyAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSBmYWxzZTsKKworICAgIGlmIChvZmZzZXQgIT0gMCB8fCBleHRyYSAhPSBOVUxMKSB7CisgICAgICAgIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnMgPQorICAgICAgICAgICAgbVVSTFJlcXVlc3QtPmV4dHJhX3JlcXVlc3RfaGVhZGVycygpOworCisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlJhbmdlOiBieXRlcz0lbGxkLSIsIG9mZnNldCkuY19zdHIoKSk7CisKKyAgICAgICAgICAgIG1SYW5nZVJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHM7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPmtleUF0KGkpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChleHRyYS0+dmFsdWVBdChpKS5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJzLkFkZEhlYWRlckZyb21TdHJpbmcocy5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1VUkxSZXF1ZXN0LT5TZXRFeHRyYVJlcXVlc3RIZWFkZXJzKGhlYWRlcnMpOworICAgIH0KKworICAgIG1VUkxSZXF1ZXN0LT5zZXRfY29udGV4dChnUmVxQ29udGV4dCk7CisKKyAgICBtVVJMUmVxdWVzdC0+U3RhcnQoKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZURpc2Nvbm5lY3QoKSB7CisgICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7CisgICAgbG9vcC0+UG9zdFRhc2soCisgICAgICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAorICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIsIHRoaXMpKTsKK30KKworLy8gc3RhdGljCit2b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSkgeworICAgIG1lLT5vbkluaXRpYXRlRGlzY29ubmVjdCgpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVEaXNjb25uZWN0KCkgeworICAgIG1VUkxSZXF1ZXN0LT5DYW5jZWwoKTsKKworICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKKyAgICBtVVJMUmVxdWVzdCA9IE5VTEw7CisKKyAgICBtT3duZXItPm9uRGlzY29ubmVjdENvbXBsZXRlKCk7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7CisgICAgbG9vcC0+UG9zdFRhc2soCisgICAgICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAorICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlUmVhZFdyYXBwZXIsIHRoaXMsIGRhdGEsIHNpemUpKTsKK30KKworLy8gc3RhdGljCit2b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVSZWFkV3JhcHBlcigKKyAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgbWUtPm9uSW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0sobVVSTFJlcXVlc3QgIT0gTlVMTCk7CisKKyAgICBtTnVtQnl0ZXNSZWFkID0gMDsKKyAgICBtTnVtQnl0ZXNUb3RhbCA9IHNpemU7CisgICAgbURhdGFEZXN0aW5hdGlvbiA9IGRhdGE7CisKKyAgICBpZiAobUF0RU9TKSB7CisgICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVhZE1vcmUobVVSTFJlcXVlc3QpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDM0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1VQUE9SVF9IXworCisjZGVmaW5lIFNVUFBPUlRfSF8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2xvZy5oIgorI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdC5oIgorI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0LmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnkuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9pb19idWZmZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTZk5ldExvZyA6IHB1YmxpYyBuZXQ6Ok5ldExvZyB7CisgICAgU2ZOZXRMb2coKTsKKworICAgIHZpcnR1YWwgdm9pZCBBZGRFbnRyeSgKKyAgICAgICAgICAgIEV2ZW50VHlwZSB0eXBlLAorICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzICZ0aW1lLAorICAgICAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCisgICAgICAgICAgICBFdmVudFBoYXNlIHBoYXNlLAorICAgICAgICAgICAgRXZlbnRQYXJhbWV0ZXJzICpwYXJhbXMpOworCisgICAgdmlydHVhbCB1aW50MzIgTmV4dElEKCk7CisgICAgdmlydHVhbCBMb2dMZXZlbCBHZXRMb2dMZXZlbCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHVpbnQzMiBtTmV4dElEOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXRMb2cpOworfTsKKworc3RydWN0IFNmUmVxdWVzdENvbnRleHQgOiBwdWJsaWMgVVJMUmVxdWVzdENvbnRleHQgeworICAgIFNmUmVxdWVzdENvbnRleHQoKTsKKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Vc2VyQWdlbnQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZlJlcXVlc3RDb250ZXh0KTsKK307CisKKy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGh0dHBzIHN1cHBvcnQsIHdlIGRvbid0IHJlYWxseSB2ZXJpZnkgY2VydGlmaWNhdGVzLAorLy8gd2UgYWNjZXB0IGFueXRoaW5nLi4uCitzdHJ1Y3QgU2ZOZXR3b3JrTGlicmFyeSA6IHB1YmxpYyBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeSB7CisgICAgU2ZOZXR3b3JrTGlicmFyeSgpOworCisgICAgdmlydHVhbCBWZXJpZnlSZXN1bHQgVmVyaWZ5WDUwOUNlcnRDaGFpbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0d29ya0xpYnJhcnkpOworfTsKKworc3RydWN0IENocm9taXVtSFRUUERhdGFTb3VyY2U7CisKK3N0cnVjdCBTZkRlbGVnYXRlIDogcHVibGljIG5ldDo6VVJMUmVxdWVzdDo6RGVsZWdhdGUgeworICAgIFNmRGVsZWdhdGUoKTsKKyAgICB2aXJ0dWFsIH5TZkRlbGVnYXRlKCk7CisKKyAgICB2b2lkIGluaXRpYXRlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdm9pZCBpbml0aWF0ZURpc2Nvbm5lY3QoKTsKKyAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIHNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlZFJlZGlyZWN0KAorICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25BdXRoUmVxdWlyZWQoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6QXV0aENoYWxsZW5nZUluZm8gKmF1dGhfaW5mbyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpTU0xDZXJ0UmVxdWVzdEluZm8gKmNlcnRfcmVxdWVzdF9pbmZvKTsKKworICAgIHZpcnR1YWwgdm9pZCBPblNTTENlcnRpZmljYXRlRXJyb3IoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBjZXJ0X2Vycm9yLCBuZXQ6Olg1MDlDZXJ0aWZpY2F0ZSAqY2VydCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25HZXRDb29raWVzKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25TZXRDb29raWUoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCisgICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgICAgICBib29sIGJsb2NrZWRfYnlfcG9saWN5KTsKKworICAgIHZpcnR1YWwgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgdmlydHVhbCB2b2lkIE9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIERlbGVnYXRlIGluaGVyaXRlZDsKKworICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcjsKKworICAgIG5ldDo6VVJMUmVxdWVzdCAqbVVSTFJlcXVlc3Q7CisgICAgc2NvcGVkX3JlZnB0cjxuZXQ6OklPQnVmZmVyV2l0aFNpemU+IG1SZWFkQnVmZmVyOworCisgICAgc2l6ZV90IG1OdW1CeXRlc1JlYWQ7CisgICAgc2l6ZV90IG1OdW1CeXRlc1RvdGFsOworICAgIHZvaWQgKm1EYXRhRGVzdGluYXRpb247CisKKyAgICBib29sIG1SYW5nZVJlcXVlc3RlZDsKKyAgICBib29sIG1BdEVPUzsKKworICAgIHZvaWQgcmVhZE1vcmUobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKKworICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKKyAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLAorICAgICAgICAgICAgR1VSTCB1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlUmVhZFdyYXBwZXIoCisgICAgICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBvbkluaXRpYXRlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEdVUkwgJnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdm9pZCBvbkluaXRpYXRlRGlzY29ubmVjdCgpOworICAgIHZvaWQgb25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZEZWxlZ2F0ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNVUFBPUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwCmluZGV4IDIwODQzMWMuLmQyZTNlYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BQUNEZWNvZGVyLmNwcApAQCAtMjM0LDYgKzIzNCwyMyBAQAogICAgICAgICAgICAgbUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3IsIG1Db25maWctPmRlc2lyZWRDaGFubmVscyk7CiAKICAgICAgICAgQ0hFQ0sobU51bURlY29kZWRCdWZmZXJzID4gMCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTVA0QVVERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMgdGhpcyBlYXJseSwgdGhlIGZpZWxkcyBpbiBtQ29uZmlnIG1heQorICAgICAgICAgICAgLy8gbm90IGJlIHZhbGlkIGFuZCB3ZSBjYW5ub3QgcmVjb3Zlci4KKworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGRlY29kZSBhYWMgY29udGVudCwgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1OdW1EZWNvZGVkQnVmZmVycyA9PSAxKSB7CiAgICAgICAgICAgICBtVXBzYW1wbGluZ0ZhY3RvciA9IG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yOwogICAgICAgICAgICAgLy8gQ2hlY2sgb24gdGhlIHNhbXBsaW5nIHJhdGUgdG8gc2VlIHdoZXRoZXIgaXQgaXMgY2hhbmdlZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawppbmRleCA2OWUzMzFmLi4zNTlhMmVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCkBAIC0xNDMsMTQgKzE0MywzOSBAQAogIAl1bnBhY2tfaWR4LmNwcCBcCiAgCXdpbmRvd190YWJsZXNfZnhwLmNwcCBcCiAgCXB2bXA0c2V0YXVkaW9jb25maWcuY3BwIFwKLSAgICAgICAgQUFDRGVjb2Rlci5jcHAKKyAgICAgICAgQUFDRGVjb2Rlci5jcHAgXAogCiBMT0NBTF9DRkxBR1MgOj0gLURBQUNfUExVUyAtREhRX1NCUiAtRFBBUkFNRVRSSUNTVEVSRU8gLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9FWFBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0KIAotTE9DQUxfQ19JTkNMVURFUyA6PSBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCiAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hYWNkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgU29mdEFBQy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FhY2RlYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2U2MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDLmNwcApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRBQUMuaCIKKworI2luY2x1ZGUgInB2bXA0YXVkaW9kZWNvZGVyX2FwaS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdEFBQzo6U29mdEFBQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQ29uZmlnKG5ldyB0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbCksCisgICAgICBtRGVjb2RlckJ1ZihOVUxMKSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbVVwc2FtcGxpbmdGYWN0b3IoMiksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEFBQzo6flNvZnRBQUMoKSB7CisgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgbURlY29kZXJCdWYgPSBOVUxMOworCisgICAgZGVsZXRlIG1Db25maWc7CisgICAgbUNvbmZpZyA9IE5VTEw7Cit9CisKK3ZvaWQgU29mdEFBQzo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL2FhYyIpOworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQUFDOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRBQUM6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldChtQ29uZmlnLCAwLCBzaXplb2YodFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWwpKTsKKyAgICBtQ29uZmlnLT5vdXRwdXRGb3JtYXQgPSBPVVRQVVRGT1JNQVRfMTZQQ01fSU5URVJMRUFWRUQ7CisgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAxOworCisgICAgLy8gVGhlIHNvZnR3YXJlIGRlY29kZXIgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IG1vbm8gb3V0cHV0IG9uCisgICAgLy8gQUFDcGx1cyBmaWxlcy4gQWx3YXlzIG91dHB1dCBzdGVyZW8uCisgICAgbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzID0gMjsKKworICAgIFVJbnQzMiBtZW1SZXF1aXJlbWVudHMgPSBQVk1QNEF1ZGlvRGVjb2RlckdldE1lbVJlcXVpcmVtZW50cygpOworICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisKKyAgICBJbnQgZXJyID0gUFZNUDRBdWRpb0RlY29kZXJJbml0TGlicmFyeShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisgICAgaWYgKGVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIE1QNCBhdWRpbyBkZWNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QUFDOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+bkJpdFJhdGUgPSAwOworICAgICAgICAgICAgYWFjUGFyYW1zLT5uQXVkaW9CYW5kV2lkdGggPSAwOworICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgPSAwOworICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDRVJ0b29scyA9IDA7CisgICAgICAgICAgICBhYWNQYXJhbXMtPmVBQUNQcm9maWxlID0gT01YX0FVRElPX0FBQ09iamVjdE1haW47CisgICAgICAgICAgICBhYWNQYXJhbXMtPmVBQUNTdHJlYW1Gb3JtYXQgPSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY7CisgICAgICAgICAgICBhYWNQYXJhbXMtPmVDaGFubmVsTW9kZSA9IE9NWF9BVURJT19DaGFubmVsTW9kZVN0ZXJlbzsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uRnJhbWVMZW5ndGggPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5DaGFubmVscyA9IG1Db25maWctPmVuY29kZWRDaGFubmVsczsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkZyYW1lTGVuZ3RoID0gbUNvbmZpZy0+ZnJhbWVMZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBQUM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK2Jvb2wgU29mdEFBQzo6aXNDb25maWd1cmVkKCkgY29uc3QgeworICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+IDA7Cit9CisKK3ZvaWQgU29mdEFBQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gaGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisKKyAgICAgICAgSW50IGVyciA9IFBWTVA0QXVkaW9EZWNvZGVyQ29uZmlnKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICAgICAgaWYgKGVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVyciwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7CisKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5yZW1haW5kZXJCaXRzID0gMDsKKworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SW50MTYgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSAmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsyMDQ4XTsKKyAgICAgICAgbUNvbmZpZy0+cmVwb3NpdGlvbkZsYWcgPSBmYWxzZTsKKworICAgICAgICBJbnQzMiBwcmV2U2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICBJbnQgZGVjb2RlckVyciA9IFBWTVA0QXVkaW9EZWNvZGVGcmFtZShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5CisgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKKyAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDw9IDIpIHsKKyAgICAgICAgICAgIExPR1YoImF1ZGlvL2V4dGVuZGVkIGF1ZGlvIG9iamVjdCB0eXBlOiAlZCArICVkIiwKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5hdWRpb09iamVjdFR5cGUsIG1Db25maWctPmV4dGVuZGVkQXVkaW9PYmplY3RUeXBlKTsKKyAgICAgICAgICAgIExPR1YoImFhYysgdXBzYW1wbGluZyBmYWN0b3I6ICVkIGRlc2lyZWQgY2hhbm5lbHM6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5hYWNQbHVzVXBzYW1wbGluZ0ZhY3RvciwgbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzKTsKKworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBtVXBzYW1wbGluZ0ZhY3RvciA9IG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yOworICAgICAgICAgICAgICAgIC8vIENoZWNrIG9uIHRoZSBzYW1wbGluZyByYXRlIHRvIHNlZSB3aGV0aGVyIGl0IGlzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBwcmV2U2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coIlNhbXBsZSByYXRlIHdhcyAlZCBIeiwgYnV0IG5vdyBpcyAlZCBIeiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsaW5nUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCBob2xkIG9udG8gdGhlIGlucHV0IGJ1ZmZlciBhbmQgd2lsbCBkZWNvZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgYWdhaW4gb25jZSB0aGUgb3V0cHV0IHBvcnQgaGFzIGJlZW4gcmVjb25maWd1cmVkLgorCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgIC8vIG1JbnB1dEJ1ZmZlckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUgPT0gTVA0QVVESU9fQUFDX0xDIHx8CisgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmV4dGVuZGVkQXVkaW9PYmplY3RUeXBlID09IE1QNEFVRElPX0xUUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVVwc2FtcGxpbmdGYWN0b3IgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSB0dXJucyBvdXQgdG8gYmUgbm90IGFhY1BsdXMgbW9kZSBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1coIkRpc2FibGUgQUFDKy9lQUFDKyBzaW5jZSBleHRlbmRlZCBhdWRpbyBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmV4dGVuZGVkQXVkaW9PYmplY3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmFhY1BsdXNFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVXBzYW1wbGluZ0ZhY3RvciA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYWNQbHVzIG1vZGUgZG9lcyBub3QgYnV5IHVzIGFueXRoaW5nLCBidXQgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENQVSBsb2FkIHRvIGluY3JlYXNlLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIGEgaGFsZiBzcGVlZCBvZiBkZWNvZGluZworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygiRGlzYWJsZSBBQUMrL2VBQUMrIHNpbmNlIHVwc2FtcGxpbmcgZmFjdG9yIGlzIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmFhY1BsdXNFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CisgICAgICAgICAgICBtQ29uZmlnLT5mcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1Db25maWctPmRlc2lyZWRDaGFubmVsczsKKworICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBNUDRBVURFQ19TVUNDRVNTKSB7CisgICAgICAgICAgICBDSEVDS19MRShtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKworICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgMCwgbnVtT3V0Qnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1VcHNhbXBsaW5nRmFjdG9yID09IDIpIHsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgICAgIG1lbWNweSgmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsxMDI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm1Db25maWctPnBPdXRwdXRCdWZmZXJbMjA0OF0sCisgICAgICAgICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzICogMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1PdXRCeXRlcyAqPSAyOworICAgICAgICB9CisKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtT3V0Qnl0ZXM7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKworICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQorICAgICAgICAgICAgbUFuY2hvclRpbWVVcworICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKworICAgICAgICBtTnVtU2FtcGxlc091dHB1dCArPSBtQ29uZmlnLT5mcmFtZUxlbmd0aCAqIG1VcHNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFBQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIFBWTVA0QXVkaW9EZWNvZGVyUmVzZXRCdWZmZXIobURlY29kZXJCdWYpOworICAgIH0KK30KKwordm9pZCBTb2Z0QUFDOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIGlmIChwb3J0SW5kZXggIT0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFBQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2ZkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0FBQ19IXworCisjZGVmaW5lIFNPRlRfQUFDX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK3N0cnVjdCB0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdEFBQyA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0QUFDKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0QUFDKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDQKKyAgICB9OworCisgICAgdFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1VcHNhbXBsaW5nRmFjdG9yOworICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBQUMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0FBQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9zYnJfZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvc2JyX2RlYy5jcHAKaW5kZXggOGZjYzNjZS4uODUxOWIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9zYnJfZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL3Nicl9kZWMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgUGFja2V0VmlkZW8KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTQ0Nyw3ICs0NDcsMTIgQEAKIAogICAgICAgICAgICAgaWYgKHhvdmVyQmFuZCA+IHNickRlYy0+aGlnaFN1YmJhbmQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeG92ZXJCYW5kID0gMzI7IC8qIGVycm9yIGNvbmRpdGlvbiwgZGVmYXVsdCB0byB1cHNhbXBsaW5nIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGVycm9yIGNvbmRpdGlvbiwgZGVmYXVsdCB0byB1cHNhbXBsaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAgKiBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIG51bWJlciBvZiBiYW5kcyBmb3IgeG92ZXIgZG9lcworICAgICAgICAgICAgICAgICAqIG5vdCBleGNlZWQgdGhlIG51bWJlciBvZiBoaWdoIGZyZXEgYmFuZHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgeG92ZXJCYW5kID0gKHNickRlYy0+aGlnaFN1YmJhbmQgPiAzMik/IDMyOiBzYnJEZWMtPmhpZ2hTdWJiYW5kOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtID0gc2JyRGVjLT5idWZSZWFkT2ZmcyArIGk7ICAgIC8qICAyICsgaSAqLwpAQCAtNTU4LDE4ICs1NjMsMjIgQEAKICAgICAgICAgLyoKICAgICAgICAgICogIFNldCBDaXJjdWxhciBidWZmZXIgZm9yIFBTIGh5YnJpZCBhbmFseXNpcwogICAgICAgICAgKi8KKworICAgICAgICBpbnQzMl90ICpwdF90ZW1wID0gJnNjcmF0Y2hfbWVtWzJdWzMyXTsKKwogICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDM7IGkrKykKICAgICAgICAgewogCi0gICAgICAgICAgICBwdl9tZW1tb3ZlKCZzY3JhdGNoX21lbVsyXVszMiArIGogICAgIF0sCisgICAgICAgICAgICBwdl9tZW1tb3ZlKCZwdF90ZW1wWyBqXSwKICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJSZWFsW2ldLAogICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfRklMVEVSX0xFTkdUSF9tXzEqc2l6ZW9mKCpoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+aEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWwpKTsKLSAgICAgICAgICAgIHB2X21lbW1vdmUoJnNjcmF0Y2hfbWVtWzJdWzMyICsgaiArIDQ0XSwKKyAgICAgICAgICAgIHB2X21lbW1vdmUoJnB0X3RlbXBbIGogKyA0NF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvRGVjLT5oSHlicmlkLT5tUW1mQnVmZmVySW1hZ1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEX0ZJTFRFUl9MRU5HVEhfbV8xKnNpemVvZigqaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnKSk7CiAgICAgICAgICAgICBqICs9IDg4OwogICAgICAgICB9CiAKKwogICAgICAgICBwdl9tZW1zZXQoKHZvaWQgKikmcW1mX1BTX2dlbmVyYXRlZF9SZWFsW2hQYXJhbWV0cmljU3RlcmVvRGVjLT51c2JdLAogICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICg2NCAtIGhQYXJhbWV0cmljU3RlcmVvRGVjLT51c2IpKnNpemVvZigqcW1mX1BTX2dlbmVyYXRlZF9SZWFsKSk7CkBAIC02MjYsMTkgKzYzNSwyMyBAQAogICAgICAgICAgKiAgU2F2ZSBDaXJjdWxhciBidWZmZXIgaGlzdG9yeSB1c2VkIG9uIFBTIGh5YnJpZCBhbmFseXNpcwogICAgICAgICAgKi8KIAorCisgICAgICAgIHB0X3RlbXAgPSAmc2NyYXRjaF9tZW1bMl1bNjRdOworCiAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBwdl9tZW1tb3ZlKGhQYXJhbWV0cmljU3RlcmVvRGVjLT5oSHlicmlkLT5tUW1mQnVmZmVyUmVhbFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2hfbWVtWzJdWyA2NCArIGogICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICZwdF90ZW1wWyBqXSwKICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEX0ZJTFRFUl9MRU5HVEhfbV8xKnNpemVvZigqaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJSZWFsKSk7CiAKICAgICAgICAgICAgIHB2X21lbW1vdmUoaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9tZW1bMl1bIDY0ICsgaiArIDQ0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnB0X3RlbXBbIGogKyA0NF0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhZQlJJRF9GSUxURVJfTEVOR1RIX21fMSpzaXplb2YoKmhQYXJhbWV0cmljU3RlcmVvRGVjLT5oSHlicmlkLT5tUW1mQnVmZmVySW1hZykpOwogCiAgICAgICAgICAgICBqICs9IDg4OwogICAgICAgICB9CiAKKwogICAgICAgICBwdl9tZW1tb3ZlKGhGcmFtZURhdGEtPlYsICZjaXJjdWxhcl9idWZmZXJfc1swXSwgMTE1MipzaXplb2YoKmNpcmN1bGFyX2J1ZmZlcl9zKSk7CiAKICAgICAgICAgLyoKQEAgLTc0Niw3ICs3NTksMTIgQEAKIAogICAgICAgICAgICAgICAgIGlmICh4b3ZlckJhbmQgPiBzYnJEZWMtPmhpZ2hTdWJiYW5kKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeG92ZXJCYW5kID0gMzI7IC8qIGVycm9yIGNvbmRpdGlvbiwgZGVmYXVsdCB0byB1cHNhbXBsaW5nIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogZXJyb3IgY29uZGl0aW9uLCBkZWZhdWx0IHRvIHVwc2FtcGxpbmcgbW9kZQorICAgICAgICAgICAgICAgICAgICAgKiBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIG51bWJlciBvZiBiYW5kcyBmb3IgeG92ZXIgZG9lcworICAgICAgICAgICAgICAgICAgICAgKiBub3QgZXhjZWVkIHRoZSBudW1iZXIgb2YgaGlnaCBmcmVxIGJhbmRzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgeG92ZXJCYW5kID0gKHNickRlYy0+aGlnaFN1YmJhbmQgPiAzMik/IDMyOiBzYnJEZWMtPmhpZ2hTdWJiYW5kOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCmluZGV4IGU0ZmYxMjguLjBiZmY1MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcApAQCAtODQsNyArODQsNyBAQAogICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgcGFyYW1zLmJpdFJhdGUgPSBtQml0UmF0ZTsKICAgICBwYXJhbXMubkNoYW5uZWxzID0gbUNoYW5uZWxzOwotICAgIHBhcmFtcy5hZHRzVXNlZCA9IDA7ICAvLyBGb3IgTVA0IGZpbGUsIGRvbid0IHVzZSBhZHRzIGZvcm1hdCQKKyAgICBwYXJhbXMuYWR0c1VzZWQgPSAwOyAgLy8gV2UgYWRkIGFkdHMgaGVhZGVyIGluIHRoZSBmaWxlIHdyaXRlciBpZiBuZWVkZWQuCiAgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAgJnBhcmFtcykpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IGNkYTRmOWQuLmY5Y2M2YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTIsNyArMiw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIGluY2x1ZGUgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IGJhc2ljX29wL2Jhc2ljb3AyLmMgYmFzaWNfb3Avb3Blcl8zMmIuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYwppbmRleCAxY2VlMTE3Li4yZWE5NDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCS8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KIAlpZihpc091dHB1dCkKIAl7Ci0JCW91dGZpbGUgPSBmb3BlbihvdXRmaWxlTmFtZSwgIndiIik7IAorCQlvdXRmaWxlID0gZm9wZW4ob3V0ZmlsZU5hbWUsICJ3YiIpOwogCQlpZiAoIW91dGZpbGUpIHsKIAkJCXByaW50ZigiT3BlbiBvdXRwdXQgZmlsZSBmYWlsLi4uIik7CiAJCQlyZXR1cm4gLTE7CkBAIC0xODgsMTQgKzE4OCwxNCBAQAogCXVzZURhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CiAJdXNlRGF0YS5tZW1EYXRhID0gKFZPX1BUUikoJm1vcGVyKTsKIAkvLyBvcGVuIGVuY29kZXIgZGxsOwotCWhhbmRsZSA9IGRsb3BlbigiL2RhdGEvbG9jYWwvdG1wL2xpYnZvQUFDRW5jdjcuc28iLCBSVExEX05PVyk7CisJaGFuZGxlID0gZGxvcGVuKCJsaWJzdGFnZWZyaWdodC5zbyIsIFJUTERfTk9XKTsKIAlpZihoYW5kbGUgPT0gMCkKIAl7CiAJCXByaW50Zigib3BlbiBkbGwgZXJyb3IuLi4uLi4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkvLyBHZXQgQVBJOwotCXBmdW5jID0gZGxzeW0oaGFuZGxlLCAidm9HZXRBQUNFbmNBUEkiKTsJCisJcGZ1bmMgPSBkbHN5bShoYW5kbGUsICJ2b0dldEFBQ0VuY0FQSSIpOwogCWlmKHBmdW5jID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZnVuY3Rpb24gZXJyb3IuLi4uLi4iKTsKQEAgLTIxNSwxMyArMjE1LDEzIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0UGFyYW0oaENvZGVjLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAmYWFjcGFyYSk7CQotCQorCXJldHVybkNvZGUgPSBBdWRpb0FQSS5TZXRQYXJhbShoQ29kZWMsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICZhYWNwYXJhKTsKKwogCWluRGF0YS5CdWZmZXIgPSBpbkJ1ZjsKIAlieXRlc0xlZnQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLGluRGF0YS5CdWZmZXIsUkVBRF9TSVpFKTsKIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0JCisKIAlkbyB7CiAKIAkJaW5EYXRhLkxlbmd0aCAgICA9IGJ5dGVzTGVmdDsKQEAgLTIyOSw5ICsyMjksOSBAQAogCQlvdXREYXRhLkxlbmd0aCA9IDEwMjQqODsKIAogCQl0MSA9IGNsb2NrKCk7Ci0JCQorCiAJCXJldHVybkNvZGUgPSBBdWRpb0FQSS5TZXRJbnB1dERhdGEoaENvZGVjLCZpbkRhdGEpOwotCQkKKwogCQlkbyB7CiAJCQlvdXREYXRhLkJ1ZmZlciAgID0gb3V0QnVmOwogCQkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCmluZGV4IDUyYzljMDcuLmJhM2Y0ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCkBAIC0xLDI0ICsxLDI1IEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTIDo9IAlBQUNfRV9TQU1QTEVTLmMKLQkKLUxPQ0FMX1NSQ19GSUxFUyArPSAJXAotCS4uLy4uLy4uL0NvbW1vbi9jbW5NZW1vcnkuYyAKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQUFDX0VfU0FNUExFUy5jIFwKKyAgICAuLi8uLi9jb21tb24vY21uTWVtb3J5LmMKIAotTE9DQUxfTU9EVUxFIDo9IFRlc3R2b0FBQ0VuYworTE9DQUxfQ0ZMQUdTICs9ICQoVk9fQ0ZMQUdTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZworCitMT0NBTF9NT0RVTEUgOj0gQUFDRW5jVGVzdAogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ2b0FBQ0VuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYmRsCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoTE9DQUxfUEFUSCkvIFwKLQkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL0NvbW1vbiBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9JbmNsdWRlIFwKKyAgICAkKExPQ0FMX1BBVEgpLyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi9jb21tb24gXAorICAgICQoTE9DQUxfUEFUSCkvLi4vLi4vY29tbW9uL2luY2x1ZGUgXAogCi1MT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCi0JCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI1ZThlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjcKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gZXhlCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiAKLSMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZSAKLVZPTU06PSAjQVJNVjVFCi0KLQotCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlCi1WT1RBUkdFVDo9IHZvQUFDRW5jVGVzdHY3Ci0KLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tayAKLQotIyBkZXBlbmRlbnQgbGlicmFyaWVzLgotVk9ERVBMSUJTOj0tbGRsCi0KLSMgbW9kdWxlIHNvdXJjZQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUKLWluY2x1ZGUgLi4vbXMubWsKLQotCi0jIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQKLVZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi9SZWxlYXNlLwotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9tcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmMDZiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvbXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUKLU9CSlM6PUFBQ19FX1NBTVBMRVMubwljbW5NZW1vcnkubwotCQkJCi0jIHBsZWFzZSBsaXN0IGFsbCBkaXJlY3RvcmllcyB0aGF0IGFsbCBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgd2l0aCB5b3VyIG1vZHVsZSguaCAuYyAuY3BwKSBsb2NhdGUgCi1WT1NSQ0RJUjo9Li4vIC4uLy4uLy4uLy4uL2luY2x1ZGUgIC4uLy4uLy4uLy4uL0NvbW1vbgotCQkJCQkKLQkJCQkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZG9pdC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZG9pdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhMGIwYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2RvaXQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIy8qCi0jICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jICoqCi0jICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAqKgotIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICoqCi0jICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jICovCi0KLVZFUkJPU0U6PUAKLQotCi1WT01UID89IGxpYgotCi1pZmVxICgkKFZPTVQpLCBsaWIpCi1MSUJfU1RBVElDPSQoVk9UQVJHRVQpLmEKLUxJQl9EWU5BTUlDPSQoVk9UQVJHRVQpLnNvCi1lbmRpZgotCi1pZmVxICgkKFZPTVQpLCBleGUpCi1UQVJHRVQ9JChWT1RBUkdFVCkKLWVuZGlmCi0KLUNGTEFHUz0kKFZPQ0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpIAotQ1BQRkxBR1M9JChWT0NQUEZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpIAotaWZuZXEgKCQoVk9UVCksIHBjKQotQVNGTEFHUz0kKFZPQVNGTEFHUykgJChhZGRwcmVmaXggLUksICQoVk9TUkNESVIpKSAKLWVuZGlmCi0KLUxERkxBR1M6PSQoVk9MREZMQUdTKQotVk9URURFUFMrPSQoVk9ERVBMSUJTKQotVk9UTERFUFMrPSQoVk9ERVBMSUJTKQotVk9TVENMSUJTID89Ci0KLXZwYXRoICUuYyAkKFZPU1JDRElSKQotdnBhdGggJS5jcHAgJChWT1NSQ0RJUikKLWlmbmVxICgkKFZPVFQpLCBwYykKLXZwYXRoICUucyAkKFZPU1JDRElSKQotZW5kaWYKLQotaWZlcSAoJChWT1RUKSwgcGMpCi1CTFRESVJTPSQoVk9SRUxESVIpL0xpbnV4L3N0YXRpYwotQkxURElSRD0kKFZPUkVMRElSKS9MaW51eC9zaGFyZWQKLWVsc2UKLUJMVERJUlM9JChWT1JFTERJUikvR29vZ2xlLyQoVk9OSikvbGliLyQoVk9UVCkKLUJMVERJUkQ9JChWT1JFTERJUikvR29vZ2xlLyQoVk9OSikvc28vJChWT1RUKQotZW5kaWYKLQotCi0uUFJFQ0lPVVM6ICQoT0JKRElSKS8lLm8KLQotaWZlcSAoJChWT01UKSwgbGliKQotYWxsOiBta2RpcnMgJChMSUJfU1RBVElDKSAkKExJQl9EWU5BTUlDKQotbWtkaXJzOiAkKE9CSkRJUikgJChCTFRESVJTKSAkKEJMVERJUkQpCi1lbHNlCi1hbGw6IG1rZGlycyAkKFRBUkdFVCkKLW1rZGlyczogJChPQkpESVIpCi1lbmRpZgotCi0kKE9CSkRJUik6Ci0JQGlmIHRlc3QgISAtZCAkQDsgdGhlbiBcCi0JCW1rZGlyIC1wICRAOyBcCi0JZmk7Ci0KLWlmZXEgKCQoVk9NVCksIGxpYikKLSQoQkxURElSUyk6Ci0JQGlmIHRlc3QgISAtZCAkQDsgdGhlbiBcCi0JCW1rZGlyIC1wICRAOyBcCi0JZmk7Ci0kKEJMVERJUkQpOgotCUBpZiB0ZXN0ICEgLWQgJEA7IHRoZW4gXAotCQlta2RpciAtcCAkQDsgXAotCWZpOwotZW5kaWYKLQotCi1pZmVxICgkKFZPTVQpLCBsaWIpCi0kKExJQl9TVEFUSUMpOiQoT0JKUykKLQkkKEFSKSBjciAkQCAkKE9CSkRJUikvKi5vICQoVk9TVENMSUJTKQotCSQoUkFOTElCKSAkQAotaWZuZXEgKCQoVk9EQkcpLCB5ZXMpCi0JIyQoU1RSSVApICRACi1lbmRpZgotCi0kKExJQl9EWU5BTUlDKTokKE9CSlMpCi0JJChHRykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkRJUikvKi5vIC1XbCwtLXdob2xlLWFyY2hpdmUgJChWT1NUQ0xJQlMpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgJChWT1RMREVQUykgCi1pZm5lcSAoJChWT0RCRyksIHllcykKLQkJJChTVFJJUCkgJEAKLWVuZGlmCi0KLWVsc2UKLQotJChUQVJHRVQpOiQoT0JKUykKLQkkKEdHKSAkKExERkxBR1MpIC1vICRAICQoT0JKRElSKS8qLm8gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFZPU1RDTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAkKFZPVEVERVBTKQotaWZuZXEgKCQoVk9EQkcpLCB5ZXMpCi0JJChTVFJJUCkgJEAKLWVuZGlmCi0KLWVuZGlmCi0KLQotLlNVRkZJWEVTOiAuYyAuY3BwIC5zIC5vCi0uYy5vOgotCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICQoT0JKRElSKS8kQCAtYyAkPAotIyUuYzokKE9CSkRJUikvJS5vCi0jCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQ8Ci0uY3BwLm86Ci0JJChWRVJCT1NFKSAkKEdHKSAkKENQUEZMQUdTKSAtbyAkKE9CSkRJUikvJEAgLWMgJDwKLWlmbmVxICgkKFZPVFQpLCBwYykKLS5zLm86Ci0JJChWRVJCT1NFKSAkKEFTKSAkKEFTRkxBR1MpIC1vICQoT0JKRElSKS8kQCAkPAotZW5kaWYKLQotCi0uUEhPTlk6IGNsZWFuIGRldmVsCi1jbGVhbjoKLWlmZXEgKCQoVk9NVCksIGxpYikKLQktcm0gLWZyICQoT0JKRElSKSAuKi5zdyogJChWT1RBUkdFVCkuKgotZWxzZQotCS1ybSAtZnIgJChPQkpESVIpIC4qLnN3KiAkKFZPVEFSR0VUKQotZW5kaWYKLQotZGV2ZWw6Ci0JY3AgLWEgJChMSUJfU1RBVElDKSAkKEJMVERJUlMpCi0JY3AgLWEgJChMSUJfRFlOQU1JQykgJChCTFRESVJEKQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2VjbGFpci5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjg4MzYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi0jIHNwZWNpYWwgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGJ1aWxkaW5nIAotVk9QUkVERUY9LURMSU5VWCAtRF9MSU5VWCAKLQotVk9QUkogPz0gCi1WT05KID89IGVjbGFpcgotVk9UVCA/PSB2NgotIyBjb250cm9sIHRoZSB2ZXJzaW9uIHRvIHJlbGVhc2Ugb3V0Ci0jIGF2YWlsYWJsZTogZXZhKGV2YWx1YXRpb24pLCByZWwocmVsZWFzZSkKLVZPVkVSPQotaWZlcSAoJChWT1ZFUiksIGV2YSkKLVZPUFJFREVGKz0tRF9fVk9WRVJfRVZBX18KLWVuZGlmCi0KLSMgZm9yIGRlYnVnIG9yIG5vdDogeWVzIGZvciBkZWJ1ZywgYW55IG90aGVyIGZvciByZWxlYXNlCi1WT0RCRz89eWUKLQotIyBmb3IgZGV0ZWN0aW5nIG1lbW9yeSBsZWFrCi1WT0RNTD0KLWlmZXEgKCQoVk9ETUwpLCB5ZXMpCi1WT1BSRURFRis9LURETUVNTEVBSwotZW5kaWYKLQotVk9QUkVERUYrPS1EX19WT1RUX0FSTV9fIC1EX19WT05KX0VDTEFJUl9fCi1UQ1JPT1RQQVRIOj0vb3B0L2VjbGFpcgotR0NDVkVSOj00LjQuMAotVENQQVRIOj0kKFRDUk9PVFBBVEgpL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktJChHQ0NWRVIpCi1DQ1RQUkU6PSQoVENQQVRIKS9iaW4vYXJtLWVhYmktCi1BUzo9JChDQ1RQUkUpYXMKLUFSOj0kKENDVFBSRSlhcgotTk06PSQoQ0NUUFJFKW5tCi1DQzo9JChDQ1RQUkUpZ2NjCi1HRzo9JChDQ1RQUkUpZysrCi1MRDo9JChDQ1RQUkUpbGQKLVNJWkU6PSQoQ0NUUFJFKXNpemUKLVNUUklQOj0kKENDVFBSRSlzdHJpcAotUkFOTElCOj0kKENDVFBSRSlyYW5saWIKLU9CSkNPUFk6PSQoQ0NUUFJFKW9iamNvcHkKLU9CSkRVTVA6PSQoQ0NUUFJFKW9iamR1bXAKLVJFQURFTEY6PSQoQ0NUUFJFKXJlYWRlbGYKLVNUUklOR1M6PSQoQ0NUUFJFKXN0cmluZ3MKLQotIyB0YXJnZXQgcHJvZHVjdCBkZXBlbmRjeQotIyBhdmFpbGFibGU6IGRyZWFtLCBnZW5lcmljCi1WT1RQOj1zYXBwaGlyZS1vcGVuCi1DQ1RMSUI6PSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL2xpYgotQ0NUSU5DOj0tSSQoVENST09UUEFUSCkvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9oYXJkd2FyZS9yaWwvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2hhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlL25hdGl2ZWhlbHBlciBcCi0JLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIFwKLQktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2xpYnMvYXVkaW9mbGluZ2VyIFwKLQktSSQoVENST09UUEFUSCkvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYmMvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYm0vaW5jbHVkZS9hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlidGhyZWFkX2RiL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibS9hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibSBcCi0JLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZSAKLQkjLUkkKFRDUk9PVFBBVEgpL291dC90YXJnZXQvcHJvZHVjdC8kKFZPVFApL29iai9TSEFSRURfTElCUkFSSUVTL2xpYm1faW50ZXJtZWRpYXRlcwotCi1DQ1RDRkxBR1M6PS1tc29mdC1mbG9hdCAtbXRodW1iLWludGVyd29yayAtZm5vLWV4Y2VwdGlvbnMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZnVud2luZC10YWJsZXMgLWZzdGFjay1wcm90ZWN0b3IgLWZuby1zaG9ydC1lbnVtcyAtZm1lc3NhZ2UtbGVuZ3RoPTAgLWZpbmxpbmUtZnVuY3Rpb25zIC1maW5saW5lLWxpbWl0PTYwMCAtZm5vLWlubGluZS1mdW5jdGlvbnMtY2FsbGVkLW9uY2UgLWZnY3NlLWFmdGVyLXJlbG9hZCAtZnJlcnVuLWNzZS1hZnRlci1sb29wIC1mcmVuYW1lLXJlZ2lzdGVycyAtZnN0cmljdC1hbGlhc2luZyAtZnVuc3dpdGNoLWxvb3BzCi0jLWZ3aWRlLWV4ZWMtY2hhcnNldD1jaGFyc2V0PVVURi0zMiAKLQotIyBmb3IgdGFyZ2V0IGV4ZQotVEVMREZMQUdTOj0tbm9zdGRsaWIgLUJkeW5hbWljIC1XbCwtVCwkKFRDUk9PVFBBVEgpL2J1aWxkL2NvcmUvYXJtZWxmLnggLVdsLC1keW5hbWljLWxpbmtlciwvc3lzdGVtL2Jpbi9saW5rZXIgLVdsLC0tZ2Mtc2VjdGlvbnMgLVdsLC16LG5vY29weXJlbG9jIC1XbCwtLW5vLXVuZGVmaW5lZCAtV2wsLXJwYXRoLWxpbms9JChDQ1RMSUIpIC1MJChDQ1RMSUIpIAotCi1WT1RFREVQUzo9JChDQ1RMSUIpL2NydGJlZ2luX2R5bmFtaWMubyAkKENDVExJQikvY3J0ZW5kX2FuZHJvaWQubyAkKFRDUEFUSCkvbGliL2djYy9hcm0tZWFiaS8kKEdDQ1ZFUikvaW50ZXJ3b3JrL2xpYmdjYy5hIC1sYyAtbG0KLQotIyBmb3IgdGFyZ2V0IGxpYgotVExMREZMQUdTOj0tbm9zdGRsaWIgLVdsLC1ULCQoVENST09UUEFUSCkvYnVpbGQvY29yZS9hcm1lbGYueHNjIC1XbCwtLWdjLXNlY3Rpb25zIC1XbCwtc2hhcmVkLC1Cc3ltYm9saWMgLUwkKENDVExJQikgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAtV2wsLS1uby11bmRlZmluZWQgJChUQ1BBVEgpL2xpYi9nY2MvYXJtLWVhYmkvJChHQ0NWRVIpL2ludGVyd29yay9saWJnY2MuYSAKLQotVk9UTERFUFM6PS1sbSAtbGMKLQotCi1pZmVxICgkKFZPVFQpLCB2NCkKLVZPQ0ZMQUdTOj0tbXR1bmU9YXJtOXRkbWkgLW1hcmNoPWFybXY0dAotVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjR0IC1tZnB1PXNvZnRmcGEKLWVuZGlmCi0KLWlmZXEgKCQoVk9UVCksIHY1KQotVk9DRkxBR1M6PS1tYXJjaD1hcm12NXRlCi1WT0FTRkxBR1M6PS1tYXJjaD1hcm12NXRlIC1tZnB1PXZmcAotZW5kaWYKLQotaWZlcSAoJChWT1RUKSwgdjV4KQotVk9DRkxBR1M6PS1tYXJjaD1hcm12NXRlIC1tdHVuZT14c2NhbGUKLVZPQVNGTEFHUzo9LW1hcmNoPWFybXY1dGUgLW1mcHU9dmZwCi1lbmRpZgotCi1pZmVxICgkKFZPVFQpLCB2NikKLSNWT0NGTEFHUzo9LW1hcmNoPWFybXY2IC1tdHVuZT1hcm0xMTM2amYtcyAKLSNWT0FTRkxBR1M6PS1tYXJjaD1hcm12NgotVk9DRkxBR1M6PS1tYXJjaD1hcm12NmogLW10dW5lPWFybTExMzZqZi1zIC1tZnB1PXZmcCAtbWZsb2F0LWFiaT1zb2Z0ZnAgLW1hcGNzIC1tdHBjcy1sZWFmLWZyYW1lIC1tbG9uZy1jYWxscwotVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjZqIC1tY3B1PWFybTExMzZqZi1zIC1tZnB1PWFybTExMzZqZi1zIC1tZmxvYXQtYWJpPXNvZnRmcCAtbWFwY3MtZmxvYXQgLW1hcGNzLXJlZW50cmFudAotZW5kaWYKLQotIwotIyBnbG9iYWwgbGluayBvcHRpb25zCi1WT0xERkxBR1M6PS1XbCwteCwtWCwtLWFzLW5lZWRlZAotCi0KLWlmZXEgKCQoVk9UVCksIHY3KQotVk9DRkxBR1MrPS1tYXJjaD1hcm12Ny1hIC1tdHVuZT1jb3J0ZXgtYTggLW1mcHU9bmVvbiAtbWZsb2F0LWFiaT1zb2Z0ZnAKLVZPQVNGTEFHUys9LW1hcmNoPWFybXY3LWEgLW1jcHU9Y29ydGV4LWE4IC1tZnB1PW5lb24gLW1mbG9hdC1hYmk9c29mdGZwCi1WT0xERkxBR1MrPS1XbCwtLWZpeC1jb3J0ZXgtYTgKLWVuZGlmCi0KLSNnbG9iYWwgY29tcGlsaW5nIG9wdGlvbnMgZm9yIEFSTSB0YXJnZXQKLWlmbmVxICgkKFZPVFQpLCBwYykKLVZPQVNGTEFHUys9LS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAtUgotZW5kaWYgCi0KLQotaWZlcSAoJChWT0RCRyksIHllcykKLVZPQ0ZMQUdTKz0tRF9ERUJVRyAtZwotZWxzZQotVk9DRkxBR1MrPS1ETkRFQlVHIC1PMwotZW5kaWYKLQotVk9DRkxBR1MrPSQoVk9QUkVERUYpICQoVk9NTSkgLVdhbGwgLWZzaWduZWQtY2hhciAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLWxlYWRpbmctdW5kZXJzY29yZSAtZnBpYyAtZlBJQyAtcGlwZSAtZnRyYWNlciAtZmZvcmNlLWFkZHIgLWZuby1ib3VuZHMtY2hlY2sgIy1mdmlzaWJpbGl0eT1oaWRkZW4gIy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiAjIy1mdHJlZS1sb29wLWxpbmVhciAgLW10aHVtYiAtbm9zdGRpbmMgIC1kRCAtZnByZWZldGNoLWxvb3AtYXJyYXlzCi0KLQotaWZuZXEgKCQoVk9UVCksIHBjKQotVk9DRkxBR1MrPSQoQ0NUQ0ZMQUdTKSAkKENDVElOQykKLVZPQ1BQRkxBR1M6PS1mbm8tcnR0aSAkKFZPQ0ZMQUdTKQotCi1pZmVxICgkKFZPTVQpLCBleGUpCi1WT0xERkxBR1MrPSQoVEVMREZMQUdTKQotZW5kaWYKLQotaWZlcSAoJChWT01UKSwgbGliKQotVk9MREZMQUdTKz0kKFRMTERGTEFHUykKLWVuZGlmCi1lbHNlCi1WT0NQUEZMQUdTOj0kKFZPQ0ZMQUdTKQotaWZlcSAoJChWT01UKSwgbGliKQotVk9MREZMQUdTKz0tc2hhcmVkCi1lbmRpZgotZW5kaWYKLQotaWZlcSAoJChWT0RCRyksIHllcykKLSNWT0xERkxBR1M6PQotZW5kaWYKLQotIyB3aGVyZSB0byBwbGFjZSBvYmplY3QgZmlsZXMgCi1PQkpESVI9b2JqCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2NGYxYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjUKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gbGliCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiAKLSMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZSAKLVZPTU06PSAtREFSTVY1RSAtREFSTV9JTkFTTSAtREFSTVY1X0lOQVNNIAotCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PWxpYnZvQUFDRW5jdjUKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIAotCi0jIGRlcGVuZGVudCBsaWJyYXJpZXMuCi1WT0RFUExJQlM6PSMtbGRsIC1sc3RkYysrIAotCi0jIG1vZHVsZSBzb3VyY2UKLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlCi1pbmNsdWRlIC4uLy4uL21zLm1rCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkCi1WT1JFTERJUjo9Li4vLi4vLi4vLi4vLi4vLi4vUmVsZWFzZQotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzUxY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjcKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gbGliCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiAKLSMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZSAKLVZPTU06PSAtREFSTVY1RSAtREFSTVY3TmVvbiAtREFSTV9JTkFTTSAtREFSTVY1X0lOQVNNIAotCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PWxpYnZvQUFDRW5jdjcKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIAotCi0jIGRlcGVuZGVudCBsaWJyYXJpZXMuCi1WT0RFUExJQlM6PSMtbGRsIC1sc3RkYysrIAotCi0jIG1vZHVsZSBzb3VyY2UKLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlCi1pbmNsdWRlIC4uLy4uL21zLm1rCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkCi1WT1JFTERJUjo9Li4vLi4vLi4vLi4vLi4vLi4vUmVsZWFzZQotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgIAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIzYzEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIy8qCi0jKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSMqKgotIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMqKgotIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMqKgotIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMqLwotCi0jIEp1c3QgYWN0aW5nIGFzIEZhdGhlciBNYWtlZmlsZSBvZiBNb2R1bGVzCi0jIHBsZWFzZSBrZWVwIHRoZSBuYW1lICdtYWtlZmlsZScgdW5jaGFuZ2VkCi0gCi0jIE1vZHVsZSBTdWJkaXJzCi1WT01TRDo9JChkaXIgJChzaGVsbCBmaW5kIC4gLW5hbWUgJ01ha2VmaWxlJykpCi0KLWFsbDoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXI7IFwKLQkJZG9uZQotCi0uUEhPTlk6Y2xlYW4gZGV2ZWwKLWNsZWFuOgotCWZvciBkaXIgaW4gJChWT01TRCk7IFwKLQkJZG8gXAotCQkJJChNQUtFKSAtQyAkJGRpciBjbGVhbjsgXAotCQlkb25lCi0KLWRldmVsOgotCWZvciBkaXIgaW4gJChWT01TRCk7IFwKLQkJZG8gXAotCQkJJChNQUtFKSAtQyAkJGRpciBkZXZlbDsgXAotCQlkb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkOWJiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL21zLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIy8qCi0jKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSMqKgotIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMqKgotIyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMqKgotIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMqLwotCi0KLSMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUKLU9CSlM6PWJhc2ljb3AyLm8gb3Blcl8zMmIubyBhYWNfcm9tLm8gYWFjZW5jLm8gYWFjZW5jX2NvcmUubyBhZGpfdGhyLm8gXAotCQkJYmFuZF9ucmcubyBiaXRfY250Lm8gYml0YnVmZmVyLm8gYml0ZW5jLm8gYmxvY2tfc3dpdGNoLm8gY2hhbm5lbF9tYXAubyBcCi0JCQlkeW5fYml0cy5vIGdycF9kYXRhLm8gaW50ZXJmYWNlLm8gbGluZV9wZS5vIG1lbWFsaWduLm8gbXNfc3RlcmVvLm8gXAotCQkJcHJlX2VjaG9fY29udHJvbC5vIHBzeV9jb25maWd1cmF0aW9uLm8gcHN5X21haW4ubyBxY19tYWluLm8gcXVhbnRpemUubyBzZl9lc3RpbS5vIFwKLQkJCXNwcmVhZGluZy5vIHN0YXRfYml0cy5vIHRucy5vIHRyYW5zZm9ybS5vCi0JCQkKLSMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZSAKLVZPU1JDRElSOj0uLi8uLi8uLi9zcmMgXAotCQkJCQkuLi8uLi8uLi9pbmMgXAotCQkJCQkuLi8uLi8uLi9iYXNpY19vcFwKLQkJCQkJLi4vLi4vLi4vLi4vLi4vSW5jbHVkZSAKLQkJCQkJCi1pZmVxICgkKFZPVFQpLCB2NSkKLU9CSlMrPSBBdXRvQ29ycmVsYXRpb25fdjUubyBiYW5kX25yZ192NS5vIENhbGNXaW5kb3dFbmVyZ3lfdjUubyBcCi0JCQkJUHJlUG9zdE1EQ1RfdjUubyBSNFI4Rmlyc3RfdjUubyBSYWRpeDRGRlRfdjUubwotVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RS8KLWVuZGlmCQotCi1pZmVxICgkKFZPVFQpLCB2NykKLU9CSlMrPSBBdXRvQ29ycmVsYXRpb25fdjUubyBiYW5kX25yZ192NS5vIENhbGNXaW5kb3dFbmVyZ3lfdjUubyBcCi0JCQkgUHJlUG9zdE1EQ1RfdjcubyBSNFI4Rmlyc3RfdjcubyBSYWRpeDRGRlRfdjcubwotVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RS8KLVZPU1JDRElSKz0gLi4vLi4vLi4vc3JjL2FzbS9BUk1WNy8KLWVuZGlmCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAKaW5kZXggZmIzMDBkYS4uYTExZDQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BTVJOQkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQU1STkJEZWNvZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSAiQU1STkJEZWNvZGVyLmgiCiAKICNpbmNsdWRlICJnc21hbXJfZGVjLmgiCkBAIC0xNTQsMTggKzE1OCwyNCBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0UHRyID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKLSAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0KKyAgICBpbnQzMl90IG51bUJ5dGVzUmVhZCA9CiAgICAgICAgIEFNUkRlY29kZShtU3RhdGUsCiAgICAgICAgICAgKEZyYW1lX1R5cGVfM0dQUCkoKGlucHV0UHRyWzBdID4+IDMpICYgMHgwZiksCiAgICAgICAgICAgKFVXb3JkOCAqKSZpbnB1dFB0clsxXSwKICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90ICo+KGJ1ZmZlci0+ZGF0YSgpKSwKICAgICAgICAgICBNSU1FX0lFVEYpOwogCisgICAgaWYgKG51bUJ5dGVzUmVhZCA9PSAtMSApIHsKKyAgICAgICAgTE9HRSgiUFYgQU1SIGRlY29kZXIgQU1SRGVjb2RlKCkgY2FsbCBmYWlsZWQiKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogICAgICsrbnVtQnl0ZXNSZWFkOyAgLy8gSW5jbHVkZSB0aGUgZnJhbWUgdHlwZSBoZWFkZXIgYnl0ZS4KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpOwogCi0gICAgaWYgKG51bUJ5dGVzUmVhZCA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQpID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewogICAgICAgICAvLyBUaGlzIGlzIGJhZCwgc2hvdWxkIG5ldmVyIGhhdmUgaGFwcGVuZWQsIGJ1dCBkaWQuIEFib3J0IG5vdy4KIAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCBhNTQ1NzYyLi41ODYyYWJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC01MiwzICs1MiwzMyBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRBTVIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbiBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcmRlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNTg4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKQEAgLTAsMCArMSw0MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRBTVIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0QU1SLmgiCisKKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRBTVI6OlNvZnRBTVIoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbU1vZGUoTU9ERV9OQVJST1cpLAorICAgICAgbVN0YXRlKE5VTEwpLAorICAgICAgbURlY29kZXJCdWYoTlVMTCksCisgICAgICBtRGVjb2RlckNvb2tpZShOVUxMKSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbUFuY2hvclRpbWVVcygwKSwKKyAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiKSkgeworICAgICAgICBtTW9kZSA9IE1PREVfV0lERTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiKSk7CisgICAgfQorCisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEFNUjo6flNvZnRBTVIoKSB7CisgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgIEdTTURlY29kZUZyYW1lRXhpdCgmbVN0YXRlKTsKKyAgICAgICAgbVN0YXRlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBOVUxMOworCisgICAgICAgIG1TdGF0ZSA9IE5VTEw7CisgICAgICAgIG1EZWNvZGVyQ29va2llID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFNUjo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBtTW9kZSA9PSBNT0RFX05BUlJPVworICAgICAgICAgICAgPyBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL2FtciIpCisgICAgICAgICAgICA6IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vYW1yd2IiKTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQU1SOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAobU1vZGUgPT0gTU9ERV9OQVJST1cgPyBrTnVtU2FtcGxlc1BlckZyYW1lTkIgOiBrTnVtU2FtcGxlc1BlckZyYW1lV0IpCisgICAgICAgICAgICAqIHNpemVvZihpbnQxNl90KTsKKworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKworc3RhdHVzX3QgU29mdEFNUjo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgIFdvcmQxNiBlcnIgPSBHU01Jbml0RGVjb2RlKCZtU3RhdGUsIChXb3JkOCAqKSJBTVJOQkRlY29kZXIiKTsKKworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKworICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbVN0YXRlLCBtRGVjb2RlckJ1ZiwgJm1EZWNvZGVyQ29va2llKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFNUjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphbXJQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGFtclBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYW1yUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgYW1yUGFyYW1zLT5lQU1SRFRYTW9kZSA9IE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmOworICAgICAgICAgICAgYW1yUGFyYW1zLT5lQU1SRnJhbWVGb3JtYXQgPSBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZTsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIGFtclBhcmFtcy0+bkJpdFJhdGUgPSAwOworICAgICAgICAgICAgICAgIGFtclBhcmFtcy0+ZUFNUkJhbmRNb2RlID0gT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbXJQYXJhbXMtPm5CaXRSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBhbXJQYXJhbXMtPmVBTVJCYW5kTW9kZSA9CisgICAgICAgICAgICAgICAgICAgIG1Nb2RlID09IE1PREVfTkFSUk9XCisgICAgICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMCA6IE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworCisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPQorICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX05BUlJPVykgPyBrU2FtcGxlUmF0ZU5CIDoga1NhbXBsZVJhdGVXQjsKKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBTVI6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OQVJST1cpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFtcm5iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFtcndiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFhY1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitib29sIFNvZnRBTVI6OmlzQ29uZmlndXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlucHV0QnVmZmVyQ291bnQgPiAwOworfQorCitzdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZSh1bnNpZ25lZCBGVCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzldID0geworICAgICAgICAxMzIsIDE3NywgMjUzLCAyODUsIDMxNywgMzY1LCAzOTcsIDQ2MSwgNDc3CisgICAgfTsKKworICAgIHNpemVfdCBmcmFtZVNpemUgPSBrRnJhbWVTaXplV0JbRlRdOworCisgICAgLy8gUm91bmQgdXAgYml0cyB0byBieXRlcyBhbmQgYWRkIDEgZm9yIHRoZSBoZWFkZXIgYnl0ZS4KKyAgICBmcmFtZVNpemUgPSAoZnJhbWVTaXplICsgNykgLyA4ICsgMTsKKworICAgIHJldHVybiBmcmFtZVNpemU7Cit9CisKK3ZvaWQgU29mdEFNUjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0UHRyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgICAgICBudW1CeXRlc1JlYWQgPQorICAgICAgICAgICAgICAgIEFNUkRlY29kZShtU3RhdGUsCisgICAgICAgICAgICAgICAgICAoRnJhbWVfVHlwZV8zR1BQKSgoaW5wdXRQdHJbMF0gPj4gMykgJiAweDBmKSwKKyAgICAgICAgICAgICAgICAgIChVV29yZDggKikmaW5wdXRQdHJbMV0sCisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgIE1JTUVfSUVURik7CisKKyAgICAgICAgICAgIGlmIChudW1CeXRlc1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJQViBBTVIgZGVjb2RlciBBTVJEZWNvZGUoKSBjYWxsIGZhaWxlZCIpOworCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbnVtQnl0ZXNSZWFkOyAgLy8gSW5jbHVkZSB0aGUgZnJhbWUgdHlwZSBoZWFkZXIgYnl0ZS4KKworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQnl0ZXNSZWFkKSA+IGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBiYWQsIHNob3VsZCBuZXZlciBoYXZlIGhhcHBlbmVkLCBidXQgZGlkLiBBYm9ydCBub3cuCisKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2IG1vZGUgPSAoKGlucHV0UHRyWzBdID4+IDMpICYgMHgwZik7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1vZGUpOworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIGZyYW1lU2l6ZSk7CisKKyAgICAgICAgICAgIGludDE2IGZyYW1lVHlwZTsKKyAgICAgICAgICAgIFJYX1N0YXRlX3diIHJ4X3N0YXRlOworICAgICAgICAgICAgbWltZV91bnNvcnRpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPigmaW5wdXRQdHJbMV0pLAorICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICZmcmFtZVR5cGUsICZtb2RlLCAxLCAmcnhfc3RhdGUpOworCisgICAgICAgICAgICBpbnQxNl90ICpvdXRQdHIgPSAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlcjsKKworICAgICAgICAgICAgaW50MTZfdCBudW1TYW1wbGVzT3V0cHV0OworICAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiKAorICAgICAgICAgICAgICAgICAgICBtb2RlLCBtSW5wdXRTYW1wbGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgJm51bVNhbXBsZXNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyQnVmLCBmcmFtZVR5cGUsIG1EZWNvZGVyQ29va2llKTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCludW1TYW1wbGVzT3V0cHV0LCAoaW50KWtOdW1TYW1wbGVzUGVyRnJhbWVXQik7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXNQZXJGcmFtZVdCOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIDIgTFNCcyAoMTQtYml0IG91dHB1dCkgKi8KKyAgICAgICAgICAgICAgICBvdXRQdHJbaV0gJj0gMHhmZmZDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1CeXRlc1JlYWQgPSBmcmFtZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBudW1CeXRlc1JlYWQ7CisgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IG51bUJ5dGVzUmVhZDsKKworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBrTnVtU2FtcGxlc1BlckZyYW1lTkIgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcworICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBrU2FtcGxlUmF0ZU5COworCisgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lTkI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBrTnVtU2FtcGxlc1BlckZyYW1lV0IgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcworICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBrU2FtcGxlUmF0ZVdCOworCisgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lV0I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgfQorfQorCit2b2lkIFNvZnRBTVI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit9CisKK3ZvaWQgU29mdEFNUjo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBTVIobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTk2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0FNUl9IXworCisjZGVmaW5lIFNPRlRfQU1SX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRBTVIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdEFNUihjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEFNUigpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgICAgICAgICAgICAgPSA0LAorICAgICAgICBrU2FtcGxlUmF0ZU5CICAgICAgICAgICA9IDgwMDAsCisgICAgICAgIGtTYW1wbGVSYXRlV0IgICAgICAgICAgID0gMTYwMDAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVOQiAgID0gMTYwLAorICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lV0IgICA9IDMyMCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE1PREVfTkFSUk9XLAorICAgICAgICBNT0RFX1dJREUKKworICAgIH0gbU1vZGU7CisKKyAgICB2b2lkICptU3RhdGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIGludDE2X3QgbUlucHV0U2FtcGxlQnVmZmVyWzQ3N107CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBTVIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0FNUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQU1SV0JEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCmluZGV4IDJhMjE0NzIuLjViMTExZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IGZyYW1lU2l6ZSk7CiAKICAgICBpbnQxNiBmcmFtZVR5cGU7Ci0gICAgUlhfU3RhdGUgcnhfc3RhdGU7CisgICAgUlhfU3RhdGVfd2Igcnhfc3RhdGU7CiAgICAgbWltZV91bnNvcnRpbmcoCiAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0UHRyWzFdKSwKICAgICAgICAgICAgIG1JbnB1dFNhbXBsZUJ1ZmZlciwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21pbWVfaW8uY3BwCmluZGV4IDlmZjg4MTYuLmUxOTY2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcApAQCAtNTMxLDcgKzUzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludDE2ICogZnJhbWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgaW50MTYgKiBtb2RlLAogICAgICAgICAgICAgICAgICAgICB1aW50OCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICBSWF9TdGF0ZSAqc3QpCisgICAgICAgICAgICAgICAgICAgIFJYX1N0YXRlX3diICpzdCkKIHsKIAogICAgIGludDE2IGk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmgKaW5kZXggNDMzZmM5Mi4uYzQwYmMxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaApAQCAtMTAxLDcgKzEwMSw3IEBACiB7CiAgICAgaW50MTYgcHJldl9mdDsKICAgICBpbnQxNiBwcmV2X21vZGU7Ci19IFJYX1N0YXRlOworfSBSWF9TdGF0ZV93YjsKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRU5VTUVSQVRFRCBUWVBFREVGJ1MKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MTYgKmZyYW1lX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4IHEsCi0gICAgICAgICAgICAgICAgICAgICAgICBSWF9TdGF0ZSAqc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgUlhfU3RhdGVfd2IgKnN0KTsKIAogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCmluZGV4IDQyOTMyODcuLjUxNzkzODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCkBAIC0yLDcgKzIsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBpbmNsdWRlIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAgCQogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlBTVJXQkVuY29kZXIuY3BwIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCmluZGV4IGQ0NWI0ZGEuLjRmZjVmMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYwpAQCAtNzAsMTAgKzcwLDEwIEBACiB0eXBlZGVmIGludCAoVk9fQVBJICogVk9HRVRBVURJT0VOQ0FQSSkgKFZPX0FVRElPX0NPREVDQVBJICogcEVuY0hhbmRsZSk7CiAKIGludCBlbmNvZGUoCi0JCSAgIGludCBtb2RlLCAKKwkJICAgaW50IG1vZGUsCiAJCSAgIHNob3J0ICAgYWxsb3dfZHR4LAogCQkgICBWT0FNUldCRlJBTUVUWVBFIGZyYW1lVHlwZSwKLQkJICAgY29uc3QgY2hhciogc3JjZmlsZSwgCisJCSAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsCiAJCSAgIGNvbnN0IGNoYXIqIGRzdGZpbGUKIAkJICAgKQogewpAQCAtMTI5LDE0ICsxMjksMTQgQEAKIAl1c2VEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSgmbW9wZXIpOwogCiAjaWZkZWYgTElOVVgKLQloYW5kbGUgPSBkbG9wZW4oIi9kYXRhL2xvY2FsL3RtcC92b0FNUldCRW5jLnNvIiwgUlRMRF9OT1cpOworCWhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHQuc28iLCBSVExEX05PVyk7CiAJaWYoaGFuZGxlID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QU1SV0JFbmNBUEkiKTsJCisJcGZ1bmMgPSBkbHN5bShoYW5kbGUsICJ2b0dldEFNUldCRW5jQVBJIik7CiAJaWYocGZ1bmMgPT0gMCkKIAl7CiAJCXByaW50Zigib3BlbiBmdW5jdGlvbiBlcnJvci4uLi4uLiIpOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJCXByaW50ZigiZ2V0IEFQSXMgZXJyb3IuLi4uLi4iKTsKIAkJZ290byBzYWZlX2V4aXQ7CiAJfQotI2VuZGlmIAorI2VuZGlmCiAKIAkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEluaXQgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAJcmV0ID0gQXVkaW9BUEkuSW5pdCgmaENvZGVjLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZURhdGEpOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCQkJaWYoZnJhbWVudW0gPT0gMSkKIAkJCQl7CiAJCQkJCWZ3cml0ZShPdXRwdXRCdWYsIDEsIG91dERhdGEuTGVuZ3RoICsgc2l6ZTEsIGZkc3QpOwotCQkJCQlmZmx1c2goZmRzdCk7CQorCQkJCQlmZmx1c2goZmRzdCk7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJCQkJY2FzZSAnMSc6IGZyYW1lVHlwZSA9IFZPQU1SV0JfSVRVOwogCQkJCQkJYnJlYWs7CiAJCQkJCWNhc2UgJzInOiBmcmFtZVR5cGUgPSBWT0FNUldCX1JGQzMyNjcgOwotCQkJCQkJYnJlYWs7IAorCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQl1c2FnZSgpOwogCQkJCQkJcHJpbnRmICgiSW52YWxpZCBwYXJhbWV0ZXIgJyVzJy5cbiIsIGFyZ3YgW2FyZ10pOwpAQCAtMzM4LDExICszMzgsMTEgQEAKIAogCQkJfSBlbHNlIHsKIAkJCQlzd2l0Y2ggKGZpbGVuYW1lKSB7Ci0JCQkJCQljYXNlIDA6IAorCQkJCQkJY2FzZSAwOgogCQkJCQkJCWluRmlsZU5hbWUgID0gYXJndlthcmddOwogCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxOiAKLQkJCQkJCQlvdXRGaWxlTmFtZSA9IGFyZ3ZbYXJnXTsgCisJCQkJCQljYXNlIDE6CisJCQkJCQkJb3V0RmlsZU5hbWUgPSBhcmd2W2FyZ107CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQlkZWZhdWx0OgogCQkJCQkJCXVzYWdlICgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQubWsKaW5kZXggN2VkYjE2Ni4uODVkZGNlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCkBAIC0xLDI2ICsxLDI2IEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTIDo9IAlBTVJXQl9FX1NBTVBMRS5jCi0JCi1MT0NBTF9TUkNfRklMRVMgKz0gCVwKLQkuLi8uLi8uLi9Db21tb24vY21uTWVtb3J5LmMgCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFNUldCX0VfU0FNUExFLmMgXAorICAgIC4uLy4uL2NvbW1vbi9jbW5NZW1vcnkuYwogCi1MT0NBTF9NT0RVTEUgOj0gVGVzdHZvQU1SV0JFbmMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCitMT0NBTF9NT0RVTEUgOj0gQU1SV0JFbmNUZXN0CiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IAorTE9DQUxfQ0ZMQUdTIDo9ICQoVk9fQ0ZMQUdTKQogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnZvQU1SV0JFbmMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICBsaWJkbAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKExPQ0FMX1BBVEgpLyBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9Db21tb24gXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vSW5jbHVkZSBcCisgICAgJChMT0NBTF9QQVRIKS8gXAorICAgICQoTE9DQUxfUEFUSCkvLi4vLi4vY29tbW9uIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uLy4uL2NvbW1vbi9pbmNsdWRlCiAKLUxPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKLQkKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwYWY3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jLyoKLSMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSMgKioKLSMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICoqCi0jICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgKioKLSMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMgKi8KLQotIyB0YXJnZXQ2Ci0jIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikKLVZPVFQ6PSB2NgotCi0KLSMgbW9kdWxlIHR5cGUKLSMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUKLVZPTVQ6PSBleGUKLQotCi0jIG1vZHVsZSBtYWNyb3MKLSMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuIAotIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlIAotVk9NTTo9ICNBUk1WNUUKLQotCi0KLSMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUKLVZPVEFSR0VUOj0gdm9BTVJXQkVuY19UZXN0Ci0KLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tayAKLQotIyBkZXBlbmRlbnQgbGlicmFyaWVzLgotVk9ERVBMSUJTOj0tbGRsCi0KLQotIyBtb2R1bGUgc291cmNlCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQotaW5jbHVkZSAuLi9tcy5tawotCi0KLSMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZAotVk9SRUxESVI6PS4uLwotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvbXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmRlNzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvbXMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLyoKLSMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSMgKioKLSMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICoqCi0jICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgKioKLSMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMgKi8KLSMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUKLU9CSlM6PUFNUldCX0VfU0FNUExFLm8gY21uTWVtb3J5Lm8KLQkJCQotIyBwbGVhc2UgbGlzdCBhbGwgZGlyZWN0b3JpZXMgdGhhdCBhbGwgc291cmNlIGZpbGVzIHJlbGF0aXZlIHdpdGggeW91ciBtb2R1bGUoLmggLmMgLmNwcCkgbG9jYXRlIAotVk9TUkNESVI6PS4uLyBcCi0gICAgICAgICAgLi4vLi4vLi4vLi4vQ29tbW9uIFwKLQkgIC4uLy4uLy4uLy4uL0luY2x1ZGUKLQkJCQkJCi0JCQkJCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWVkYzg4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIy8qCi0jICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jICoqCi0jICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAqKgotIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICoqCi0jICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jICovCi0KLSMgdGFyZ2V0IHR5cGUKLSMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQotVk9UVDo9IHY1Ci0KLQotIyBtb2R1bGUgdHlwZQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQotVk9NVDo9IGxpYgotCi0KLSMgbW9kdWxlIG1hY3JvcwotIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gCi1pZmVxICgkKFZPVFQpLCB2NSkKLVZPTU06PS1EQVJNIC1EQVNNX09QVAotZW5kaWYKLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PSBsaWJ2b0FNUldCRW5jdjUKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIAotCi0jIGRlcGVuZGVudCBsaWJyYXJpZXMuCi1WT0RFUExJQlM6PS1sZGwgLWxzdGRjKysgLWxjdXRpbHMKLQotIyBtb2R1bGUgc291cmNlCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQotaW5jbHVkZSAuLi9tcy5tawotCi0KLSMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZAotVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UKLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayAKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODNiZWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi0jIHRhcmdldCB0eXBlCi0jIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikKLVZPVFQ6PSB2NwotCi0KLSMgbW9kdWxlIHR5cGUKLSMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUKLVZPTVQ6PSBsaWIKLQotCi0jIG1vZHVsZSBtYWNyb3MKLSMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuIAotaWZlcSAoJChWT1RUKSwgdjcpCi1WT01NOj0tREFSTSAtREFSTVY3IC1EQVNNX09QVAotZW5kaWYKLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PSBsaWJ2b0FNUldCRW5jdjcKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIAotCi0jIGRlcGVuZGVudCBsaWJyYXJpZXMuCi1WT0RFUExJQlM6PS1sZGwgLWxzdGRjKysgLWxjdXRpbHMKLQotIyBtb2R1bGUgc291cmNlCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQotaW5jbHVkZSAuLi9tcy5tawotCi0KLSMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZAotVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UKLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayAKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzNhMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotIyBKdXN0IGFjdGluZyBhcyBGYXRoZXIgTWFrZWZpbGUgb2YgTW9kdWxlcwotIyBwbGVhc2Uga2VlcCB0aGUgbmFtZSAnbWFrZWZpbGUnIHVuY2hhbmdlZAotIAotIyBNb2R1bGUgU3ViZGlycwotVk9NU0Q6PSQoZGlyICQoc2hlbGwgZmluZCAuIC1uYW1lICdNYWtlZmlsZScpKQotCi1hbGw6Ci0JZm9yIGRpciBpbiAkKFZPTVNEKTsgXAotCQlkbyBcCi0JCQkkKE1BS0UpIC1DICQkZGlyOyBcCi0JCWRvbmUKLQotLlBIT05ZOmNsZWFuIGRldmVsCi1jbGVhbjoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXIgY2xlYW47IFwKLQkJZG9uZQotCi1kZXZlbDoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXIgZGV2ZWw7IFwKLQkJZG9uZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQ5NDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tcy5taworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotIyBwbGVhc2UgbGlzdCBhbGwgZGlyZWN0b3JpZXMgdGhhdCBhbGwgc291cmNlIGZpbGVzIHJlbGF0aXZlIHdpdGggeW91ciBtb2R1bGUoLmggLmMgLmNwcCkgbG9jYXRlIAotVk9TUkNESVI6PS4uLy4uLy4uL2luYyBcCi0gICAgICAgICAgLi4vLi4vLi4vc3JjIFwKLQkgIC4uLy4uLy4uLy4uLy4uL0luY2x1ZGUgCi0KLSMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUKLU9CSlM6PSBhdXRvY29yci5vIGF6X2lzcC5vIGJpdHMubyBjMnQ2NGZ4Lm8gYzR0NjRmeC5vIGNvbnZvbHZlLm8gY29yX2hfeC5vIGRlY2ltNTQubyBcCi0gICAgICAgZGVlbXBoLm8gZHR4Lm8gZ19waXRjaC5vIGdwY2xpcC5vIGhvbWluZy5vIGhwNDAwLm8gaHA1MC5vIGhwNmsubyBocF93c3AubyBcCi0gICAgICAgaW50X2xwYy5vIGlzcF9hei5vIGlzcF9pc2YubyBsYWdfd2luZC5vIGxldmluc29uLm8gbG9nMi5vIGxwX2RlYzIubyBtYXRoX29wLm8gbWVtX2FsaWduLm8gXAotICAgICAgIG9wZXJfMzJiLm8gcF9tZWRfb2wubyBwaXRfc2hycC5vIHBpdGNoX2Y0Lm8gcHJlZF9sdDQubyBwcmVlbXBoLm8gcV9nYWluMi5vIHFfcHVsc2UubyBcCi0gICAgICAgcWlzZl9ucy5vIHFwaXNmXzJzLm8gcmFuZG9tLm8gcmVzaWR1Lm8gc2NhbGUubyBzdHJlYW0ubyBzeW5fZmlsdC5vIHVwZHRfdGFyLm8gdXRpbC5vIFwKLSAgICAgICB2b0FNUldCRW5jLm8gdm9pY2VmYWMubyB3Yl92YWQubyB3ZWlnaHRfYS5vCi0JCQkKLQotaWZlcSAoJChWT1RUKSwgdjUpCi1PQkpTICs9IGNvcl9oX3ZlY19vcHQubyBEZWVtcGhfMzJfb3B0Lm8gRG90X3Bfb3B0Lm8gRmlsdF82a183a19vcHQubyByZXNpZHVfYXNtX29wdC5vIFwKLSAgICAgICBzY2FsZV9zaWdfb3B0Lm8gU3luX2ZpbHRfMzJfb3B0Lm8gc3luX2ZpbHRfb3B0Lm8gcHJlZF9sdDRfMV9vcHQubyBjb252b2x2ZV9vcHQubyBcCi0gICAgICAgTm9ybV9Db3JyX29wdC5vCi1WT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFCi1lbmRpZgotCi1pZmVxICgkKFZPVFQpLCB2NykKLU9CSlMrPSBjb3JfaF92ZWNfbmVvbi5vIERlZW1waF8zMl9uZW9uLm8gRG90X3BfbmVvbi5vIEZpbHRfNmtfN2tfbmVvbi5vIHJlc2lkdV9hc21fbmVvbi5vIFwKLSAgICAgICBzY2FsZV9zaWdfbmVvbi5vIFN5bl9maWx0XzMyX25lb24ubyBzeW5fZmlsdF9uZW9uLm8gcHJlZF9sdDRfMV9uZW9uLm8gY29udm9sdmVfbmVvbi5vIFwKLSAgICAgICBOb3JtX0NvcnJfbmVvbi5vCi1WT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjcKLWVuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FWQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAKaW5kZXggNWJiYmEzNS4uNDkwMTI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAKQEAgLTUzNCw3ICs1MzQsOCBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBMT0dFKCJTaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbmFsVHlwZSAlZCIsIG5hbFR5cGUpOwotICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlIik7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BbmRyb2lkLm1rCmluZGV4IDFiMDAzNDcuLjRkNDUzM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQW5kcm9pZC5tawpAQCAtMywyNSArMyw1NCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogICAgICAgICBBVkNEZWNvZGVyLmNwcCBcCi0Jc3JjL2F2Y2RlY19hcGkuY3BwIFwKLSAJc3JjL2F2Y19iaXRzdHJlYW0uY3BwIFwKLSAJc3JjL2hlYWRlci5jcHAgXAotIAlzcmMvaXRyYW5zLmNwcCBcCi0gCXNyYy9wcmVkX2ludGVyLmNwcCBcCi0gCXNyYy9wcmVkX2ludHJhLmNwcCBcCi0gCXNyYy9yZXNpZHVhbC5jcHAgXAotIAlzcmMvc2xpY2UuY3BwIFwKLSAJc3JjL3ZsYy5jcHAKKyAgICAgICAgc3JjL2F2Y2RlY19hcGkuY3BwIFwKKyAgICAgICAgc3JjL2F2Y19iaXRzdHJlYW0uY3BwIFwKKyAgICAgICAgc3JjL2hlYWRlci5jcHAgXAorICAgICAgICBzcmMvaXRyYW5zLmNwcCBcCisgICAgICAgIHNyYy9wcmVkX2ludGVyLmNwcCBcCisgICAgICAgIHNyYy9wcmVkX2ludHJhLmNwcCBcCisgICAgICAgIHNyYy9yZXNpZHVhbC5jcHAgXAorICAgICAgICBzcmMvc2xpY2UuY3BwIFwKKyAgICAgICAgc3JjL3ZsYy5jcHAKIAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2F2Y2RlYwogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKExPQ0FMX1BBVEgpL3NyYyBcCi0gCSQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gCSQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRBVkMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCitMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNkZWMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24gXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9hdmNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9Tb2Z0QVZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE0MWFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvU29mdEFWQy5jcHAKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRBVkMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0QVZDLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlICJhdmNkZWNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZGVjX2ludC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtTdGFydENvZGVbNF0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IE1hbGxvYyh2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdD4obWFsbG9jKHNpemUpKTsKK30KKworc3RhdGljIHZvaWQgRnJlZSh2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBwdHIpIHsKKyAgICBmcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihwdHIpKTsKK30KKworU29mdEFWQzo6U29mdEFWQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtSGFuZGxlKG5ldyB0YWdBVkNIYW5kbGUpLAorICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtV2lkdGgoMTYwKSwKKyAgICAgIG1IZWlnaHQoMTIwKSwKKyAgICAgIG1Dcm9wTGVmdCgwKSwKKyAgICAgIG1Dcm9wVG9wKDApLAorICAgICAgbUNyb3BSaWdodChtV2lkdGggLSAxKSwKKyAgICAgIG1Dcm9wQm90dG9tKG1IZWlnaHQgLSAxKSwKKyAgICAgIG1TUFNTZWVuKGZhbHNlKSwKKyAgICAgIG1QUFNTZWVuKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50VGltZVVzKC0xKSwKKyAgICAgIG1FT1NTdGF0dXMoSU5QVVRfREFUQV9BVkFJTEFCTEUpLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEFWQzo6flNvZnRBVkMoKSB7CisgICAgUFZBVkNDbGVhblVwRGVjb2RlcihtSGFuZGxlKTsKKworICAgIGRlbGV0ZSBtSGFuZGxlOworICAgIG1IYW5kbGUgPSBOVUxMOworfQorCit2b2lkIFNvZnRBVkM6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ0FWQ0hhbmRsZSkpOworICAgIG1IYW5kbGUtPkFWQ09iamVjdCA9IE5VTEw7CisgICAgbUhhbmRsZS0+dXNlckRhdGEgPSB0aGlzOworICAgIG1IYW5kbGUtPkNCQVZDX0RQQkFsbG9jID0gQWN0aXZhdGVTUFNXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX0ZyYW1lQmluZCA9IEJpbmRGcmFtZVdyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJhbWVVbmJpbmQgPSBVbmJpbmRGcmFtZTsKKyAgICBtSGFuZGxlLT5DQkFWQ19NYWxsb2MgPSBNYWxsb2M7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJlZSA9IEZyZWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4LCAxdSk7CisKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmdldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcmVjdFBhcmFtcyA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocmVjdFBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkxlZnQgPSBtQ3JvcExlZnQ7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uVG9wID0gbUNyb3BUb3A7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uV2lkdGggPSBtQ3JvcFJpZ2h0IC0gbUNyb3BMZWZ0ICsgMTsKKyAgICAgICAgICAgIHJlY3RQYXJhbXMtPm5IZWlnaHQgPSBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wICsgMTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaW5kTkFMRnJhZ21lbnQoCisgICAgICAgIGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmZyYWdQdHIsIHNpemVfdCAqZnJhZ1NpemUpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgIHNpemVfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICBDSEVDSyhzaXplID49IDQpOworICAgIENIRUNLKCFtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgNCkpOworCisgICAgc2l6ZV90IG9mZnNldCA9IDQ7CisgICAgd2hpbGUgKG9mZnNldCArIDMgPCBzaXplICYmIG1lbWNtcChrU3RhcnRDb2RlLCAmZGF0YVtvZmZzZXRdLCA0KSkgeworICAgICAgICArK29mZnNldDsKKyAgICB9CisKKyAgICAqZnJhZ1B0ciA9ICZkYXRhWzRdOworICAgIGlmIChvZmZzZXQgKyAzID49IHNpemUpIHsKKyAgICAgICAgKmZyYWdTaXplID0gc2l6ZSAtIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZyYWdTaXplID0gb2Zmc2V0IC0gNDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKG1FT1NTdGF0dXMgPT0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoKG1FT1NTdGF0dXMgIT0gSU5QVVRfREFUQV9BVkFJTEFCTEUgfHwgIWluUXVldWUuZW1wdHkoKSkKKyAgICAgICAgICAgICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgeworICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgeworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcjsKKyAgICAgICAgICAgIGlmIChkcmFpbk91dHB1dEJ1ZmZlcigmb3V0SGVhZGVyKSkgeworICAgICAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKml0OworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworCisgICAgICAgICAgICBtRU9TU3RhdHVzID0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpmcmFnUHRyOworICAgICAgICBzaXplX3QgZnJhZ1NpemU7CisgICAgICAgIGZpbmROQUxGcmFnbWVudChpbkhlYWRlciwgJmZyYWdQdHIsICZmcmFnU2l6ZSk7CisKKyAgICAgICAgYm9vbCByZWxlYXNlRnJhZ21lbnQ7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZUZyYWdtZW50KAorICAgICAgICAgICAgICAgIGZyYWdQdHIsIGZyYWdTaXplLAorICAgICAgICAgICAgICAgICZyZWxlYXNlRnJhZ21lbnQsICZvdXRIZWFkZXIpOworCisgICAgICAgIGlmIChyZWxlYXNlRnJhZ21lbnQpIHsKKyAgICAgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBmcmFnU2l6ZSArIDQpOworCisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBmcmFnU2l6ZSArIDQ7CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBmcmFnU2l6ZSArIDQ7CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0SGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqaXQ7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7CisgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBTb2Z0QVZDOjpkZWNvZGVGcmFnbWVudCgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZnJhZ1B0ciwgc2l6ZV90IGZyYWdTaXplLAorICAgICAgICBib29sICpyZWxlYXNlRnJhZ21lbnQsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqb3V0SGVhZGVyKSB7CisgICAgKnJlbGVhc2VGcmFnbWVudCA9IHRydWU7CisgICAgKm91dEhlYWRlciA9IE5VTEw7CisKKyAgICBpbnQgbmFsVHlwZTsKKyAgICBpbnQgbmFsUmVmSWRjOworICAgIEFWQ0RlY19TdGF0dXMgcmVzID0KKyAgICAgICAgUFZBVkNEZWNHZXROQUxUeXBlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwgZnJhZ1NpemUsCisgICAgICAgICAgICAgICAgJm5hbFR5cGUsICZuYWxSZWZJZGMpOworCisgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICBMT0dWKCJjYW5ub3QgZGV0ZXJtaW5lIG5hbCB0eXBlIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG5hbFR5cGUgIT0gQVZDX05BTFRZUEVfU1BTICYmIG5hbFR5cGUgIT0gQVZDX05BTFRZUEVfUFBTCisgICAgICAgICAgICAmJiAoIW1TUFNTZWVuIHx8ICFtUFBTU2VlbikpIHsKKyAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIFNQUyBvciBQUFMgeWV0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3dpdGNoIChuYWxUeXBlKSB7CisgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU1BTOgorICAgICAgICB7CisgICAgICAgICAgICBtU1BTU2VlbiA9IHRydWU7CisKKyAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjU2VxUGFyYW1TZXQoCisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwKKyAgICAgICAgICAgICAgICAgICAgZnJhZ1NpemUpOworCisgICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKKworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9CisgICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxKSAqIDE2OworCisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9CisgICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAxNjsKKworICAgICAgICAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbTsKKyAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3JvcF9sZWZ0ID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAoMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgKyAxKTsKKworICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICgyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF90b3AgPSA0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAtCisgICAgICAgICAgICAgICAgICAgICAgICAoNCAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IGNyb3BfbGVmdCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgICAgICBpZiAobVdpZHRoICE9IHdpZHRoIHx8IG1IZWlnaHQgIT0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKworICAgICAgICAgICAgICAgIGVyciA9IElORk9fRk9STUFUX0NIQU5HRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3JvcExlZnQgIT0gY3JvcF9sZWZ0CisgICAgICAgICAgICAgICAgICAgIHx8IG1Dcm9wVG9wICE9IGNyb3BfdG9wCisgICAgICAgICAgICAgICAgICAgIHx8IG1Dcm9wUmlnaHQgIT0gY3JvcF9yaWdodAorICAgICAgICAgICAgICAgICAgICB8fCBtQ3JvcEJvdHRvbSAhPSBjcm9wX2JvdHRvbSkgeworICAgICAgICAgICAgICAgIG1Dcm9wTGVmdCA9IGNyb3BfbGVmdDsKKyAgICAgICAgICAgICAgICBtQ3JvcFRvcCA9IGNyb3BfdG9wOworICAgICAgICAgICAgICAgIG1Dcm9wUmlnaHQgPSBjcm9wX3JpZ2h0OworICAgICAgICAgICAgICAgIG1Dcm9wQm90dG9tID0gY3JvcF9ib3R0b207CisKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1BQUzoKKyAgICAgICAgeworICAgICAgICAgICAgbVBQU1NlZW4gPSB0cnVlOworCisgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1BpY1BhcmFtU2V0KAorICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgIGZyYWdTaXplKTsKKworICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIExPR1YoIlBWQVZDRGVjUGljUGFyYW1TZXQgcmV0dXJuZWQgZXJyb3IgJWQiLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0xJQ0U6CisgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfSURSOgorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY29kZVNsaWNlKAorICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgIGZyYWdTaXplKTsKKworICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9PVVRQVVRfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICAqcmVsZWFzZUZyYWdtZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoIWRyYWluT3V0cHV0QnVmZmVyKG91dEhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzID09IEFWQ0RFQ19QSUNUVVJFX1JFQURZIHx8IHJlcyA9PSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HVigiUFZBVkNEZWNvZGVTbGljZSByZXR1cm5lZCBlcnJvciAlZCIsIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0VJOgorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NFSSgKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGZyYWdQdHIpLAorICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQVZDREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0FVRDoKKyAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9GSUxMOgorICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0VPU0VROgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBMT0dFKCJTaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbmFsVHlwZSAlZCIsIG5hbFR5cGUpOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNvZnRBVkM6OmRyYWluT3V0cHV0QnVmZmVyKE9NWF9CVUZGRVJIRUFERVJUWVBFICoqb3V0SGVhZGVyKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICBpbnQzMl90IFJlbGVhc2U7CisgICAgQVZDRnJhbWVJTyBPdXRwdXQ7CisgICAgT3V0cHV0LllDYkNyWzBdID0gT3V0cHV0LllDYkNyWzFdID0gT3V0cHV0LllDYkNyWzJdID0gTlVMTDsKKyAgICBBVkNEZWNfU3RhdHVzIHN0YXR1cyA9CisgICAgICAgIFBWQVZDRGVjR2V0T3V0cHV0KG1IYW5kbGUsICZpbmRleCwgJlJlbGVhc2UsICZPdXRwdXQpOworCisgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUG9ydEluZm8gKnBvcnQgPSBlZGl0UG9ydEluZm8oMSk7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDApOworICAgIENIRUNLX0xUKChzaXplX3QpaW5kZXgsIHBvcnQtPm1CdWZmZXJzLnNpemUoKSk7CisgICAgQ0hFQ0socG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkubU93bmVkQnlVcyk7CisKKyAgICAqb3V0SGVhZGVyID0gcG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkubUhlYWRlcjsKKyAgICAoKm91dEhlYWRlciktPm5PZmZzZXQgPSAwOworICAgICgqb3V0SGVhZGVyKS0+bkZpbGxlZExlbiA9IHBvcnQtPm1EZWYubkJ1ZmZlclNpemU7CisgICAgKCpvdXRIZWFkZXIpLT5uRmxhZ3MgPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgUFZBVkNEZWNSZXNldChtSGFuZGxlKTsKKworICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjp1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbygwKS0+bURlZjsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKDEpLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZi0+bkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgKKyAgICAgICAgICAgICogZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworfQorCisvLyBzdGF0aWMKK2ludDMyX3QgU29mdEFWQzo6QWN0aXZhdGVTUFNXcmFwcGVyKAorICAgICAgICB2b2lkICp1c2VyRGF0YSwgdW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U29mdEFWQyAqPih1c2VyRGF0YSktPmFjdGl2YXRlU1BTKHNpemVJbk1icywgbnVtQnVmZmVycyk7Cit9CisKKy8vIHN0YXRpYworaW50MzJfdCBTb2Z0QVZDOjpCaW5kRnJhbWVXcmFwcGVyKAorICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTb2Z0QVZDICo+KHVzZXJEYXRhKS0+YmluZEZyYW1lKGluZGV4LCB5dXYpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdEFWQzo6VW5iaW5kRnJhbWUodm9pZCAqdXNlckRhdGEsIGludDMyX3QgaW5kZXgpIHsKK30KKworaW50MzJfdCBTb2Z0QVZDOjphY3RpdmF0ZVNQUygKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBQb3J0SW5mbyAqcG9ydCA9IGVkaXRQb3J0SW5mbygxKTsKKyAgICBDSEVDS19HRShwb3J0LT5tQnVmZmVycy5zaXplKCksIG51bUJ1ZmZlcnMpOworICAgIENIRUNLX0dFKHBvcnQtPm1EZWYubkJ1ZmZlclNpemUsIChzaXplSW5NYnMgPDwgNykgKiAzKTsKKworICAgIHJldHVybiAxOworfQorCitpbnQzMl90IFNvZnRBVkM6OmJpbmRGcmFtZShpbnQzMl90IGluZGV4LCB1aW50OF90ICoqeXV2KSB7CisgICAgUG9ydEluZm8gKnBvcnQgPSBlZGl0UG9ydEluZm8oMSk7CisKKyAgICBDSEVDS19HRShpbmRleCwgMCk7CisgICAgQ0hFQ0tfTFQoKHNpemVfdClpbmRleCwgcG9ydC0+bUJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIEJ1ZmZlckluZm8gKm91dEJ1ZmZlciA9CisgICAgICAgICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KTsKKworICAgIENIRUNLKG91dEJ1ZmZlci0+bU93bmVkQnlVcyk7CisKKyAgICBvdXRCdWZmZXItPm1IZWFkZXItPm5UaW1lU3RhbXAgPSBtQ3VycmVudFRpbWVVczsKKyAgICAqeXV2ID0gb3V0QnVmZmVyLT5tSGVhZGVyLT5wQnVmZmVyOworCisgICAgcmV0dXJuIDE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9Tb2Z0QVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5NGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL1NvZnRBVkMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9BVkNfSF8KKworI2RlZmluZSBTT0ZUX0FWQ19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3QgdGFnQVZDSGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUlucHV0QnVmZmVycyAgPSA0LAorICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDE4LAorICAgIH07CisKKyAgICBlbnVtIEVPU1N0YXR1cyB7CisgICAgICAgIElOUFVUX0RBVEFfQVZBSUxBQkxFLAorICAgICAgICBJTlBVVF9FT1NfU0VFTiwKKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVELAorICAgIH07CisKKyAgICB0YWdBVkNIYW5kbGUgKm1IYW5kbGU7CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOworCisgICAgYm9vbCBtU1BTU2VlbiwgbVBQU1NlZW47CisKKyAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOworCisgICAgRU9TU3RhdHVzIG1FT1NTdGF0dXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCBkZWNvZGVGcmFnbWVudCgKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZyYWdQdHIsIHNpemVfdCBmcmFnU2l6ZSwKKyAgICAgICAgICAgIGJvb2wgKnJlbGVhc2VGcmFtZXMsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKm91dEhlYWRlcik7CisKKyAgICB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgIGJvb2wgZHJhaW5PdXRwdXRCdWZmZXIoT01YX0JVRkZFUkhFQURFUlRZUEUgKipvdXRIZWFkZXIpOworCisgICAgc3RhdGljIGludDMyX3QgQWN0aXZhdGVTUFNXcmFwcGVyKAorICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsIHVuc2lnbmVkIGludCBzaXplSW5NYnMsIHVuc2lnbmVkIGludCBudW1CdWZmZXJzKTsKKworICAgIHN0YXRpYyBpbnQzMl90IEJpbmRGcmFtZVdyYXBwZXIoCisgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dik7CisKKyAgICBzdGF0aWMgdm9pZCBVbmJpbmRGcmFtZSh2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBpbmRleCk7CisKKyAgICBpbnQzMl90IGFjdGl2YXRlU1BTKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpOworCisgICAgaW50MzJfdCBiaW5kRnJhbWUoaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9BVkNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IGZmZmIyYWQuLmFmODc5NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKQEAgLTEsNyArMSw3IEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9TUkNfRklMRVMgOj0gY21uTWVtb3J5LmMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawppbmRleCBjZmI5ZmU0Li42ZTk4NTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpAQCAtMTAsMyArMTAsMjIgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9nNzExZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRHNzExLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2c3MTFkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTJjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0RzcxMSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRHNzExLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0RzcxMTo6U29mdEc3MTEoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUlzTUxhdyh0cnVlKSwKKyAgICAgIG1OdW1DaGFubmVscygxKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIikpIHsKKyAgICAgICAgbUlzTUxhdyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiKSk7CisgICAgfQorCisgICAgaW5pdFBvcnRzKCk7Cit9CisKK1NvZnRHNzExOjp+U29mdEc3MTEoKSB7Cit9CisKK3ZvaWQgU29mdEc3MTE6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA4MTkyOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0KKyAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KAorICAgICAgICAgICAgICAgIG1Jc01MYXcKKyAgICAgICAgICAgICAgICAgICAgPyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcKKyAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdHNzExOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworCisgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDgwMDA7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChtSXNNTGF3KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0cHRyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICBpZiAobUlzTUxhdykgeworICAgICAgICAgICAgRGVjb2RlTUxhdygKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG91dEhlYWRlci0+cEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGlucHV0cHRyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWNvZGVBTGF3KAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRwdHIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBpbkhlYWRlci0+bkZpbGxlZExlbiAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0RzcxMTo6RGVjb2RlQUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0RzcxMTo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OworICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgICBtYW50aXNzYSAmPSAweDBmOworCisgICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEc3MTEobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjBjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0c3MTFfSF8KKworI2RlZmluZSBTT0ZUX0c3MTFfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdEc3MTEgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdEc3MTEoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRHNzExKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDE2Mzg0LAorICAgIH07CisKKyAgICBib29sIG1Jc01MYXc7CisgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyAgICBzdGF0aWMgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEc3MTEpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0c3MTFfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCmluZGV4IDJkOWJjYzYuLmYxYmVjMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKQEAgLTQ4LDMgKzQ4LDI5IEBACiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0TVBFRzQuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoTE9DQUxfUEFUSCkvc3JjIFwKKwkkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCitMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZiZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0TVBFRzQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0TVBFRzQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdE1QRUc0OjpTb2Z0TVBFRzQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbU1vZGUoTU9ERV9NUEVHNCksCisgICAgICBtSGFuZGxlKG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzKSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbVdpZHRoKDM1MiksCisgICAgICBtSGVpZ2h0KDI4OCksCisgICAgICBtQ3JvcExlZnQoMCksCisgICAgICBtQ3JvcFRvcCgwKSwKKyAgICAgIG1Dcm9wUmlnaHQobVdpZHRoIC0gMSksCisgICAgICBtQ3JvcEJvdHRvbShtSGVpZ2h0IC0gMSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgIG1GcmFtZXNDb25maWd1cmVkKGZhbHNlKSwKKyAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuaDI2My5kZWNvZGVyIikpIHsKKyAgICAgICAgbU1vZGUgPSBNT0RFX0gyNjM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIikpOworICAgIH0KKworICAgIGluaXRQb3J0cygpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRNUEVHNDo6flNvZnRNUEVHNCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKTsKKyAgICB9CisKKyAgICBkZWxldGUgbUhhbmRsZTsKKyAgICBtSGFuZGxlID0gTlVMTDsKK30KKwordm9pZCBTb2Z0TVBFRzQ6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPQorICAgICAgICAobU1vZGUgPT0gTU9ERV9NUEVHNCkKKyAgICAgICAgICAgID8gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQorICAgICAgICAgICAgOiBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworCisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPQorICAgICAgICBtTW9kZSA9PSBNT0RFX01QRUc0ID8gT01YX1ZJREVPX0NvZGluZ01QRUc0IDogT01YX1ZJREVPX0NvZGluZ0gyNjM7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0TVBFRzQ6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVBFRzQ6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KQorICAgICAgICAgICAgICAgICAgICAgICAgPyBPTVhfVklERU9fQ29kaW5nTVBFRzQgOiBPTVhfVklERU9fQ29kaW5nSDI2MzsKKworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXgsIDF1KTsKKworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVBFRzQ6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9NUEVHNCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE1QRUc0OjpnZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3A6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgKnJlY3RQYXJhbXMgPSAoT01YX0NPTkZJR19SRUNUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHJlY3RQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY3RQYXJhbXMtPm5MZWZ0ID0gbUNyb3BMZWZ0OworICAgICAgICAgICAgcmVjdFBhcmFtcy0+blRvcCA9IG1Dcm9wVG9wOworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bldpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uSGVpZ2h0ID0gbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDE7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIFBvcnRJbmZvICpwb3J0ID0gZWRpdFBvcnRJbmZvKDEpOworCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPQorICAgICAgICAgICAgcG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChtTnVtU2FtcGxlc091dHB1dCAmIDEpLm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBMaXN0PEJ1ZmZlckluZm8gKj46Oml0ZXJhdG9yIGl0ID0gb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKml0OworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2UoaXQpOworICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV07CisgICAgICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOworCisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CisgICAgICAgICAgICAgICAgdm9sX3NpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVA0RGVjb2RpbmdNb2RlIG1vZGUgPQorICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisKKyAgICAgICAgICAgIEJvb2wgc3VjY2VzcyA9IFBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LCBtb2RlKTsKKworICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgTE9HVygiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobUhhbmRsZSk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZSgoVmlkZW9EZWNDb250cm9scyAqKSBtSGFuZGxlLCAwKTsKKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFICYmIHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICBQb3J0SW5mbyAqcG9ydCA9IGVkaXRQb3J0SW5mbygxKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KDEpLm1IZWFkZXI7CisKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1IYW5kbGUsIG91dEhlYWRlci0+cEJ1ZmZlcik7CisKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChpbkhlYWRlci0+bk9mZnNldCA9PSAwKTsKKworICAgICAgICAvLyBkZWNvZGVyIGRlYWxzIGluIG1zLCBPTVggaW4gdXMuCisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9CisgICAgICAgICAgICB1c2VFeHRUaW1lc3RhbXAgPyAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMCA6IDB4RkZGRkZGRkY7CisKKyAgICAgICAgaW50MzJfdCBidWZmZXJTaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaWYgKFBWRGVjb2RlVmlkZW9GcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgJmJpdHN0cmVhbSwgJnRpbWVzdGFtcCwgJmJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+cEJ1ZmZlcikgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlY29kZXIgZGVhbHMgaW4gbXMsIE9NWCBpbiB1cy4KKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gdGltZXN0YW1wICogMTAwMDsKKworICAgICAgICBDSEVDS19MRShidWZmZXJTaXplLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gYnVmZmVyU2l6ZTsKKyAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSBidWZmZXJTaXplOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICB3aGlsZSAoKCppdCktPm1IZWFkZXIgIT0gb3V0SGVhZGVyKSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICppdDsKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworCisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICB9Cit9CisKK2Jvb2wgU29mdE1QRUc0Ojpwb3J0U2V0dGluZ3NDaGFuZ2VkKCkgeworICAgIGludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CisgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobUhhbmRsZSwgJmRpc3Bfd2lkdGgsICZkaXNwX2hlaWdodCk7CisKKyAgICBpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKKyAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobUhhbmRsZSwgJmJ1Zl93aWR0aCwgJmJ1Zl9oZWlnaHQpOworCisgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKKyAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CisKKyAgICBMT0dWKCJkaXNwX3dpZHRoID0gJWQsIGRpc3BfaGVpZ2h0ID0gJWQsIGJ1Zl93aWR0aCA9ICVkLCBidWZfaGVpZ2h0ID0gJWQiLAorICAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CisKKyAgICBpZiAobUNyb3BSaWdodCAhPSBkaXNwX3dpZHRoIC0gMQorICAgICAgICAgICAgfHwgbUNyb3BCb3R0b20gIT0gZGlzcF9oZWlnaHQgLSAxKSB7CisgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgbUNyb3BSaWdodCA9IGRpc3Bfd2lkdGggLSAxOworICAgICAgICBtQ3JvcEJvdHRvbSA9IGRpc3BfaGVpZ2h0IC0gMTsKKworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGJ1Zl93aWR0aCAhPSBtV2lkdGggfHwgYnVmX2hlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGJ1Zl93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGJ1Zl9oZWlnaHQ7CisKKyAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfSDI2MykgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU29mdE1QRUc0OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQ0hFQ0tfRVEoKGludClQVlJlc2V0VmlkZW9EZWNvZGVyKG1IYW5kbGUpLCAoaW50KVBWX1RSVUUpOworICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgICgoKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICsgMTUpICYgLTE2KQorICAgICAgICAgICAgKiAoKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCArIDE1KSAmIC0xNikgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdE1QRUc0KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMDhhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9NUEVHNF9IXworCisjZGVmaW5lIFNPRlRfTVBFRzRfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRNUEVHNCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0TVBFRzQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRNUEVHNCgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICA9IDQsCisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE1PREVfTVBFRzQsCisgICAgICAgIE1PREVfSDI2MywKKworICAgIH0gbU1vZGU7CisKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptSGFuZGxlOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKKworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisKKyAgICBpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfTVBFRzRfSF8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggNzUzNTAwZS4uMjI5OTg4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNTcsMyArNTcsMjYgQEAKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgU29mdE1QMy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXAzZGVjCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X21wM2RlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NUDNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTVAzRGVjb2Rlci5jcHAKaW5kZXggNTlkZDc0MC4uMGJhNDJmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NUDNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1QM0RlY29kZXIiCisKICNpbmNsdWRlICJNUDNEZWNvZGVyLmgiCiAKICNpbmNsdWRlICJpbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCIKQEAgLTE3NSw3ICsxNzgsMTIgQEAKICAgICAgICAgICAgICE9IE5PX0RFQ09ESU5HX0VSUk9SKSB7CiAgICAgICAgIExPR1YoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUikgeworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKworICAgICAgICAgICAgaWYgKG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiT3V0cHV0IGZyYW1lIHNpemUgaXMgMCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZjODhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE1QMyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRNUDMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdE1QMzo6U29mdE1QMygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQ29uZmlnKG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwpLAorICAgICAgbURlY29kZXJCdWYoTlVMTCksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1OdW1DaGFubmVscygyKSwKKyAgICAgIG1TYW1wbGluZ1JhdGUoNDQxMDApLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGluaXRQb3J0cygpOworICAgIGluaXREZWNvZGVyKCk7Cit9CisKK1NvZnRNUDM6On5Tb2Z0TVAzKCkgeworICAgIGlmIChtRGVjb2RlckJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgZGVsZXRlIG1Db25maWc7CisgICAgbUNvbmZpZyA9IE5VTEw7Cit9CisKK3ZvaWQgU29mdE1QMzo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ01QMzsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKwordm9pZCBTb2Z0TVAzOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRNUDM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIFNvZnRNUDM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworCisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisKKyAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIExPR1YoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk91dHB1dCBmcmFtZSBzaXplIGlzIDAiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCisgICAgICAgICAgICBtZW1zZXQob3V0SGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIH0gZWxzZSBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IG1TYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbU51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworCisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKKyAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisKKyAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE1QMzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE1QMzo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRNUDMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQwNjgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9NUDNfSF8KKworI2RlZmluZSBTT0ZUX01QM19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0TVAzIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRNUDMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga091dHB1dEJ1ZmZlclNpemUgPSA0NjA4ICogMgorICAgIH07CisKKyAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKKworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKKworICAgIGJvb2wgbUNvbmZpZ3VyZWQ7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgdm9pZCBpbml0RGVjb2RlcigpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QMyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfTVAzX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKaW5kZXggYjc2OWYwZC4uODMyYjg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCkBAIC0yLDE1ICsyLDQyIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgVlBYRGVjb2Rlci5jcHAKKyAgICAgICAgVlBYRGVjb2Rlci5jcHAgIFwKIAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3ZweGRlYwogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweCBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvdnB4X2NvZGVjIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfcG9ydHMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgU29mdFZQWC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHggXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9jb2RlYyBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvdnB4X3BvcnRzIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZweGRlYyBcCisgICAgICAgIGxpYnZweAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljZTcxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0VlBYIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdFZQWC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdFZQWDo6U29mdFZQWCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbVdpZHRoKDMyMCksCisgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0VlBYOjp+U29mdFZQWCgpIHsKKyAgICB2cHhfY29kZWNfZGVzdHJveSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCk7CisgICAgZGVsZXRlICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4OworICAgIG1DdHggPSBOVUxMOworfQorCit2b2lkIFNvZnRWUFg6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA4MTkyOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWCk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUFg7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgZGVmLm5CdWZmZXJTaXplID0KKyAgICAgICAgKGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMpIC8gMjsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKworc3RhdHVzX3QgU29mdFZQWDo6aW5pdERlY29kZXIoKSB7CisgICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CisgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CisgICAgaWYgKCh2cHhfZXJyID0gdnB4X2NvZGVjX2RlY19pbml0KAorICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvLCBOVUxMLCAwKSkpIHsKKyAgICAgICAgTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRWUFg6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUFg7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLX0VRKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCwgMXUpOworCisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRWUFg6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBTb2Z0VlBYOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKKyAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIDApKSB7CisgICAgICAgICAgICBMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOworCisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworICAgICAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOworCisgICAgICAgIGlmIChpbWcgIT0gTlVMTCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoaW1nLT5mbXQsIElNR19GTVRfSTQyMCk7CisKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgICAgIGlmICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9ZXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2g7ICsraSkgeworICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93KTsKKworICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfWV07CisgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9VXTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOworCisgICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9VXTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9WXTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOworCisgICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9WXTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIFNvZnRWUFg6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit9CisKK3ZvaWQgU29mdFZQWDo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRWUFg6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aAorICAgICAgICAgICAgKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdFZQWChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgxNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfVlBYX0hfCisKKyNkZWZpbmUgU09GVF9WUFhfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdFZQWCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0VlBYKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0VlBYKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDQKKyAgICB9OworCisgICAgdm9pZCAqbUN0eDsKKworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VlBYKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9WUFhfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzYzg3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTI3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwkuL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF92bGMuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMgXAorCS4vc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMgXAorCS4vc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9kcGIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgXAorCS4vc291cmNlL2gyNjRic2RfdnVpLmMgXAorCS4vc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyBcCisJLi9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgXAorCVNvZnRBVkMuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4vaW5jIFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK01ZX0FTTSA6PSBcCisJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TIFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUworCisKK01ZX09NWERMX0NfU1JDIDo9IFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgXAorCS4vb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgXAorCS4vb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYworCitNWV9PTVhETF9BU01fU1JDIDo9IFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBcCisKKworaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCisgICAgTE9DQUxfQVJNX05FT04gICA6PSB0cnVlCisjICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLXN0ZD1jOTkgLUQuX05FT04gLUQuX09NWERMCisgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtREgyNjRERUNfTkVPTiAtREgyNjRERUNfT01YREwKKyAgICBMT0NBTF9TUkNfRklMRVMgICs9ICQoTVlfQVNNKSAkKE1ZX09NWERMX0NfU1JDKSAkKE1ZX09NWERMX0FTTV9TUkMpCisgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi9hcGkgXAorICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL2FwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpCitlbmRpZgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdGVzdCB1dGlsaXR5OiBkZWNvZGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyBUZXN0IGFwcGxpY2F0aW9uCisjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAuL3NvdXJjZS9EZWNUZXN0QmVuY2guYworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9oMjY0ZGVjCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRSA6PSBkZWNvZGVyCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDJlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFWQyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRBVkMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0QVZDOjpTb2Z0QVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1IYW5kbGUoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbVBpY3R1cmVTaXplKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksCisgICAgICBtQ3JvcExlZnQoMCksCisgICAgICBtQ3JvcFRvcCgwKSwKKyAgICAgIG1Dcm9wV2lkdGgobVdpZHRoKSwKKyAgICAgIG1Dcm9wSGVpZ2h0KG1IZWlnaHQpLAorICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKKyAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCisgICAgICBtUGljSWQoMCksCisgICAgICBtSGVhZGVyc0RlY29kZWQoZmFsc2UpLAorICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0QVZDOjp+U29mdEFWQygpIHsKKyAgICBIMjY0U3dEZWNSZWxlYXNlKG1IYW5kbGUpOworICAgIG1IYW5kbGUgPSBOVUxMOworCisgICAgd2hpbGUgKG1QaWNUb0hlYWRlck1hcC5zaXplKCkgIT0gMCkgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLmVkaXRWYWx1ZUF0KDApOworICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyID0gTlVMTDsKKyAgICB9CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKKyAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOworCisgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKK30KKwordm9pZCBTb2Z0QVZDOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga0lucHV0UG9ydEluZGV4OworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga091dHB1dFBvcnRJbmRleDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoSDI2NFN3RGVjSW5pdCgmbUhhbmRsZSwgMSkgPT0gSDI2NFNXREVDX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga0lucHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmdldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcmVjdFBhcmFtcyA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocmVjdFBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkxlZnQgPSBtQ3JvcExlZnQ7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uVG9wID0gbUNyb3BUb3A7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uV2lkdGggPSBtQ3JvcFdpZHRoOworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkhlaWdodCA9IG1Dcm9wSGVpZ2h0OworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCisgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKKworICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgeworICAgICAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICsrbVBpY0lkOworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOworICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIGhlYWRlci0+bkZsYWdzID0gaW5IZWFkZXItPm5GbGFnczsKKyAgICAgICAgbVBpY1RvSGVhZGVyTWFwLmFkZChtUGljSWQsIGhlYWRlcik7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBIMjY0U3dEZWNJbnB1dCBpblBpY3R1cmU7CisgICAgICAgIEgyNjRTd0RlY091dHB1dCBvdXRQaWN0dXJlOworICAgICAgICBtZW1zZXQoJmluUGljdHVyZSwgMCwgc2l6ZW9mKGluUGljdHVyZSkpOworICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGluUGljdHVyZS5waWNJZCA9IG1QaWNJZDsKKyAgICAgICAgaW5QaWN0dXJlLmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAxOworICAgICAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY29kZWRQaWN0dXJlOworCisgICAgICAgIHdoaWxlIChpblBpY3R1cmUuZGF0YUxlbiA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShtSGFuZGxlLCAmaW5QaWN0dXJlLCAmb3V0UGljdHVyZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSB8fAorICAgICAgICAgICAgICAgIHJldCA9PSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSkgeworICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuIC09ICh1MzIpKG91dFBpY3R1cmUucFN0cm1DdXJyUG9zIC0gaW5QaWN0dXJlLnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gb3V0UGljdHVyZS5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3N0IGR1cmluZyBkeW5hbWljIHBvcnQgcmVjb25maWd1cmF0aW9uIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5NQVggY2xpZW50IHdpbGwgZGVsZXRlIF9hbGxfIG91dHB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5waWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRGVjb2RlciBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaXJzdFBpY3R1cmUgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGRyYWluT25lT3V0cHV0QnVmZmVyKG1GaXJzdFBpY3R1cmVJZCwgbUZpcnN0UGljdHVyZSk7CisgICAgICAgICAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOworICAgICAgICAgICAgbUZpcnN0UGljdHVyZSA9IE5VTEw7CisgICAgICAgICAgICBtRmlyc3RQaWN0dXJlSWQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIG1IZWFkZXJzRGVjb2RlZCAmJgorICAgICAgICAgICAgICAgIEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPT0gSDI2NFNXREVDX1BJQ19SRFkpIHsKKworICAgICAgICAgICAgaW50MzJfdCBwaWNJZCA9IGRlY29kZWRQaWN0dXJlLnBpY0lkOworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIGRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOworICAgICAgICAgICAgZHJhaW5PbmVPdXRwdXRCdWZmZXIocGljSWQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVyciwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgU29mdEFWQzo6aGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKSB7CisgICAgaWYgKG1XaWR0aCAhPSBpbmZvLT5waWNXaWR0aCB8fCBtSGVpZ2h0ICE9IGluZm8tPnBpY0hlaWdodCkgeworICAgICAgICBtV2lkdGggID0gaW5mby0+cGljV2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBpbmZvLT5waWNIZWlnaHQ7CisgICAgICAgIG1QaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTb2Z0QVZDOjpoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMgKmNyb3ApIHsKKyAgICBpZiAobUNyb3BMZWZ0ICE9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0IHx8CisgICAgICAgIG1Dcm9wVG9wICE9IGNyb3AtPmNyb3BUb3BPZmZzZXQgfHwKKyAgICAgICAgbUNyb3BXaWR0aCAhPSBjcm9wLT5jcm9wT3V0V2lkdGggfHwKKyAgICAgICAgbUNyb3BIZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgeworICAgICAgICBtQ3JvcExlZnQgPSBjcm9wLT5jcm9wTGVmdE9mZnNldDsKKyAgICAgICAgbUNyb3BUb3AgPSBjcm9wLT5jcm9wVG9wT2Zmc2V0OworICAgICAgICBtQ3JvcFdpZHRoID0gY3JvcC0+Y3JvcE91dFdpZHRoOworICAgICAgICBtQ3JvcEhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsCisgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgeworICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7CisgICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7CisKKyAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbbVBpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgbVBpY3R1cmVTaXplKTsKK30KKwordm9pZCBTb2Z0QVZDOjpkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90KiBkYXRhKSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaGVhZGVyLT5uVGltZVN0YW1wOworICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICBkYXRhLCBtUGljdHVyZVNpemUpOworICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKKyAgICBkZWxldGUgaGVhZGVyOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworfQorCitib29sIFNvZnRBVkM6OmRyYWluQWxsT3V0cHV0QnVmZmVycygpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChtSGVhZGVyc0RlY29kZWQgJiYKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZID09CisgICAgICAgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAxIC8qIGZsdXNoICovKSkgeworCisgICAgICAgICAgICBpbnQzMl90IHBpY0lkID0gZGVjb2RlZFBpY3R1cmUucGljSWQ7CisgICAgICAgICAgICBDSEVDSyhtUGljVG9IZWFkZXJNYXAuaW5kZXhPZktleShwaWNJZCkgPj0gMCk7CisKKyAgICAgICAgICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgbVBpY3R1cmVTaXplKTsKKworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgICAgICAgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOworICAgICAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEOworICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aAorICAgICAgICAgICAgKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDM5ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9BVkNfSF8KKworI2RlZmluZSBTT0ZUX0FWQ19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ICAgPSAwLAorICAgICAgICBrT3V0cHV0UG9ydEluZGV4ICA9IDEsCisgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgID0gOCwKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAxNiwKKyAgICB9OworCisgICAgZW51bSBFT1NTdGF0dXMgeworICAgICAgICBJTlBVVF9EQVRBX0FWQUlMQUJMRSwKKyAgICAgICAgSU5QVVRfRU9TX1NFRU4sCisgICAgICAgIE9VVFBVVF9GUkFNRVNfRkxVU0hFRCwKKyAgICB9OworCisgICAgdm9pZCAqbUhhbmRsZTsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHVpbnQzMl90IG1XaWR0aCwgbUhlaWdodCwgbVBpY3R1cmVTaXplOworICAgIHVpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3A7CisgICAgdWludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CisKKyAgICB1aW50OF90ICptRmlyc3RQaWN0dXJlOworICAgIGludDMyX3QgbUZpcnN0UGljdHVyZUlkOworCisgICAgaW50MzJfdCBtUGljSWQ7ICAvLyBXaGljaCBvdXRwdXQgcGljdHVyZSBpcyBmb3Igd2hpY2ggaW5wdXQgYnVmZmVyPworCisgICAgLy8gT01YX0JVRkZFUkhFQURFUlRZUEUgbWF5IGJlIG92ZXJraWxsLCBidXQgaXQgaXMgY29udmVuaWVudAorICAgIC8vIGZvciB0cmFja2luZyB0aGUgZm9sbG93aW5nIGZpZWxkczogbkZsYWdzLCBuVGltZVN0YW1wLCBldGMuCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbVBpY1RvSGVhZGVyTWFwOworICAgIGJvb2wgbUhlYWRlcnNEZWNvZGVkOworCisgICAgRU9TU3RhdHVzIG1FT1NTdGF0dXM7CisKKyAgICBlbnVtIE91dHB1dFBvcnRTZXR0aW5nQ2hhbmdlIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9OworICAgIE91dHB1dFBvcnRTZXR0aW5nQ2hhbmdlIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICBib29sIGRyYWluQWxsT3V0cHV0QnVmZmVycygpOworICAgIHZvaWQgZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWRJZCwgdWludDhfdCAqZGF0YSk7CisgICAgYm9vbCBoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMqIGNyb3ApOworICAgIGJvb2wgaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0FWQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTExMmJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBIZWFkZXJzCisKKyAgICAyLiBFbnVtZXJhdGlvbnMgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBvciBhIHBhcmFtZXRlci4KKyAgICAgICAgMi4xLiBBUEkncyByZXR1cm4gdmFsdWUgZW51bWVyYXRpb25zLgorCisgICAgMy4gVXNlciBTdHJ1Y3R1cmVzCisgICAgICAgIDMuMS4gU3RydWN0dXJlcyBmb3IgSDI2NFN3RGVjRGVjb2RlKCkgcGFyYW1ldGVycy4KKyAgICAgICAgMy4yLiBTdHJ1Y3R1cmVzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSB3aXRoCisgICAgICAgICAgICAgREVDIEFQSSBhbmQgdXNlciBhcHBsaWNhdGlvbi4KKworICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDQVBJX0gKKyNkZWZpbmUgSDI2NFNXREVDQVBJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIEhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgdHlwZWRlZiBlbnVtCisgICAgeworICAgICAgICBIMjY0U1dERUNfT0sgPSAwLAorICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgPSAxLAorICAgICAgICBIMjY0U1dERUNfUElDX1JEWSwKKyAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFksCisgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSwKKyAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiA9IC0xLAorICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgPSAtMiwKKyAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCA9IC0zLAorICAgICAgICBIMjY0U1dERUNfTUVNRkFJTCA9IC00LAorICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgPSAtNSwKKyAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSA9IC02LAorICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCA9IC03CisgICAgfSBIMjY0U3dEZWNSZXQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIHR5cGVkZWYgb2YgdGhlIERlY29kZXIgaW5zdGFuY2UgKi8KKyAgICB0eXBlZGVmIHZvaWQgKkgyNjRTd0RlY0luc3Q7CisKKyAgICAvKiBJbnB1dCBzdHJ1Y3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTggICpwU3RyZWFtOyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc3RyZWFtIHRvIGJlIGRlY29kZWQgICAgICAgICAgKi8KKyAgICAgICAgdTMyICBkYXRhTGVuOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSBkZWNvZGVkICAgICAgICAgICAgKi8KKyAgICAgICAgdTMyICBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgZm9yIHRoZSBwaWN0dXJlIHRvIGJlIGRlY29kZWQgKi8KKyAgICAgICAgdTMyIGludHJhQ29uY2VhbG1lbnRNZXRob2Q7IC8qIDAgPSBHcmF5IGNvbmNlYWxtZW50IGZvciBpbnRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFJlZmVyZW5jZSBjb25jZWFsbWVudCBmb3IgaW50cmEgKi8KKworICAgIH0gSDI2NFN3RGVjSW5wdXQ7CisKKworICAgIC8qIE91dHB1dCBzdHJ1Y3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gcG9zaXRpb24gd2hlcmUgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCB1cCAqLworICAgIH0gSDI2NFN3RGVjT3V0cHV0OworCisgICAgLyogT3V0cHV0IHN0cnVjdHVyZSBmb3IgSDI2NFN3RGVjTmV4dFBpY3R1cmUgKi8KKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTMyICpwT3V0cHV0UGljdHVyZTsgICAgLyogUG9pbnRlciB0byB0aGUgcGljdHVyZSwgWVVWIGZvcm1hdCAgICAgICAqLworICAgICAgICB1MzIgcGljSWQ7ICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIG9mIHRoZSBwaWN0dXJlIHRvIGJlIGRpc3BsYXllZCovCisgICAgICAgIHUzMiBpc0lkclBpY3R1cmU7ICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUgKi8KKyAgICAgICAgdTMyIG5ick9mRXJyTUJzOyAgICAgICAgLyogTnVtYmVyIG9mIGNvbmNlYWxlZCBNQidzIGluIHRoZSBwaWN0dXJlICAqLworICAgIH0gSDI2NFN3RGVjUGljdHVyZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGggREVDIEFQSQorICAgICAgICAgYW5kIHVzZXIgYXBwbGljYXRpb24uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBjcm9wTGVmdE9mZnNldDsKKyAgICAgICAgdTMyIGNyb3BPdXRXaWR0aDsKKyAgICAgICAgdTMyIGNyb3BUb3BPZmZzZXQ7CisgICAgICAgIHUzMiBjcm9wT3V0SGVpZ2h0OworICAgIH0gQ3JvcFBhcmFtczsKKworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgcHJvZmlsZTsKKyAgICAgICAgdTMyIHBpY1dpZHRoOworICAgICAgICB1MzIgcGljSGVpZ2h0OworICAgICAgICB1MzIgdmlkZW9SYW5nZTsKKyAgICAgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKKyAgICAgICAgdTMyIHBhcldpZHRoOworICAgICAgICB1MzIgcGFySGVpZ2h0OworICAgICAgICB1MzIgY3JvcHBpbmdGbGFnOworICAgICAgICBDcm9wUGFyYW1zIGNyb3BQYXJhbXM7CisgICAgfSBIMjY0U3dEZWNJbmZvOworCisgICAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgbWFqb3I7ICAgIC8qIERlY29kZXIgQVBJIG1ham9yIHZlcnNpb24gKi8KKyAgICAgICAgdTMyIG1pbm9yOyAgICAvKiBEbmNvZGVyIEFQSSBtaW5vciB2ZXJzaW9uICovCisgICAgfSBIMjY0U3dEZWNBcGlWZXJzaW9uOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0ICAgICAgZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0lucHV0ICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICAgICpwT3V0cHV0KTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nKTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0ICAgICBkZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSk7CisKKyAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pOworCisgICAgdm9pZCAgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpOworCisgICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKHZvaWQpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBBUEkgdHJhY2UgKi8KKyAgICB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKik7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCisgICAgdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGZyZWUgKi8KKyAgICB2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGNvcHkgKi8KKyAgICB2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCk7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbXNldCAqLworICAgIHZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIMjY0U1dERUNBUElfSCAqLworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZDU2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBCQVNFVFlQRV9IX0lOQ0xVREVECisjZGVmaW5lIEJBU0VUWVBFX0hfSU5DTFVERUQKKworCisjaWZkZWYgX19hcm0KKyNkZWZpbmUgVk9MQVRJTEUgdm9sYXRpbGUKKyNlbHNlCisjZGVmaW5lIFZPTEFUSUxFCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdTg7Cit0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBpODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHUxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHUzMjsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgIGkzMjsKKworI2lmIGRlZmluZWQoVkMxU1dERUNfMTZCSVQpIHx8IGRlZmluZWQoTVA0RU5DX0FSTTExKQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2eDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0ICAgIGkxNng7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTE2eDsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgIGkxNng7CisjZW5kaWYKKworCisjaWZuZGVmIE5VTEwKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgIC8qIEJBU0VUWVBFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNzBjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTM+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKKyAgVjYgb3B0aW1pemVkIGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCisgIGludGVybmFsIGFjY2VzcworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCitiZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgorCitCZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAorbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCitzbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKK2NvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgorQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCit0aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKK2FuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKK3RoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5CithdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQorcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKK2d1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCitkYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgorQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKK3RvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQorZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKK3dpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKK3dpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKK21haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCisKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitJbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKK3R3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCisKK1RoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxMy5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQorbm90ZS4KKworVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQorZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCisKK1RoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCitNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgorCitUaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKKyJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgorCisgICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDEzLlRYVAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjIzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVApAQCAtMCwwICsxLDkxIEBACisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KK2UwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKK2VkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCis0ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAorNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKKzhmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorNTNmMmFlOGE5ODQ5NWYwNWUyNmE0Y2Y4NjJhN2Y3NTAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCis1MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKzg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCis2OTQyODFkMTFhZjUyZjg4ZTZmOWQ0Y2IyMjZhYzhhNyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2U3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLworZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKzRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCis4NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCis3MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworMzg5NDRjNWUwYmJhMDFlMzJmZjM0OWMyYzg3YzcxYjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCiszMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKzkwYjBlNmEwNGU3NjQ5MDJjMGEwOTAzNjQwYzEwYjMyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCisyOGExOWFlNGZlMjI1ODYyODA4MGQ2YTg5YmI1NGI5MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCis5OGUxOTZiOWUxZmZlYmFmOTFmNjJlYTlkMTdmYjk3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworZjMwMWQ1YTk1ZTA3MzU0ZjU5M2VhNTc0N2MwMWNiMGEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKzQ0YzllZjIxZTg0MGExMDAzMDFmN2Q3YTQxODk5NTdjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworYTMzYjAzYmJkMzM1MmQyNGVkNzQ0NzY5ZTEyYmI4N2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzAwYzIwYmZkYTY3YmI4NjA5NmI2MTVmYzE3Yzk0YjM1ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKK2MzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKK2U0ZmVjZDY2YmM0N2YwNzUzOWJjMzA4OTM1ZTg0YTFmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworNzg4MTVjOWRmNTBiYTUzMTMxYmIyMmQyYjgyOWUzYzMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKzE5MDlhZTMxMmFjNzlhMDNhNWZhYzFkMWU4YmMwMjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzNkMmM0ODU4MDY1NTkyODA2NWRlNzgzOTg2NmQ5YmM0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworMjNhYTJmZGYxNTVkNGZhNmZmNzQ1ZWFiNmUwMWYzMmIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKzk3ZjIwYTkzYzQ4MWQ3ZjYxNzNkOTE5ZjQxZTQxNWJkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKK2JlY2Q1MTJkYTIwMjQzNjI4NjgxMWI2YWVjMDYxZjQ3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCitkZDI0YTk5YWUzY2Q4NDJkY2FjYWYzMWQ0N2RlODhiMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCiszNjI4ZmJkZjBjZDIxN2MyODdiNmNjYzk0MTM1ZDA2ZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisxMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCiszNTk5YjEwNzQzMzA5NjVjOGNhMjg1ZDE2NGVmY2NmZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworMzMzOWUwMjZjN2RlNjU1ZDk0MDA5NDllYjVlNTE0NTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KK2NkZjQxMjkyMGMyMDM3YTcyNWQwNDIwMDAyYjY3NTJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCitkYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKK2I1NTliNzFkNWM5NDYyN2YxMGU2MTZmYjcyYzBjZWZjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzFlNGMzYmU4YzVlZGRjMDBjOWYwNWU4M2JjZjMxNWVmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKK2FjYjkyYmUxZGJjZGIzZWJlODI0Y2JlOWUyOGQwM2JmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKK2E2YjQxZjAxYjFkZjdkZDY1NmViZGJhMzA4NGJmYTJhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKK2ZmZTZiOTZjNzRkNDg4MWY0ZDNjOGRlOGNjNzM3Nzk3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKK2ZmNTkxNWQxODFiZmQyY2QyZjBiZDU4OGJkMjMwMGRjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCis2Nzc1ZWIwYzU2MWRiYWI5NjVjNjBmODViMDhjOTZmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKK2EwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKK2E1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworNTBjY2E2OTU0YzQ0N2IwMTJhYjM5Y2E3ODcyZTVlOGYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCitkMWMzYmNlNzdmYzU3NzRjODk5YjQ0N2QxM2YwMmNkMCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCitmZGFjMWQxYmFkM2ZkMjNjODgwYmViMzliYzJlODlhYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCis2ZDlhZGMyYmU1YmQwMzExNTkxMDMwZDBjNmRmNzcxYyAgQVJNX0RFTElWRVJZXzk3NDEzLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmgKQEAgLTAsMCArMSw3ODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogICAKKyAqIEZpbGU6IGFybUNPTU0uaAorICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICoKKyAqLworIAorICAKKyNpZm5kZWYgX2FybUNvbW1vbl9IXworI2RlZmluZSBfYXJtQ29tbW9uX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwordHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07CisKKworI2luY2x1ZGUgImFybU9NWC5oIgorCisjZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBBUk1fREVCVUcKKy8qIGRlYnVnIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KKyNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQorI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCisjZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKKyNlbHNlIAorLyogcmVsZWFzZSB2ZXJzaW9uICovCisjZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQorI2VuZGlmIC8qIEFSTV9ERUJVRyAqLworCisvKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKKyNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCisjZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQorCisvKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCisjZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCisjZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCisjZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCisjZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQorCisvKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCisKKyNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKyNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKworI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludCkoUHRyKSkgJSBOKT09MCkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnQpKFB0cikpICUgTikhPTApCisjZWxzZQorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKKworI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQorI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisgCitPTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICAgICAgT01YX0lOVCBtaW4sCisgICAgICAgIE9NWF9JTlQgbWF4LCAKKyAgICAgICAgT01YX1MzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICAgICAgT01YX0YzMiBtaW4sCisgICAgICAgIE9NWF9GMzIgbWF4LCAKKyAgICAgICAgT01YX0YzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAorICAgICAgICBPTVhfRjMyIHYsIAorICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKKyAgICAgICAgT01YX0lOVCBzYXRCaXRzCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOworCisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorICAgICk7ICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TNjQgYXJtU2F0QWRkX1M2NCgKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRGVidWdnaW5nIG1hY3JvcworICoKKyAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQorICovCisjZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKKworLyoKKyAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KKyAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KKyAqLworI2lmZGVmIERFQlVHX09OCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQorI2Vsc2UgLyogREVCVUdfT04gKi8KKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKKyNlbmRpZiAvKiBERUJVR19PTiAqLworCisKKy8qCisgKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKKyAqCisgKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KKyAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKKyAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgorICovCisKKyNpZmRlZiBERUJVR19ET01BSU5fQUMKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1ZDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSUMKKy8qIFRvIGJlIGZpbGxlZCBpbiAqLworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fU1AKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2CisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JUAorI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KKworCisjZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLworCisvKkVuZCBvZiBGaWxlKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI5OGZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmgKQEAgLTAsMCArMSw2NzAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIAorOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCis7Ly8KKzsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCis7Ly8KKzsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCis7Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKKzsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKKzsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorOy8vCis7Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAorOy8vCis7Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKzsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQorOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQorOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKzsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKzsvLworOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKzsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCis7Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorOy8vCis7Ly8gVVNBR0U6Cis7Ly8KKzsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgorOy8vCis7Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAorOy8vCis7Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQorOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCis7Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKKzsvLyBjYWxsIE1fQkRfRklOSS4KKzsvLworOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Cis7Ly8KKzsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQorOy8vCis7Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKKzsvLworOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAorOy8vCis7Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KKzsvLworOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCis7Ly8gdmFyaWFibGVzOgorOy8vCisKKyAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQorICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKKyAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKKyAgIAorOy8vICAgICAgICAKKzsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQorOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCis7Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCis7Ly8KKzsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Cis7Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCis7Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Cis7Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKKzsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKKzsvLworOy8vCisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQorICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKKyAgICAgICAgOy8vIHNjaGVkdWxpbmcuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQorICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKKyAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKKworcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCitCaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKK0JpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkIGlucHV0cworICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCisgICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQorICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KKyAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMworICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAorICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgorICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQorICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQorICAgICAgICBJRiAoJE48PTgpCisgICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEVMU0UgICAgICAgIAorICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCisgICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQorICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gYnVmZmVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04CisgICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKKyAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKKyAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQorICAgICAgICAKKyAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0CisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCisgICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKKzAxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCisgICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5CisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKKyAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKKyAgICAgICAgQkNTICAgICAlRlQwMgorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKKyAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKKyAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1CisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAorICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAorICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5CiswMgorICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQorICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1CisgICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQorICAgICAgICAKKyAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAorICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKKworICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKKyAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKKyAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3CisgICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKKyAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4CisKKyAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKKyAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKKyAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCisgICAgICAgIAorICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCisKKyAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKKyAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4CisgICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNworICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICAKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKKyAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKKyAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAorICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCisgICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YmMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KKyAqCisgKi8KKworI2lmbmRlZiBfYXJtQ29kZWNfSF8KKyNkZWZpbmUgX2FybUNvZGVjX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4ICAgY29kZUxlbjsKKyAgICBPTVhfVTMyCSBjb2RlV29yZDsKK30gQVJNX1ZMQzMyOworCisvKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOworCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgorICoqLworCisjZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKTsKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispOworCisjZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGIzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgorICoKKyAqLworICAKKyNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCisjZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07CisKKyNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KKworCisvKiBFbmQgb2YgRmlsZSAqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmNzEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaApAQCAtMCwwICsxLDE0NDUgQEAKKzsvLworOy8vIFRoaXMgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBvbmx5IGFzCis7Ly8gYXV0aG9yaXNlZCBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZAorOy8vICAgKEMpIENPUFlSSUdIVCAyMDA0IEFSTSBMaW1pdGVkCis7Ly8gICAgICAgQUxMIFJJR0hUUyBSRVNFUlZFRAorOy8vIFRoZSBlbnRpcmUgbm90aWNlIGFib3ZlIG11c3QgYmUgcmVwcm9kdWNlZCBvbiBhbGwgYXV0aG9yaXNlZAorOy8vIGNvcGllcyBhbmQgY29waWVzIG1heSBvbmx5IGJlIG1hZGUgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQKKzsvLyBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZC4KKzsvLworOy8vIElEQ1Rfcy5zCis7Ly8KKzsvLyBJbnZlcnNlIERDVCBtb2R1bGUKKzsvLworOy8vIAorOy8vIEFMR09SSVRITSBERVNDUklQVElPTgorOy8vCis7Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKKzsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KKzsvLworOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQorOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgorOy8vCis7Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKKzsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQorOy8vCis7Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCis7Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KKzsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCis7Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKKzsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQorOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQorOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKKzsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCis7Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgorOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgorOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgorOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCis7Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKKzsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCis7Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgorOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKKzsvLworOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQorOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCis7Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKKzsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMworOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Cis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKKzsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Cis7Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKKzsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQorOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Cis7Ly8KKzsvLyBOb3RlOgorOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCis7Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgorOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAorOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgorOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcworOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAorOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgorOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKKzsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgorOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCis7Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAorOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KKzsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQorOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQorOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKKzsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKKzsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKKzsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKKzsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKKzsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKKzsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCisKKzsvLyBBcmd1bWVudHMKKworcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKK1N0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCitwRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCitwU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCisKKyAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCisgICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKKyAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgorICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQorICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXRzOgorICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKKyAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKKyAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQorICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKKyAgICAgICAgTENMQSAgICBTSElGVAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCis7Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKKzsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKKzsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdworOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCis7Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgorOy8vCis7Ly8gcjEgIGEwMSAgICAgZzAgIGgwCis7Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAorOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKKzsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCis7Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMworOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKKzsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Cis7Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgorOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKKzsvLworcmEwMSAgICBSTiAxCityYjAxICAgIFJOIDQKK3JhMjMgICAgUk4gNQorcmIyMyAgICBSTiA2CityYTQ1ICAgIFJOIDcKK3JiNDUgICAgUk4gOAorcmE2NyAgICBSTiA5CityYjY3ICAgIFJOIDEwCitydG1wICAgIFJOIDExCitjc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQorTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KKzsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoreGZ0ICAgICBSTiByYTAxCit4ZjAgICAgIFJOIHJiMDEKK3hmMSAgICAgUk4gcmEyMworeGYyICAgICBSTiByYjIzCit4ZjMgICAgIFJOIHJhNDUKK3hmNCAgICAgUk4gcmI0NQoreGY1ICAgICBSTiByYTY3Cit4ZjYgICAgIFJOIHJiNjcKK3hmNyAgICAgUk4gcnRtcAorOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KK3hnMCAgICAgUk4geGZ0Cit4ZzEgICAgIFJOIHhmMAoreGcyICAgICBSTiB4ZjEKK3hnMyAgICAgUk4geGYyCit4Z3QgICAgIFJOIHhmMworeGc0ICAgICBSTiB4ZjQKK3hnNSAgICAgUk4geGY1Cit4ZzYgICAgIFJOIHhmNgoreGc3ICAgICBSTiB4ZjcKKzsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCit4aDAgICAgIFJOIHhnMAoreGgxICAgICBSTiB4ZzEKK3hodCAgICAgUk4geGcyCit4aDIgICAgIFJOIHhnMworeGgzICAgICBSTiB4Z3QKK3hoNCAgICAgUk4geGc0Cit4aDUgICAgIFJOIHhnNQoreGg2ICAgICBSTiB4ZzYKK3hoNyAgICAgUk4geGc3Cis7Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCit4aXQgICAgIFJOIHhoMAoreGkwICAgICBSTiB4aDEKK3hpMSAgICAgUk4geGh0Cit4aTIgICAgIFJOIHhoMgoreGkzICAgICBSTiB4aDMKK3hpNCAgICAgUk4geGg0Cit4aTUgICAgIFJOIHhoNQoreGk2ICAgICBSTiB4aDYKK3hpNyAgICAgUk4geGg3CisgICAgICAgIAorICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCisgICAgICAgIEVORElGCisgICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCisgICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKKyAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgorICAKK3Y2X2lkY3RfY29sJF9GCisgICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCisgICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKKyAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgMTIKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgSUYgIHtUUlVFfQorICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAorICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCisgICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcworICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgorICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICAKK3Y2T2RkWmVybyRfRgorICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIE1PViAgeGYzLCB4ZzMKKyAgICAgICAgTU9WICB4ZjQsIHhnMworICAgICAgICBNT1YgIHhmMiwgeGcyCisgICAgICAgIE1PViAgeGY1LCB4ZzIKKyAgICAgICAgTU9WICB4ZjEsIHhnMQorICAgICAgICBNT1YgIHhmNiwgeGcxCisgICAgICAgIE1PViAgeGYwLCB4ZzAKKyAgICAgICAgTU9WICB4ZjcsIHhnMAorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgCisgICAgICAgIAordjZfaWRjdF9yb3ckX0YKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKKyAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNworICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2CisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKKworICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKKyAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gU2F0dXJhdGUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCisgICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQorICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKKyAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCisgICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAorICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKKyAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2CisgICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAorICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKKyAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCisgICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMworICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKKyAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1CisgICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgorICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCisgICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCisgICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCisgICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2CisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKworICAgICAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKK1NyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAorU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCitTcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKK1NyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKK1NyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKK1NyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKK1NyYzYgICAgICAgICAgICBFUVUgIDEzCitTcmM3ICAgICAgICAgICAgRVFVICAxNAorVG1wICAgICAgICAgICAgIEVRVSAgMTUKKworcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAorcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2CitxWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKK3FYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgorcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2CitxWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKK3FYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgorcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2CitxWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgorCitkWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2CitkWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKK2RYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKK2RYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgorZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgorZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2CitkWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2CitkWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKK2RYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKK2RYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgorZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgorZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2CitkWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2CitkWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKK2RYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKK2RYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgorZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2CitkWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgorCitxWGkwICAgICAgICAgICAgUU4gcVhqMAorcVhpMSAgICAgICAgICAgIFFOIHFYajQKK3FYaTIgICAgICAgICAgICBRTiBxWGoyCitxWGkzICAgICAgICAgICAgUU4gcVhqNworcVhpNCAgICAgICAgICAgIFFOIHFYajUKK3FYaTUgICAgICAgICAgICBRTiBxWGp0CitxWGk2ICAgICAgICAgICAgUU4gcVhqMQorcVhpNyAgICAgICAgICAgIFFOIHFYajYKK3FYaXQgICAgICAgICAgICBRTiBxWGozCisKK2RYaTBsbyAgICAgICAgICBETiBkWGowbG8KK2RYaTBoaSAgICAgICAgICBETiBkWGowaGkKK2RYaTFsbyAgICAgICAgICBETiBkWGo0bG8KK2RYaTFoaSAgICAgICAgICBETiBkWGo0aGkKK2RYaTJsbyAgICAgICAgICBETiBkWGoybG8KK2RYaTJoaSAgICAgICAgICBETiBkWGoyaGkKK2RYaTNsbyAgICAgICAgICBETiBkWGo3bG8KK2RYaTNoaSAgICAgICAgICBETiBkWGo3aGkKK2RYaTRsbyAgICAgICAgICBETiBkWGo1bG8KK2RYaTRoaSAgICAgICAgICBETiBkWGo1aGkKK2RYaTVsbyAgICAgICAgICBETiBkWGp0bG8KK2RYaTVoaSAgICAgICAgICBETiBkWGp0aGkKK2RYaTZsbyAgICAgICAgICBETiBkWGoxbG8KK2RYaTZoaSAgICAgICAgICBETiBkWGoxaGkKK2RYaTdsbyAgICAgICAgICBETiBkWGo2bG8KK2RYaTdoaSAgICAgICAgICBETiBkWGo2aGkKK2RYaXRsbyAgICAgICAgICBETiBkWGozbG8KK2RYaXRoaSAgICAgICAgICBETiBkWGozaGkKKworcVhoMCAgICAgICAgICAgIFFOIHFYaXQKK3FYaDEgICAgICAgICAgICBRTiBxWGkwCitxWGgyICAgICAgICAgICAgUU4gcVhpMgorcVhoMyAgICAgICAgICAgIFFOIHFYaTMKK3FYaDQgICAgICAgICAgICBRTiBxWGk3CitxWGg1ICAgICAgICAgICAgUU4gcVhpNQorcVhoNiAgICAgICAgICAgIFFOIHFYaTQKK3FYaDcgICAgICAgICAgICBRTiBxWGkxCitxWGh0ICAgICAgICAgICAgUU4gcVhpNgorCitkWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCitkWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCitkWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCitkWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCitkWGgybG8gICAgICAgICAgRE4gZFhpMmxvCitkWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCitkWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCitkWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCitkWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCitkWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCitkWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCitkWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCitkWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCitkWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCitkWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCitkWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCitkWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCitkWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCisKK3FYZzAgICAgICAgICAgICBRTiBxWGgyCitxWGcxICAgICAgICAgICAgUU4gcVhodAorcVhnMiAgICAgICAgICAgIFFOIHFYaDEKK3FYZzMgICAgICAgICAgICBRTiBxWGgwCitxWGc0ICAgICAgICAgICAgUU4gcVhoNAorcVhnNSAgICAgICAgICAgIFFOIHFYaDUKK3FYZzYgICAgICAgICAgICBRTiBxWGg2CitxWGc3ICAgICAgICAgICAgUU4gcVhoNworcVhndCAgICAgICAgICAgIFFOIHFYaDMKKworcVhmMCAgICAgICAgICAgIFFOIHFYZzYKK3FYZjEgICAgICAgICAgICBRTiBxWGc1CitxWGYyICAgICAgICAgICAgUU4gcVhnNAorcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKK3FYZjQgICAgICAgICAgICBRTiBxWGczCitxWGY1ICAgICAgICAgICAgUU4gcVhnMgorcVhmNiAgICAgICAgICAgIFFOIHFYZzEKK3FYZjcgICAgICAgICAgICBRTiBxWGcwCitxWGZ0ICAgICAgICAgICAgUU4gcVhnNworCisKK3FYdDAgICAgICAgICAgICBRTiAxLlMzMgorcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCitxVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKK3FUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAorcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCitxVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKK3FTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcworcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCitxVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKK3FUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKKworCitTY2FsZTEgICAgICAgICAgRVFVIDYKK1NjYWxlMiAgICAgICAgICBFUVUgMTUKK3FTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKK3FTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKK2RTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCitkU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgorZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKK2RTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2CisKK2RDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19CitJbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1CitTICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1CitDICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1CisKK3BUZW1wICAgICAgICAgICBSTiAxMgorCisgICAgICAgICAgICAgICAgCisgICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKKyAgICAgICAgOy8vIElTdGFnZSA0CisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIElTdGFnZSAzCisgICAgICAgIFZRUkRNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWUVJETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQorICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0CisgICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2CisgICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNworICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKKyAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgorICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNworICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKK1hUUjAgICAgICAgICAgICBFUVUgU3JjNQorWFRSMSAgICAgICAgICAgIEVRVSBUbXAKK1hUUjIgICAgICAgICAgICBFUVUgU3JjNgorWFRSMyAgICAgICAgICAgIEVRVSBTcmM3CitYVFI0ICAgICAgICAgICAgRVFVIFNyYzMKK1hUUjUgICAgICAgICAgICBFUVUgU3JjMAorWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCitYVFI3ICAgICAgICAgICAgRVFVIFNyYzIKK1hUUnQgICAgICAgICAgICBFUVUgU3JjNAorICAgICAgICAgICAgICAgIAorcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCitxQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCitxQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCitxQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCitxQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCitxQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCitxQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCitxQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCisKK2RCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKK2RCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKK2RCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKK2RCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKK2RCNCAgICAgICAgICAgICBETiAgWFRSNCoyCitkQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgorZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKK2RCNyAgICAgICAgICAgICBETiAgWFRSNyoyCisKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQorICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCisgICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNworICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgorICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMworICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgorICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0CisgICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1CisgICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2CisgICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3CisgICAgICAgIAorCitxWWowICAgICAgICAgICAgUU4gcVhmMAorcVlqMSAgICAgICAgICAgIFFOIHFYZjEKK3FZajIgICAgICAgICAgICBRTiBxWGYyCitxWWozICAgICAgICAgICAgUU4gcVhmMworcVlqNCAgICAgICAgICAgIFFOIHFYZjQKK3FZajUgICAgICAgICAgICBRTiBxWGY1CitxWWo2ICAgICAgICAgICAgUU4gcVhmNgorcVlqNyAgICAgICAgICAgIFFOIHFYZjcKK3FZanQgICAgICAgICAgICBRTiBxWGZ0CisKK2RZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKK2RZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgorZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgorZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2CitkWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2CitkWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKK2RZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKK2RZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgorZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgorZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2CitkWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2CitkWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKK2RZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKK2RZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgorZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgorZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2CitkWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2CitkWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKKworcVlpMCAgICAgICAgICAgIFFOIHFZajAKK3FZaTEgICAgICAgICAgICBRTiBxWWo0CitxWWkyICAgICAgICAgICAgUU4gcVlqMgorcVlpMyAgICAgICAgICAgIFFOIHFZajcKK3FZaTQgICAgICAgICAgICBRTiBxWWo1CitxWWk1ICAgICAgICAgICAgUU4gcVlqdAorcVlpNiAgICAgICAgICAgIFFOIHFZajEKK3FZaTcgICAgICAgICAgICBRTiBxWWo2CitxWWl0ICAgICAgICAgICAgUU4gcVlqMworCitkWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCitkWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCitkWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCitkWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCitkWWkybG8gICAgICAgICAgRE4gZFlqMmxvCitkWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCitkWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCitkWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCitkWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCitkWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCitkWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCitkWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCitkWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCitkWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCitkWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCitkWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCitkWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCitkWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCisKK3FZaDAgICAgICAgICAgICBRTiBxWWl0CitxWWgxICAgICAgICAgICAgUU4gcVlpMAorcVloMiAgICAgICAgICAgIFFOIHFZaTIKK3FZaDMgICAgICAgICAgICBRTiBxWWkzCitxWWg0ICAgICAgICAgICAgUU4gcVlpNworcVloNSAgICAgICAgICAgIFFOIHFZaTUKK3FZaDYgICAgICAgICAgICBRTiBxWWk0CitxWWg3ICAgICAgICAgICAgUU4gcVlpMQorcVlodCAgICAgICAgICAgIFFOIHFZaTYKKworZFloMGxvICAgICAgICAgIEROIGRZaXRsbworZFloMGhpICAgICAgICAgIEROIGRZaXRoaQorZFloMWxvICAgICAgICAgIEROIGRZaTBsbworZFloMWhpICAgICAgICAgIEROIGRZaTBoaQorZFloMmxvICAgICAgICAgIEROIGRZaTJsbworZFloMmhpICAgICAgICAgIEROIGRZaTJoaQorZFloM2xvICAgICAgICAgIEROIGRZaTNsbworZFloM2hpICAgICAgICAgIEROIGRZaTNoaQorZFloNGxvICAgICAgICAgIEROIGRZaTdsbworZFloNGhpICAgICAgICAgIEROIGRZaTdoaQorZFloNWxvICAgICAgICAgIEROIGRZaTVsbworZFloNWhpICAgICAgICAgIEROIGRZaTVoaQorZFloNmxvICAgICAgICAgIEROIGRZaTRsbworZFloNmhpICAgICAgICAgIEROIGRZaTRoaQorZFloN2xvICAgICAgICAgIEROIGRZaTFsbworZFloN2hpICAgICAgICAgIEROIGRZaTFoaQorZFlodGxvICAgICAgICAgIEROIGRZaTZsbworZFlodGhpICAgICAgICAgIEROIGRZaTZoaQorCitxWWcwICAgICAgICAgICAgUU4gcVloMgorcVlnMSAgICAgICAgICAgIFFOIHFZaHQKK3FZZzIgICAgICAgICAgICBRTiBxWWgxCitxWWczICAgICAgICAgICAgUU4gcVloMAorcVlnNCAgICAgICAgICAgIFFOIHFZaDQKK3FZZzUgICAgICAgICAgICBRTiBxWWg1CitxWWc2ICAgICAgICAgICAgUU4gcVloNgorcVlnNyAgICAgICAgICAgIFFOIHFZaDcKK3FZZ3QgICAgICAgICAgICBRTiBxWWgzCisKK3FZZjAgICAgICAgICAgICBRTiBxWWc2CitxWWYxICAgICAgICAgICAgUU4gcVlnNQorcVlmMiAgICAgICAgICAgIFFOIHFZZzQKK3FZZjMgICAgICAgICAgICBRTiBxWWd0CitxWWY0ICAgICAgICAgICAgUU4gcVlnMworcVlmNSAgICAgICAgICAgIFFOIHFZZzIKK3FZZjYgICAgICAgICAgICBRTiBxWWcxCitxWWY3ICAgICAgICAgICAgUU4gcVlnMAorcVlmdCAgICAgICAgICAgIFFOIHFZZzcKKworICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgorICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3CisgICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgorICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKKworICAgICAgICBWUVJETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCisKKyAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKKyAgICAgICAgVlFSRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNworICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2CisgICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgorICAgICAgICAKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgorICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3CisgICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCisKK1lUUjAgICAgICAgICAgICBFUVUgU3JjMAorWVRSMSAgICAgICAgICAgIEVRVSBTcmM0CitZVFIyICAgICAgICAgICAgRVFVIFNyYzEKK1lUUjMgICAgICAgICAgICBFUVUgU3JjMgorWVRSNCAgICAgICAgICAgIEVRVSBTcmM3CitZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKK1lUUjYgICAgICAgICAgICBFUVUgVG1wCitZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKK1lUUnQgICAgICAgICAgICBFUVUgU3JjMworCitxQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQorcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgorcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgorcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgorcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgorcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgorcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgorcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgorCitkRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQorZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQorZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQorZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKK2RENSAgICAgICAgICAgICBETiAgWVRSNSoyCitkRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgorZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQorICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCisgICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNworICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgorICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMworICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgorICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0CisgICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1CisgICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2CisgICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3CisKKyAgICAgICAgCitkWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4CitkWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4CitkWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4CitkWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4CitkWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4CitkWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4CitkWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4CitkWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4CisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgorICAgICAgICA7Ly8KKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMworICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorCisKKworICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93CisgICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAorICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IEZsYWcKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdworICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93CisgICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCisgICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCisgICAgICAgIElGICIkTGFzdFJvdyI9IjAiCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgorICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKK3FTY2FsZTBsbyAgICAgICBRTiAwLlMzMgorcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCitxU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKK3FTY2FsZTFoaSAgICAgICBRTiAzLlMzMgorcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQorCitxU3JjMGxvICAgICAgICAgUU4gNC5TMzIKK3FTcmMwaGkgICAgICAgICBRTiA1LlMzMgorcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCitxU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKK3FTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKKworcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQorCisgICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAwCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAxICYgNworICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAyICYgNgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCisgICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIDsvLyBSb3cgNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGE5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5CisgKi8KKyAKKworCisjaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXworI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisgIAorLyogTWFzayB0YWJsZSAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U1YjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmMWZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQorOy8vCisKKzsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCisgSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAorIEdCTEwgQVJNQ09NTV9TX0gKKworICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50CisgICAgICAgIAorICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCitBUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9CisKKzsvLyBHbG9iYWxzCisKKyAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAorICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAorICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQorICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQorICAgICAgICAKKyAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKKyAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZworICAgICAgICAKKyAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCisgICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAorICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAorICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKKyAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCisgICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKKyAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgorICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0CisgICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgCitfSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9CitfU0J5dGVzICAgICAgICAgU0VUQSAgICAwCitfRiAgICAgICAgICAgICAgU0VUQSAgICAwCitfU3dOdW0gICAgICAgICAgU0VUQSAgICAwCitfMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKK18xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgorCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKKzsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKKzsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQorX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQorICAgICAgIEVMU0UKK19DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKKyAgICAgICBFTkRJRgorCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQworICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgorICAgICAgICBHQkxMICR2YXIKKyAgICAgICAgR0JMTCBfb2skdmFyCiskdmFyICAgIFNFVEwge0ZBTFNFfQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAorICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisgICAgICAgIDsvLyBjb3JlLgorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBfTV9WQVJJQU5UICR2MAorICAgICAgICBfTV9WQVJJQU5UICR2MQorICAgICAgICBfTV9WQVJJQU5UICR2MgorICAgICAgICBfTV9WQVJJQU5UICR2MworICAgICAgICBfTV9WQVJJQU5UICR2NAorICAgICAgICBfTV9WQVJJQU5UICR2NQorICAgICAgICBfTV9WQVJJQU5UICR2NgorICAgICAgICBfTV9WQVJJQU5UICR2NworICAgICAgICAKKyAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCisgICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0CitfVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAorICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKKyAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKKyAqCisgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6CisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKKyAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCisgKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKKyAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKKyAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCisgKiAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKKyAqIAorICovCisKKyAgCisjaWZuZGVmIF9hcm1PTVhfSF8KKyNkZWZpbmUgX2FybU9NWF9IXworCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KKyNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCisjZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCisKKy8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCisjZGVmaW5lIEJBUkVfU1VGRklYIAorCisKKworLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KKyNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCisjZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCisKKworCisKKy8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorCisKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQorCisjZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorCisjZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQorCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorCisKKyNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqCisgKiBGaWxlOiBvbXh0eXBlcy5oCisgKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKyAgCisjaWZuZGVmIF9PTVhUWVBFU19IXworI2RlZmluZSBfT01YVFlQRVNfSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAKKworI2RlZmluZSBPTVhfSU4KKyNkZWZpbmUgT01YX09VVAorI2RlZmluZSBPTVhfSU5PVVQKKworCit0eXBlZGVmIGVudW0geworICAgIAorICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCisgICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKKyAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKKyAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCisgICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLworICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAorICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAorCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KKworICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLworICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KKworICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAorCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KKworICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLworCisgICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLworICAgIAorIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KKworIAorLyogT01YX1U4ICovCisjaWYgVUNIQVJfTUFYID09IDB4ZmYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisjZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCisjZWxzZQorI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKKyNlbmRpZiAKKworIAorLyogT01YX1M4ICovCisjaWYgU0NIQVJfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKyNlbGlmIFNIUlRfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKKyNlbHNlCisjZXJyb3IgT01YX1M4IHVuZGVmaW5lZAorI2VuZGlmCisgCisgCisvKiBPTVhfVTE2ICovCisjaWYgVVNIUlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzE2ICovCisjaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7CisjZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VMzIgKi8KKyNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOworI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMzIgKi8KKyNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOworI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTY0ICYgT01YX1M2NCAqLworI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQorICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQorI2Vsc2UKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKKyNlbmRpZgorCisKKy8qIE9NWF9TQzggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMzIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0M2NCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9GMzIgKi8KK3R5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfRjY0ICovCit0eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9JTlQgKi8KK3R5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KKworCisjZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCisjZGVmaW5lIE9NWF9NSU5fVTggIAkJMAorI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQorI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKKyNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgT01YX01JTl9VMzIJCQkwCisKKyNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCisjZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQorI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKKyNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQorI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQorCit0eXBlZGVmIHZvaWQgT01YVm9pZDsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAorICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCisgICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKKyAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCisJT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLworfU9NWFJlY3Q7CisKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCisgT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCisJCit9IE9NWFBvaW50OworCisKKy8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCisgT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCisJCit9IE9NWFNpemU7CisKKyNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNGI2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oCkBAIC0wLDAgKzEsNzcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKK09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCitPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAorT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCitPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKK09NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKK09NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKK09NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCitPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCisKKzsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCitPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCisKK09NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCitPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCitPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKKworT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCisKK09NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAorCitPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgorCisKKworT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQorT01YX01JTl9VOCAgCUVRVSAgICAgCTAKK09NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKK09NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCisKKworT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKK09NWF9NSU5fVTMyCQlFUVUJMAorCitPTVhfTUFYX1M4CQlFUVUJKDEyNykKK09NWF9NQVhfVTgJCUVRVQkoMjU1KQorT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCitPTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCitPTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQorT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKKworT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCitPTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCitPTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKKworTlVMTCAgICBFUVUgMAorCis7Ly8gU3RydWN0dXJlcworCisgICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKKworICAgIE1fU1RSVUNUICAgIE9NWFBvaW50CisgICAgTV9GSUVMRCAgICAgeCwgNAorICAgIE1fRklFTEQgICAgIHksIDQKKyAgICBNX0VORFNUUlVDVAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhZTcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKQEAgLTAsMCArMSwxMTEgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyAKKyMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKKyMgT3Blbk1BWCBETDogdjEuMC4yCisjIFJldmlzaW9uOiAgIDk2NDEKKyMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TIC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TJzsKKyMgJExJQiAgICAgID0gJ2FybWxpbmsnOworIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKKyMgJExJQl9UWVBFID0gJy5vJzsKKyRMSUIgICAgICA9ICdhcm1hcic7CiskTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOworJExJQl9UWVBFID0gJy5hJzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgorQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7CitAZmlsZWxpc3QgPSA8RklMRVM+OworY2xvc2UoRklMRVMpOworCisjIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKK2ZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQoreworICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Cit9CisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKKworIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQorbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOworbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOworCiskb2JqbGlzdCA9ICcnOworCisjIENvbXBpbGUgZWFjaCBmaWxlCitmb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCit7CisJbXkgJGY7CisJbXkgJGJhc2U7CisJbXkgJGV4dDsKKwlteSAkb2JqZmlsZTsKKworCWNob21wKCRmaWxlKTsKKwkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7CisKKwkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTYyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzQgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTcyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAorICoKKyAqLworCitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisKK09NWF9JTlQgYXJtU2lnbkNoZWNrICgKKyAgICBPTVhfUzE2IHZhcgorKQorCit7CisgICAgT01YX0lOVCBTaWduOworICAgIAorICAgIGlmICh2YXIgPCAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICggdmFyID4gMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaWduID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFNpZ247Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgIE9NWF9JTlQgbWluLAorICAgIE9NWF9JTlQgbWF4LCAKKyAgICBPTVhfUzMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgT01YX0YzMiBtaW4sCisgICAgT01YX0YzMiBtYXgsIAorICAgIE9NWF9GMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKK3sKKyAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOworICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOworICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKKyAgICBPTVhfVTMyIHZJbnQ7CisgICAgT01YX1UzMiB2SW50U2F0OworICAgIAorICAgIGlmKHYgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7CisgICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOworICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKKyAgICB2SW50U2F0ID0gdkludDsKKyAgICBpZih2SW50U2F0ID4gbWF4VikgCisgICAgICAgIHZJbnRTYXQgPSBtYXhWOworICAgIHJldHVybiB2SW50U2F0OworfQorCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oCisgICAgICAgIE9NWF9VOCAqcEJ1ZjEsCisgICAgICAgIE9NWF9VOCAqcEJ1ZjIsCisgICAgICAgIE9NWF9JTlQgZWxlbVNpemUKKyAgICAgICApCit7CisgICAgT01YX0lOVCBpOworICAgIE9NWF9VOCB0ZW1wOworICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKKyAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOworICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCispCit7CisgICAgT01YX1MzMiBhLCBiLCBjOworICAgIAorICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7CisgICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKKyAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCispCit7CisgICAgT01YX1U4IGk7ICAgIAorICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCisgICAgeworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKK3sKKyAgICBPTVhfUzY0IFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQorICAgIHsKKyAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOworICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOworCisgICAgcmV0dXJuIFJlc3VsdDsgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKK3sKKyAgICAKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAorCisgICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKKyAgICB9CisgICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKKyAgICB9CisKKyAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOworICAgIAorICAgIHJldHVybiBtYWM7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCit7CisgICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKKworICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OworICAgIH0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICogICAgIAorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTIsbG8xOworICAgIE9NWF9VMTYgbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7CisgICAgT01YX1MzMiByZXN1bHQ7CisgICAgCisgICAgbG8xICA9IGlucHV0MTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSBoaTIgKiBsbzE7CisgICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMSxoaTI7CisgICAgT01YX1UxNiBsbzEsbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7CisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7CisgICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9ICAgaGkxICogaGkyOworICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OworICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQoreworICAgIE9NWF9GNjQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID49IDApCisgICAgeworICAgICAgICByZXN1bHQgKz0gMC41OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgLT0gMC41OworICAgIH0KKworICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAKKyAgICBpZihOID09IDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKK3sKKyAgICBpZigqcE9mZnNldCA+IDApCisgICAgeworICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKKyAgICAgICAgKnBPZmZzZXQgPSAwOworICAgIH0gICAgCit9CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKK3sKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgIAorICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisjaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKykKK3sgICAgCisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICBPTVhfSU5UIEluZGV4OworICAgICAgICAKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAorICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCisgICAgeworICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKKyAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKKyAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHBDb2RlQm9vaysrOworICAgIH0KKworICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KKyAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKykKK3sKKyAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAgICAgCisgICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCisgICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7CisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOworICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOworCisgICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCisgICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCisgICAgeworICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKKyAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOworICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7CisgICAgfQorCisgICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLworICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7CisgICAgCisgICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKykKK3sKKyAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKK30KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0Njc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MWRiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCisKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAorfTsKKworY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKK3sKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKQEAgLTAsMCArMSwxMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtVmlkZW8uaAorICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCisgKgorICovCisKKworI2lmbmRlZiBfYXJtVmlkZW9fSF8KKyNkZWZpbmUgX2FybVZpZGVvX0hfCisKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgorICovCisgCitzdHJ1Y3QgbTRwMl9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Cit9OworCitzdHJ1Y3QgbTRwMTBfTUVTcGVjCit7CisgICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKK3R5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKKyAqIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKKyAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLAorICAgIE9NWF9TMTYgbXZZLAorICAgIE9NWF9JTlQgY2FuZFNBRCwKKyAgICBPTVhfUzE2IGJlc3RNVlgsCisgICAgT01YX1MxNiBiZXN0TVZZLAorICAgIE9NWF9JTlQgYmVzdFNBRCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCisgICAgIE9NWF9VOCBmbGFnLAorICAgICBPTVhfSU5UICpwU3VtRXJyCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KKyAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIE9NWF9VOCBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCisgICAgIE9NWF9VOCAgc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCisgKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAorICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAorICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCisgKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKKyAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAorICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAorICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKKyAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisgICAgT01YX1UzMiBzdG9yZVJ1biwKKyAgICBPTVhfUzE2ICogcERzdCwKKyAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCisgICAgT01YX1U4ICBzaWduLAorICAgIE9NWF9VOCAgbGFzdCwKKyAgICBPTVhfVTggICogaW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKKyAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKKworT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIAorICogUmV0dXJuIFZhbHVlOgorICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKKyAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAorICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCisgKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCisgKgorICovCisKK09NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICBPTVhfVTMyIHJ1biwKKyAgICAgT01YX1UzMiBydW5QbHVzLAorICAgICBPTVhfUzE2IGxldmVsLAorICAgICBPTVhfUzE2IGxldmVsUGx1cywKKyAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKKyAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKKyk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCisgKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCisgKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCisgKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAorICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKKyAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCisgKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQorICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAorICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCisgKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jaworICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCisgICAgIE9NWF9VOCAqIHBUcmFuc3AKKyk7CisKKy8qIAorICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAorICovCisvKiBEZWZpbmVzICovCisjZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQorCisKKy8qIERlcXVhbnQgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKKworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgblRhYmxlLAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucworICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCisJCU9NWF9VMzIgCWlTcmNTdGVwLCAKKwkJT01YX1U4KiAJcERzdCwgCisJCU9NWF9VMzIgCWlEc3RTdGVwLCAKKwkJT01YX1UzMiAJaVdpZHRoLCAKKwkJT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCisJIGNvbnN0IE9NWF9VOCogCXBTcmMsIAorCSBPTVhfVTMyIAlpU3JjU3RlcCwgCisgCSBPTVhfVTgqIAlwRHN0LAorIAkgT01YX1UzMiAJaURzdFN0ZXAsIAorIAkgT01YX1UzMiAJaVdpZHRoLCAKKyAJIE9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAorICAgICAgICBPTVhfVTggICAgICAqcFNyYywKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgICAgICBPTVhfVTMyICAgICBkeCwKKyAgICAgICAgT01YX1UzMiAgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAorICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKKyAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCisgKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAorICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAorICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKKyAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAorICAgICBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiAqcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX1MxNiogcERDLAorICAgICBpbnQgQUMKKyk7CisKKyNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGE5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKQEAgLTAsMCArMSw3MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgobBhobEgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1ggIEVRVSAxOwkvKiogY2FzZSChsGKhsSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIKGwY6GxICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgobBkobEgKi8KKzt9CisKKztlbnVtIHsKK09NWF9VUFBFUiAgCQkJCUVRVSAxOwkJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTEVGVCAgIAkJCQlFUVUgMjsJCQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJCQkvKiogQWxwaGEgY29tcG9uZW50ICovCis7fQorCis7ZW51bSB7CitPTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK09NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KK09NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworO30KKworO2VudW0geworT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKzt0eXBlZGVmCXN0cnVjdCB7CQoreAlFUVUJMDsKK3kJRVFVCTQ7Cis7fU9NWENvb3JkaW5hdGU7CisKKzt0eXBlZGVmIHN0cnVjdCB7CitkeAlFUVUJMDsKK2R5CUVRVQkyOworO31PTVhNb3Rpb25WZWN0b3I7CisKKzt0eXBlZGVmIHN0cnVjdCB7Cit4eAkJRVFVCTA7Cit5eQkJRVFVCTQ7Cit3aWR0aAlFUVUJODsKK2hlaWdodAlFUVUJMTI7Cis7fU9NWGlSZWN0OworCis7dHlwZWRlZiBlbnVtIHsKK09NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCis7fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworO2VudW0geworT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKK09NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCitPTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKKzt9OworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjNhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKQEAgLTAsMCArMSwxNDggQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMTQKK1gwICAgICAgUk4gMgorWDEgICAgICBSTiA0CisKK1JldHVybiAgUk4gMAorICAgICAKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2LHI1CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgIENvdW50LHN0ZXAsIzggICAgICAgICAgICAgICAgIDsvL0NvdW50PXN0ZXAtOAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggICAgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjKzgKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50ICAgICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIHBTcmM9cFNyYytzdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzODczYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MiBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyYyAgICBSTiAwICAgICAgICAKK3BEc3QgICAgUk4gMSAgICAgICAgCitzdGVwICAgIFJOIDIKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgIFJOIDE0CitYMCAgICAgIFJOIDIKK1gxICAgICAgUk4gNAorUmV0dXJuICBSTiAwCisgICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgscjUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgQ291bnQsc3RlcCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcCAKKyAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyA6IHBTcmM9cFNyYytzdGVwCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjRiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMTg5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgCisKKworCisgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCisKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCityZXN1bHQgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworaVBsYW5lU3RlcCAgICAgIFJOICA0CitwVG9wICAgICAgICAgICAgUk4gIDUKK3BCb3R0b20gICAgICAgICBSTiAgNgorcEJvdHRvbUluZGV4ICAgIFJOICA3Cit4ICAgICAgICAgICAgICAgUk4gIDgKK3kgICAgICAgICAgICAgICBSTiAgOQordGVtcFRvcCAgICAgICAgIFJOICAxMAordGVtcEJvdCAgICAgICAgIFJOICAxMQorQ29sU3RlcCAgICAgICAgIFJOICAxMgorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BSaWdodEluZGV4ICAgICBSTiAgNwordGVtcExlZnQxICAgICAgIFJOICAxMAordGVtcFJpZ2h0MSAgICAgIFJOICAxMQordGVtcExlZnQyICAgICAgIFJOICAxNAordGVtcFJpZ2h0MiAgICAgIFJOICAyCitpbmRleFkgICAgICAgICAgUk4gIDE0CitSb3dTdGVwICAgICAgICAgUk4gIDEyCitleHBhbmRUbzRieXRlcyAgUk4gIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvcHkgYSBieXRlIHRvIDQgYnl0ZXMgb2YgYSB3b3JkCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBpUGxhbmVTdGVwT25TdGFjaywgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICBpUGxhbmVTdGVwLCBpUGxhbmVTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTVVMICAgICBwVG9wLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAKKyAgICAgICAgTUxBICAgICBwQm90dG9tLGlGcmFtZUhlaWdodCxpUGxhbmVTdGVwLHBTcmNEc3RQbGFuZQorICAgICAgICBTVUIgICAgIHgsaUZyYW1lV2lkdGgsIzQKKyAgICAgICAgTU9WICAgICBpbmRleFkscFRvcAorICAgICAgICBBREQgICAgIENvbFN0ZXAsaW5kZXhZLCM0CisgICAgICAgIFNVQiAgICAgcEJvdHRvbUluZGV4LHBCb3R0b20saVBsYW5lU3RlcAorICAgICAgICBTVUIgICAgIHBUb3AscFNyY0RzdFBsYW5lLHBUb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUb3AscFRvcCx4CisgICAgICAgIEFERCAgICAgcEJvdHRvbSxwQm90dG9tLHgKKworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBmb2xsb3dpbmcgaW1wcm92ZXMgdXBvbiB0aGUgQyBpbXBsbWVudGF0aW9uCisgICAgICAgIDsvLyBUaGUgeCBhbmQgeSBsb29wcyBhcmUgaW50ZXJjaGFuZ2VkOiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmFsdWVzIG9mCisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgW3hdIGFuZCBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XSAKKyAgICAgICAgOy8vIHdoaWNoIGRlcGVuZCBvbmx5IG9uIGxvb3AgdmFyaWFibGUgJ3gnIGFyZSBsb2FkZWQgb25jZSBhbmQgdXNlZCBpbiAKKyAgICAgICAgOy8vIG11bHRpcGxlIHN0b3JlcyBpbiB0aGUgJ1knIGxvb3AKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgOy8vIHhsb29wCitFeHBhbmRGcmFtZVRvcEJvdFhsb29wCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHRlbXBUb3AsW3BTcmNEc3RQbGFuZSx4XQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIGlzIHNpbXBsaWZpZWQgYXM6CisgICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCkgLSBpUGxhbmVTdGVwICsgeCA9PQorICAgICAgICA7Ly8gcEJvdHRvbSAtIGlQbGFuZVN0ZXAgKyB4ID09IHBCb3R0b21JbmRleCBbeF0KKyAgICAgICAgOy8vIFRoZSB2YWx1ZSBvZiBwQm90dG9tSW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSB0aGlzICd4JyBsb29wCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIHRlbXBCb3QsW3BCb3R0b21JbmRleCx4XQorICAgICAgICAKKyAgICAgICAgOy8vIHlsb29wCisgICAgICAgIE1PViAgICAgeSxpRXhwYW5kUGVscworCitFeHBhbmRGcmFtZVRvcEJvdFlsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB5LHksIzEKKyAgICAgICAgTV9TVFIgICB0ZW1wVG9wLFtwVG9wXSxpUGxhbmVTdGVwCisgICAgICAgIE1fU1RSICAgdGVtcEJvdCxbcEJvdHRvbV0saVBsYW5lU3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lVG9wQm90WWxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeCx4LCM0CisgICAgICAgIFNVQiAgICAgcFRvcCxwVG9wLENvbFN0ZXAKKyAgICAgICAgU1VCICAgICBwQm90dG9tLHBCb3R0b20sQ29sU3RlcAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lVG9wQm90WGxvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geSBsb29wCisgICAgICAgIDsvLyBUaGUgcHJvZHVjdCBpcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYWJvdmUgOiBSZXVzZQorICAgICAgICA7Ly9NVUwgICAgIGluZGV4WSxpRXhwYW5kUGVscyxpUGxhbmVTdGVwICAgICAgCisgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjRHN0UGxhbmUscFNyY0RzdFBsYW5lLGluZGV4WQorICAgICAgICBTVUIgICAgIHBMZWZ0LHBTcmNEc3RQbGFuZSxpRXhwYW5kUGVscyAgICAgICAgICAgICAgICAgIDsvLyBwTGVmdC0+cG9pbnRzIHRvIHRoZSB0b3AgbGVmdCBvZiB0aGUgZXhwYW5kZWQgYmxvY2sKKyAgICAgICAgQUREICAgICBwUmlnaHQscFNyY0RzdFBsYW5lLGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgcFJpZ2h0SW5kZXgscFJpZ2h0LCMxIAorICAgICAgICAKKyAgICAgICAgQUREICAgICB5LGlGcmFtZUhlaWdodCxpRXhwYW5kUGVscyxMU0wgIzEKKyAgICAgICAgTERSICAgICBleHBhbmRUbzRieXRlcyw9MHgwMTAxMDEwMQorICAgICAgICAKKyAgICAgICAgUlNCICAgICBSb3dTdGVwLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAsTFNMICMxCisKKyAgICAgICAgOy8vIFRoZSBZIExvb3AgaXMgdW5yb2xsZWQgdHdpY2UKK0V4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AgIAorICAgICAgICBMRFJCICAgIHRlbXBMZWZ0MixbcFNyY0RzdFBsYW5lLGlQbGFuZVN0ZXBdICAgICAgICAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTERSQiAgICB0ZW1wUmlnaHQyLFtwUmlnaHRJbmRleCxpUGxhbmVTdGVwXQorICAgICAgICBNX0xEUkIgIHRlbXBMZWZ0MSxbcFNyY0RzdFBsYW5lXSxpUGxhbmVTdGVwLExTTCAjMSAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKKyAgICAgICAgTV9MRFJCICB0ZW1wUmlnaHQxLFtwUmlnaHRJbmRleF0saVBsYW5lU3RlcCxMU0wgIzEKKyAgICAgICAgICAgICAgCisgICAgICAgIFNVQiAgICAgeCxpRXhwYW5kUGVscywjNAorICAgICAgICBNVUwgICAgIHRlbXBMZWZ0Mix0ZW1wTGVmdDIsZXhwYW5kVG80Ynl0ZXMgICAgICAgICAgICAgIDsvLyBDb3B5IHRoZSBzaW5nbGUgYnl0ZSB0byA0IGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcFJpZ2h0Mix0ZW1wUmlnaHQyLGV4cGFuZFRvNGJ5dGVzCisgICAgICAgIE1VTCAgICAgdGVtcExlZnQxLHRlbXBMZWZ0MSxleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKKyAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQxLHRlbXBSaWdodDEsZXhwYW5kVG80Ynl0ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8geCBsb29wCitFeHBhbmRGcmFtZUxlZnRSaWdodFhsb29wICAgICAgICAKKyAgICAgICAgU1VCUyAgICB4LHgsIzQKKyAgICAgICAgU1RSICAgICB0ZW1wTGVmdDIsW3BMZWZ0LGlQbGFuZVN0ZXBdICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSA0IGJ5dGVzIGF0IG9uZSBnbworICAgICAgICBTVFIgICAgIHRlbXBSaWdodDIsW3BSaWdodCxpUGxhbmVTdGVwXQorICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MSxbcExlZnRdLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCisgICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MSxbcFJpZ2h0XSwjNAorICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgeSx5LCMyCisgICAgICAgIEFERCAgICAgcExlZnQscExlZnQsUm93U3RlcAorICAgICAgICBBREQgICAgIHBSaWdodCxwUmlnaHQsUm93U3RlcAorICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAKK0VuZCAgICAgICAgICAgICAKKyAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MGYyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcworICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07CitleHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKzsvLyBGdW5jdGlvbnM6Cis7Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAorOy8vCis7Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgorOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCis7Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCis7Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwUHJlZDAgICAgICAgICAgUk4gMAoraVByZWRTdGVwMCAgICAgIFJOIDEKK3BQcmVkMSAgICAgICAgICBSTiAyCitpUHJlZFN0ZXAxICAgICAgUk4gMworcERzdFByZWQgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lQcmVkQTAgICAgICAgICBSTiAxMAoraVByZWRBMSAgICAgICAgIFJOIDExCitpUHJlZEIwICAgICAgICAgUk4gMTIKK2lQcmVkQjEgICAgICAgICBSTiAxNAorVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitSZXN1bHRBICAgICAgICAgUk4gNQorUmVzdWx0QiAgICAgICAgIFJOIDQKK3IweDgwODA4MDgwICAgICBSTiA3CisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMAorICAgICAgICBNX0VORAorCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQyCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDMKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZlNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JjZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICAgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIzN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzNjYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiAgQVJNMTEzNkpTCisKK01BU0tfMSAgRVFVIDB4MDEwMTAxMDEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BRMCAgICAgICAgUk4gMAorU3RlcEFyZyAgICBSTiAxCit0QzBBcmcgICAgIFJOIDIKK2FscGhhICAgICAgUk4gNgorCitiZXRhICAgICAgIFJOIDE0CitiUyAgICAgICAgIFJOIDE0Cit0QzAgICAgICAgIFJOIDE0CitwdEMwICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgIFJOIDMgCitwXzEgICAgIFJOIDUgIAorcF8yICAgICBSTiA0ICAKK3BfMyAgICAgUk4gMiAgCitxXzAgICAgIFJOIDggIAorcV8xICAgICBSTiA5ICAKK3FfMiAgICAgUk4gMTAgCitxXzMgICAgIFJOIDEyIAorCisKKzsvLyBGaWx0ZXJpbmcKKworYXAwcTAgICBSTiAxICAKK2ZpbHQgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgUk4gNworbTAxICAgICBSTiAxMQorCithcGZsZyAgIFJOIDAgCithcWZsZyAgIFJOIDYKKwordEMgICAgICBSTiAxCisKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKworcG9zICAgICBSTiA3CituZWcgICAgIFJOIDEyCisKK1AwYSAgICAgUk4gMSAgIAorUDFhICAgICBSTiA4ICAgCitRMGEgICAgIFJOIDcgIAorUTFhICAgICBSTiA0ICAgCisKK3UxICAgICAgUk4gMyAgIAorbWF4ICAgICBSTiAxMgorbWluICAgICBSTiAyICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKK3FfM2IgICAgUk4gOSAgIAorcF8zYiAgICBSTiAwCithcHFmbGcgIFJOIDEyCisKK1AwYiAgICAgUk4gNgorUDFiICAgICBSTiA3IAorUDJiICAgICBSTiAxCisKK1EwYiAgICAgUk4gOSAKK1ExYiAgICAgUk4gMCAKK1EyYiAgICAgUk4gMgorCis7Ly8gTWlzY2VsbGFub3VzCisKK2EgICAgICAgUk4gMAordDAgICAgICBSTiAzIAordDEgICAgICBSTiAxMgordDIgICAgICBSTiA3Cit0MyAgICAgIFJOIDExCit0NCAgICAgIFJOIDQgICAKK3Q1ICAgICAgUk4gMSAgIAordDggICAgICBSTiA2ICAgCit0OSAgICAgIFJOIDE0ICAKK3QxMCAgICAgUk4gNSAgIAordDExICAgICBSTiA5ICAgCisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlKCkKKzsvLworOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCis7Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZywgNiAtIGFxZmxnCis7Ly8gICAgICAgIC0gMTEgLSBtMDEsIDcgLSB0QzAKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSAxLDgsNywxMSAtIE91dHB1dCBQaXhlbHMoUDBhLFAxYSxRMGEsUTFhKQorOy8vCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUsIGxyCisKKyAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93CisgICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAorICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNworICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNworCisgICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIE1VTCAgICAgdEMwLCB0MiwgbTAxCisgICAgICAgIAorICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKworICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMAorICAgICAgICBBTkQgICAgIHQyLCB0MiwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVSFNVQjggIHQ1LCBwXzAsIHFfMAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE1PViAgICAgbTAwLCAjMAorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQorICAgICAgICAKKyAgICAgICAgOy8vIHRDID0gdEMwCisgICAgICAgIDsvLyBpZiAoYXAgPCBiZXRhKSB0QysrOworICAgICAgICA7Ly8gaWYgKGFxIDwgYmV0YSkgdEMrKzsKKyAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCisgICAgICAgIFNFTCAgICAgdEMwLCB0QzAsIG0wMAorICAgICAgICBVUUFERDggIHRDLCB0QzAsIGFwZmxnCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIGFxZmxnCisKKyAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICAKKyAgICAgICAgOy8vUmVsb2FkIG0wMQorICAgICAgICBMRFIgICAgIG0wMSw9TUFTS18xCisKKyAgICAgICAgVVFBREQ4ICBQMGEsIHBfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUTBhLCBxXzAsIHBvcworICAgICAgICBVUVNVQjggIFAwYSwgUDBhLCBuZWcKKyAgICAgICAgVVFBREQ4ICBRMGEsIFEwYSwgbmVnCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAorICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCisgICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKKyAgICAgICAgU0VMICAgICBQMGEsIFAwYSwgcF8wCisgICAgICAgIFNFTCAgICAgUTBhLCBRMGEsIHFfMAorICAgIAorICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICA7Ly8gdTEgPSAocDAgKyBxMCArIDEpPj4xCisgICAgICAgIDsvLyB1MSA9ICggKHFfMCAtIHBfMCcpPj4xICkgXiAweDgwCisgICAgICAgIE1WTiAgICAgcF8wLCBwXzAKKyAgICAgICAgVUhTVUI4ICB1MSwgcV8wLCBwXzAgCisgICAgICAgIFVRQUREOCAgbWF4LCBwXzEsIHRDMAorICAgICAgICBFT1IgICAgIHUxLCB1MSwgbTAxICxMU0wgIzcKKyAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBID0gKHAyK3UxKT4+MSAKKyAgICAgICAgOy8vIFRoZW4gZGVsdGEgPSBDbGlwMyggLXRDMCwgdEMwLCBBIC0gcDEpCisKKyAgICAgICAgOy8vIENsaXAgUDEKKyAgICAgICAgVUhBREQ4ICBQMWEsIHBfMiwgdTEKKyAgICAgICAgVVFTVUI4ICBtaW4sIHBfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWF4CisgICAgICAgIFNFTCAgICAgUDFhLCBtYXgsIFAxYQorICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1pbgorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBtaW4KKworICAgICAgICA7Ly8gQ2xpcCBRMQorICAgICAgICBVSEFERDggIFExYSwgcV8yLCB1MQorICAgICAgICBVUUFERDggIG1heCwgcV8xLCB0QzAKKyAgICAgICAgVVFTVUI4ICBtaW4sIHFfMSwgdEMwCisgICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWF4CisgICAgICAgIFNFTCAgICAgUTFhLCBtYXgsIFExYQorICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1pbgorICAgICAgICBTRUwgICAgIFExYSwgUTFhLCBtaW4KKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MCwgYXBmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBwXzEKKyAgICAgICAgVVNVQjggICB0MCwgYXFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIHQzLCBRMWEsIHFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKKzsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLGFxZmxnCis7Ly8gICAgICAgIC0gMSAtIGFwMHEwLCA2IC0gYWxwaGEKKzsvLyAgICAgICAgLSA3IC0gbTAwLCAxMSAtIG0wMQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIDYsNywxLDksMCwyIC0gT3V0cHV0IFBpeGVscyhQMGIsUDFiLFAyYiwgUTBiLFExYixRMmIpCis7Ly8gCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0CisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlLCBscgorICAgIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcGZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorICAgICAgICA7Ly8gYXBmbGcgPSBhcWZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAorCisgICAgICAgIE1fQVJHICAgcER1bW15LDQKKyAgICAgICAgTV9BUkcgICBwUV8zLDQKKyAgICAgICAgTV9BUkcgICBwUF8zLDQKKyAgICAgICAgCisgICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgOy8vdDkgPSBkcDJwMAorICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCisgICAgICAgIEFERCAgICAgYWxwaGEsIGFscGhhLCBtMDEsIExTTCAjMSAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYXAwcTAsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGFwcWZsZywgbTAwLCBhcGZsZworCisgICAgICAgIDsvLyBQMCA9IChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMgCisgICAgICAgIDsvLyAgICA9ICgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSArIDMqKHEwLXAwKSArIDgqcDAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MykKKworICAgICAgICA7Ly8gUDEgPSAocDIgKyBwMSArIHEwICsgcDAgKyAyKT4+MgorICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgMik+PjIpCisgICAgICAgIAorICAgICAgICA7Ly8gUDIgPSAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSAoMioocDMtcDApICsgMyoocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyA4KnAwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMy1wMCkgKyAocDItcDApICsgdDIgKyAyKT4+MikKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAgICAgICAgICAKKyAgICAgICAgU1NVQjggICB0NSwgdDksIHQyICAgICAgICAgICAKKworICAgICAgICBVU1VCOCAgIHQ4LCBxXzEsIHFfMCAgICAgICAgIAorICAgICAgICBTSEFERDggIHQ4LCB0NSwgdDgKKworICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMCAgICAgICAgIAorICAgICAgICBTQUREOCAgIHQ4LCB0OCwgdDkKKyAgICAgICAgU0hTVUI4ICB0OCwgdDgsIHQyCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQorICAgICAgICBTSEFERDggIHQ4LCB0OCwgbTAxCisgICAgICAgIFNIQUREOCAgdDksIHQ1LCBtMDEKKyAgICAgICAgU0FERDggICBQMGIsIHBfMCwgdDggICAgICAgICAKKyAgICAgICAgOy8vIFAwYiByZWFkeQorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUDFiCisgICAgICAgIE1fTERSICAgcF8zYiwgcFBfMworICAgICAgICBTQUREOCAgIFAxYiwgcF8wLCB0OSAgICAgICAgIAorICAgICAgICA7Ly8gUDFiIHJlYWR5CisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBQMmIKKyAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgICAgICAKKyAgICAgICAgU0FERDggICB0NSwgdDUsIHQ5CisgICAgICAgIFVIU1VCOCAgdDksIHBfM2IsIHBfMCAgICAgICAgCisgICAgICAgIEVPUiAgICAgYSwgcF8zYiwgcF8wICAgICAgICAgCisgICAgICAgIEFORCAgICAgYSwgYSwgbTAxCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCBhCisgICAgICAgIFVIQUREOCAgYSwgcF8wLCBxXzEKKyAgICAgICAgU0FERDggICB0NSwgdDUsIG0wMQorICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKKyAgICAgICAgTVZOICAgICB0OSwgcF8xCisgICAgICAgIFNBREQ4ICAgUDJiLCBwXzAsIHQ1ICAgICAgICAgCisgICAgICAgIDsvLyBQMmIgcmVhZHkKKyAgICAgICAgCisgICAgICAgIFVIU1VCOCAgYSwgYSwgdDkKKyAgICAgICAgT1JSICAgICB0OSwgYXBxZmxnLCBtMDEKKyAgICAgICAgVVNVQjggICB0OSwgYXBxZmxnLCB0OQorCisgICAgICAgIEVPUiAgICAgYSwgYSwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgYQorICAgICAgICBTRUwgICAgIFAxYiwgUDFiLCBwXzEKKyAgICAgICAgU0VMICAgICBQMmIsIFAyYiwgcF8yCisKKyAgICAgICAgVVNVQjggICB0NCwgZmlsdCwgbTAxCisgICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIHBfMAorCisgICAgICAgIAorICAgICAgICA7Ly8gUTAgPSAocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zIAorICAgICAgICA7Ly8gICAgPSAoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA4KnEwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgNCk+PjMpCisKKyAgICAgICAgOy8vIFExID0gKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIKKyAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDIpPj4yKQorCisgICAgICAgIDsvLyBRMiA9ICgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9ICgyKihxMy1xMCkgKyAzKihxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDgqcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEzLXEwKSArIChxMi1xMCkgKyB0MiArIDIpPj4yKQorCisKKyAgICAgICAgOy8vIENvbXB1dGUgUTBiIFExYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMCAgICAgICAgICAgCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBxXzAKKyAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAKKyAgICAgICAgU0FERDggICB0MCwgdDQsIGEKKyAgICAgICAgU0hBREQ4ICB0OSwgdDAsIHQ5CisgICAgICAgIFVIQUREOCAgdDEwLCBxXzAsIHBfMQorICAgICAgICBTQUREOCAgIHQ5LCB0OSwgYQorICAgICAgICBVU1VCOCAgIGEsIHFfMSwgcV8wCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBhCisgICAgICAgIFNIQUREOCAgdDAsIHQwLCBhCisgICAgICAgIFNIQUREOCAgdDksIHQ5LCBtMDEKKyAgICAgICAgU0hBREQ4ICBhLCB0MCwgbTAxCisgICAgICAgIFNBREQ4ICAgdDksIHFfMCwgdDkgICAgICAgICAgICAKKyAgICAgICAgOy8vIFEwYiByZWFkeSAtIHQ5CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHQ0LCAjMAorICAgICAgICBVSEFERDggIGFwcWZsZywgYXBxZmxnLCB0NAorICAgICAgICAKKyAgICAgICAgU0FERDggICBRMWIsIHFfMCwgYSAKKyAgICAgICAgOy8vIFExYiByZWFkeQorICAgICAgIAorICAgICAgICBVU1VCOCAgIHQ0LCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFExYiwgUTFiLCBxXzEKKyAgICAgICAgTVZOICAgICB0MTEsIHFfMQorICAgICAgICBVSFNVQjggIHQxMCwgdDEwLCB0MTEKKyAgICAgICAgTV9MRFIgICBxXzNiLCBwUV8zCisgICAgICAgIEVPUiAgICAgdDEwLCB0MTAsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgdDksIHQ5LCB0MTAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEyYgorICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMAorICAgICAgICBTQUREOCAgIHQ0LCB0MCwgdDQKKyAgICAgICAgRU9SICAgICB0MCwgcV8zYiwgcV8wIAorICAgICAgICBBTkQgICAgIHQwLCB0MCwgbTAxCisgICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MAorICAgICAgICBVSFNVQjggIHQxMCwgcV8zYiwgcV8wCisgICAgICAgIFNBREQ4ICAgdDQsIHQ0LCBtMDEKKyAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQxMAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBmaWx0LCBtMDEKKyAgICAgICAgU0VMICAgICBRMGIsIHQ5LCBxXzAKKworICAgICAgICBTQUREOCAgIHQ0LCBxXzAsIHQ0ICAgICAgICAgICAgCisgICAgICAgIDsvLyBRMmIgcmVhZHkgLSB0NAorCisgICAgICAgIFVTVUI4ICAgdDEwLCBhcHFmbGcsIG0wMQorICAgICAgICBTRUwgICAgIFEyYiwgdDQsIHFfMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDQ4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpAQCAtMCwwICsxLDMyNSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZmMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgICAgIAorICAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisgICAgSUYgQVJNMTEzNkpTIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDgKK2lIZWlnaHQgICAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCit4ICAgICAgICAgICAgICAgUk4gNworeDAgICAgICAgICAgICAgIFJOIDcKK3gxICAgICAgICAgICAgICBSTiAxMAoreDIgICAgICAgICAgICAgIFJOIDExCitTY3JhdGNoICAgICAgICAgUk4gMTIKKworOy8vIEZ1bmN0aW9uOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0CisKK1N0YXJ0QWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTB0b0FsaWduZWQgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorICAgICAgCitDb3B5MXRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTJ0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisKK0NvcHkzdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKKworQ29weUVuZCAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKKworICAgICAgICBNX0VORAorICAgIAorCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjIscjMscjQscjUscjYKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjaworU3RhcnRWQWxpZ25lZFN0YWNrQ29weQorICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NXSVRDSCB4CisgICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICAKK0NvcHkwdG9WQWxpZ25lZCAgCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisgICAgICAKK0NvcHkxdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorCitDb3B5MnRvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkzdG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCisKK0NvcHlWRW5kICAKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisKKyAgICAgICAgTV9FTkQKKworCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiNmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNDkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjAscjIscjgscjkscjEyCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK3gwICAgICAgICAgICAgICBSTiA0Cit4MSAgICAgICAgICAgICAgUk4gNQoreDIgICAgICAgICAgICAgIFJOIDgKK3gzICAgICAgICAgICAgICBSTiA5CitUZW1wICAgICAgICAgICAgUk4gMTIKKworICAgIElGIEFSTTExMzZKUworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2CisKK0NvcHk0eDRTdGFydAorICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBNX1NXSVRDSCBUZW1wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMworICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMQorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKyAgICAgIAorQ29weTR4NEFsaWduMgorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjMgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRFbmQKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZmU1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE3OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKworOy8vIEZ1bmN0aW9uczogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCis7Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KKzsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgorOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KKworCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgCitNQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyYzAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAwICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorVGVtcDMgICAgICAgICAgIFJOIDEwCitUZW1wNCAgICAgICAgICAgUk4gMTEKK3BCdWYgICAgICAgICAgICBSTiA3CityMHgwZmUwMGZlMCAgICAgUk4gNgorcjB4MDBmZjAwZmYgICAgIFJOIDEyCitDb3VudCAgICAgICAgICAgUk4gMTQKK1ZhbHVlQTAgICAgICAgICBSTiAxMAorVmFsdWVBMSAgICAgICAgIFJOIDExCisKKyAgICBJRiBBUk0xMTM2SlMKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCitMb29wU3RhcnQxCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCitFbmQxCisgICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgorICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAorCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgorCitMb29wU3RhcnQgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAorCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCisgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKK0VuZDIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04CisgICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAorCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFmZjZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisKKyAgICBJRiBBUk0xMTM2SlMgCisKKworICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQxLCA4CisgICAgICAgIE1fQUxMT0M4IHBUZW1wUmVzdWx0MiwgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAorICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAorICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEZ1bmN0aW9uOiAKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByNgorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1ZhbEEgICAgICAgICAgICBSTiA0CitWYWxCICAgICAgICAgICAgUk4gNQorVmFsQyAgICAgICAgICAgIFJOIDYKK1ZhbEQgICAgICAgICAgICBSTiA3CitWYWxFICAgICAgICAgICAgUk4gOAorVmFsRiAgICAgICAgICAgIFJOIDkKK1ZhbEcgICAgICAgICAgICBSTiAxMgorVmFsSCAgICAgICAgICAgIFJOIDE0CitWYWxJICAgICAgICAgICAgUk4gMQorCitUZW1wMSAgICAgICAgICAgUk4gMworVGVtcDIgICAgICAgICAgIFJOIDEKK1RlbXAzICAgICAgICAgICBSTiAxMgorVGVtcDQgICAgICAgICAgIFJOIDcKK1RlbXA1ICAgICAgICAgICBSTiA1CityMHgwZmUwMGZlMCAgICAgUk4gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KK3IweDAwZmYwMGZmICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAorQ291bnRlciAgICAgICAgIFJOIDExCitwSW50ZXJCdWYgICAgICAgUk4gOAorCitWYWxDQSAgICAgICAgICAgUk4gOAorVmFsREIgICAgICAgICAgIFJOIDkKK1ZhbEdFICAgICAgICAgICBSTiAxMAorVmFsSEYgICAgICAgICAgIFJOIDExCityMHgwMDE0MDAwMSAgICAgUk4gMTIKK3IweDAwMTRmZmZiICAgICBSTiAxNAorCityMHgwMDAxZmMwMCAgICAgUk4gMTEKKworQWNjeCAgICAgICAgICAgIFJOIDgKK0FjY3kgICAgICAgICAgICBSTiA5CitUZW1wNiAgICAgICAgICAgUk4gMTQKKworICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKworICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMxNgorCisgICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIE1fU1RSICAgICAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisKK0hlaWdodExvb3AKK05leHRUd29Sb3dzTG9vcAorICAgICAgICBMRFIgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbZDEgYzEgYjEgYTFdCisgICAgICAgIExEUiAgICAgVmFsQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgTERSICAgICBWYWxILCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMSBnMSBmMSBlMV0gICAgICAgIAorICAgICAgICBMRFIgICAgIFZhbEUsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gwIGcwIGYwIGUwXQorICAgICAgICBMRFJCICAgIFRlbXAyLCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbbDEgazEgajEgaTFdCisgICAgICAgIExEUkIgICAgVGVtcDEsIFtwU3JjXSwgIy04ICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtsMCBrMCBqMCBpMF0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgVmFsQiwgVmFsQSwgVmFsRCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbYjEgYTEgYjAgYTBdCisgICAgICAgIFBLSFRCICAgVmFsRCwgVmFsRCwgVmFsQSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbZDEgYzEgZDAgYzBdCisgICAgICAgIFVYVEFCMTYgVmFsQSwgcjB4MDBmZjAwZmYsIFZhbEIgICAgICAgICAgICAgICAgIDsvLyBbMDAgYTEgMDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2IFZhbEMsIHIweDAwZmYwMGZmLCBWYWxEICAgICAgICAgICAgICAgICA7Ly8gWzAwIGMxIDAwIGMwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgUEtIQlQgICBWYWxJLCBUZW1wMSwgVGVtcDIsIExTTCAjMTYgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxGLCBWYWxFLCBWYWxILCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtmMSBlMSBmMCBlMF0KKyAgICAgICAgUEtIVEIgICBWYWxILCBWYWxILCBWYWxFLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtoMSBnMSBoMCBnMF0KKyAgICAgICAgVVhUQUIxNiBWYWxFLCByMHgwMGZmMDBmZiwgVmFsRiAgICAgICAgICAgICAgICAgOy8vIFswMCBlMSAwMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MwCisgICAgICAgIDsvLyBBY2MwID0gYSAtIDUqYiArIDIwKmMgKyAyMCpkIC0gNSplICsgZgorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxDLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsRSwgVmFsQiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2IEFjYzAsIFZhbEEsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMCwgQWNjMCwgVGVtcDEgICAgICAgCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MxCisgICAgICAgIDsvLyBBY2MxID0gYiAtIDUqYyArIDIwKmQgKyAyMCplIC0gNSpmICsgZworICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsQywgVmFsRiwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVmFsRywgcjB4MDBmZjAwZmYsIFZhbEggICAgICAgICAgICAgICAgIDsvLyBbMDAgZzEgMDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMSwgVmFsRywgVmFsQiwgUk9SICM4CisgICAgICAgIEFERCAgICAgQWNjMSwgQWNjMSwgVGVtcDEgICAgICAgIAorCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMgorICAgICAgICA7Ly8gQWNjMiA9IGMgLSA1KmQgKyAyMCplICsgMjAqZiAtIDUqZyArIGgKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRywgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgQWNjMywgVmFsSSwgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEUsIFZhbEYsIFJPUiAjOAorICAgICAgICAKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIgICAgICAgIAorICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxHLCBWYWxGLCBST1IgIzgKKyAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAorICAgICAgICBBREQgICAgIEFjYzIsIEFjYzIsIFRlbXAxICAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzMKKyAgICAgICAgOy8vIEFjYzMgPSBkIC0gNSplICsgMjAqZiArIDIwKmcgLSA1KmggKyBpCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEgsIFJPUiAjOAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMgorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMywgQWNjMywgVGVtcDEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAorICAgICAgICBNX0xEUiAgIHNyY1N0ZXAsIHBTcmNTdGVwCisKKyAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgZXZlbiBzdG9yZSBBY2MwLUFjYzMgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyCisgICAgICAgIDsvLyBJZiBDb3VudGVyIGlzIG9mZiBzdG9yZSBBY2MwLUFjYzMgYW5kIHByZXZpb3VzIEFjYzAtQWNjMyBpbiBhIGludGVybWVkaWF0ZSBidWYgCisgICAgICAgIEFORFMgICAgICAgIFRlbXAzLCBDb3VudGVyLCAjMQorICAgICAgICBCRVEgICAgICAgICBOb1Byb2Nlc3NpbmcgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFBhY2tpbmcgcHJldmlvdXMgYW5kIGN1cnJlbnQgQWNjMC1BY2MzIHZhbHVlcworICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDEKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzAsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYTIgMCBhMF0gPSBbMCBhMyAwIGEyXSBbMCBhMSAwIGEwXQorICAgICAgICBQS0hUQiAgICAgICBBY2MwLCBBY2MwLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICA7Ly9bMCBhMyAwIGExXSA9IFswIGExIDAgYTBdIFswIGEzIDAgYTJdIAorICAgICAgICBTVFIgICAgICAgICBBY2MwLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MxLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGIyIDAgYjBdID0gWzAgYjMgMCBiMl0gWzAgYjEgMCBiMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMSwgQWNjMSwgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGIzIDAgYjFdID0gWzAgYjEgMCBiMF0gWzAgYjMgMCBiMl0KKyAgICAgICAgTV9MRFJEICAgICAgQWNjeCwgQWNjeSwgcFRlbXBSZXN1bHQyCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N4LCBBY2MyLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGMyIDAgYzBdID0gWzAgYzMgMCBjMl0gWzAgYzEgMCBjMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMiwgQWNjMiwgQWNjeCwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGMzIDAgYzFdID0gWzAgYzEgMCBjMF0gWzAgYzMgMCBjMl0KKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeSwgQWNjMywgTFNMICMxNiAgICAgICAgICA7Ly9bMCBkMiAwIGQwXSA9IFswIGQzIDAgZDJdIFswIGQxIDAgZDBdCisgICAgICAgIFBLSFRCICAgICAgIEFjYzMsIEFjYzMsIEFjY3ksIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBkMyAwIGQxXSA9IFswIGQxIDAgZDBdIFswIGQzIDAgZDJdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjLTEyCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQWZ0ZXJTdG9yZQorCitOb1Byb2Nlc3NpbmcKKyAgICAgICAgTV9TVFJEICAgICAgQWNjMCwgQWNjMSwgcFRlbXBSZXN1bHQxCisgICAgICAgIE1fU1RSRCAgICAgIEFjYzIsIEFjYzMsIHBUZW1wUmVzdWx0MgorQWZ0ZXJTdG9yZQorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSAgICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorCisgICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgIDsvL1swIGExIDAgYTBdCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0XSwgIzQKKyAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3RdLCAjNAorICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdF0sICMtMTIKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzE2CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworICAgICAgICBNX0xEUiAgICAgICBWYWxDQSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQorICAgICAgICBNX0xEUiAgICAgICBWYWxEQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBNX0xEUiAgICAgICBWYWxHRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQorICAgICAgICBNX0xEUiAgICAgICBWYWxIRiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQorCisKKyAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKKyAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKKyAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKKyAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKKworICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorICAgICAgICBNX1NUUkIgICAgICBBY2MzLCBbcERzdF0sIGRzdFN0ZXAKKworCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzEKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKKyAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKK0VuZAorICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OGUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDI3NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgCisgICAgCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMgCisgICAgICAgIAorICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDQKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDQKKyAgICAgICAgTV9BTExPQzQgcENvdW50ZXIsIDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBGdW5jdGlvbjoKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAorICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByNgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCitWYWxBICAgICAgICAgICAgUk4gNQorVmFsQTAgICAgICAgICAgIFJOIDQKK1ZhbEExICAgICAgICAgICBSTiA1CitWYWxBRjAgICAgICAgICAgUk4gNAorVmFsQUYxICAgICAgICAgIFJOIDUKKworVmFsQiAgICAgICAgICAgIFJOIDExCisKK1ZhbEMgICAgICAgICAgICBSTiA1CitWYWxDMCAgICAgICAgICAgUk4gNAorVmFsQzEgICAgICAgICAgIFJOIDUKK1ZhbENEMCAgICAgICAgICBSTiAxMgorVmFsQ0QxICAgICAgICAgIFJOIDE0CitWYWxDRjAgICAgICAgICAgUk4gNAorVmFsQ0YxICAgICAgICAgIFJOIDUKKworVmFsRCAgICAgICAgICAgIFJOIDEwCisKK1ZhbEUgICAgICAgICAgICBSTiA3CitWYWxFMCAgICAgICAgICAgUk4gNgorVmFsRTEgICAgICAgICAgIFJOIDcKK1ZhbEVCMCAgICAgICAgICBSTiAxMAorVmFsRUIxICAgICAgICAgIFJOIDExCitWYWxFRDAgICAgICAgICAgUk4gNgorVmFsRUQxICAgICAgICAgIFJOIDcKKworVmFsRiAgICAgICAgICAgIFJOIDEwCisKK1ZhbEcgICAgICAgICAgICBSTiAxNAorVmFsRzAgICAgICAgICAgIFJOIDEyCitWYWxHMSAgICAgICAgICAgUk4gMTQKK1ZhbEdCMCAgICAgICAgICBSTiAxMgorVmFsR0IxICAgICAgICAgIFJOIDE0CisKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1RlbXAgICAgICAgICAgICBSTiA3CitTdGVwICAgICAgICAgICAgUk4gNgorCitwSW50ZXJCdWYgICAgICAgUk4gOAorQ291bnRlciAgICAgICAgIFJOIDgKK3IweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKK3IweDAwMDFmYzAwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KKworICAgIAorOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK1ZhbENBICAgICAgICAgICBSTiA4CitWYWxEQiAgICAgICAgICAgUk4gOQorVmFsR0UgICAgICAgICAgIFJOIDEwCitWYWxIRiAgICAgICAgICAgUk4gMTEKK3IweDAwMTQwMDAxICAgICBSTiAxMgorcjB4MDAxNGZmZmIgICAgIFJOIDE0CisKK3IweDAwMDAwMjAwICAgICBSTiAxMgorcjB4MDAwMDAwZmYgICAgIFJOIDEyCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKKyAgICAgICAgTU9WICAgICAgICAgcERzdCwgcEludGVyQnVmICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBkc3RTdGVwLCAjMjQKKworICAgICAgICA7Ly8gU2V0IHVwIGNvdW50ZXIgb2YgZm9ybWF0LCBbMF0gIFswXSAgWzEgKGhlaWdodCldICBbOCAod2lkdGgpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjMQorICAgICAgICBNT1YgICAgICAgICBUZW1wLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIFRlbXAsIENvdW50ZXIsIExTTCAjOCAgICAgICAgOy8vIFswIDAgSCBXXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKK1dpZHRoTG9vcAorICAgICAgICBNX1NUUiAgICAgICBwU3JjLCBwcFNyYworICAgICAgICBNX1NUUiAgICAgICBwRHN0LCBwcERzdAorSGVpZ2h0TG9vcAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQwLCBWYWxFMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDEsIFZhbEUxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCisgICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQxLCBWYWxDRjEsIFZhbEVEMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFZhbEEsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBMRFIgICAgICAgICBWYWxBLCBbVmFsQV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFthMyBhMiBhMSBhMF0KKyAgICAgICAgUlNCICAgICAgICAgVmFsRUQwLCBWYWxDRjAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrRStEKSAtIChPZmYrQytGKSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFZhbEVEMSwgVmFsRUQxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQwLCBWYWxFRDAsIFZhbEVEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitFK0QpIC0gKE9mZitDK0YpXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMCwgcjB4MDBmZjAwZmYsIFZhbEEgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBMSwgcjB4MDBmZjAwZmYsIFZhbEEsIFJPUiAjOCAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjAsIFZhbEEwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGEyIDAgYTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMSwgVmFsQTEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQorICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMCwgcjB4MDBmZjAwZmYsIFZhbEcgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHMSwgcjB4MDBmZjAwZmYsIFZhbEcsIFJPUiAjOCAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjAsIFZhbEcwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGcyIDAgZzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMSwgVmFsRzEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgQWNjMiwgVmFsRUQwLCBWYWxHQjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MyID0gMTYqT2ZmICsgKEIrRykgKyAyMCooRCtFKSAtIDUqKEMrRikKKyAgICAgICAgQUREICAgICAgICAgQWNjMywgVmFsRUQxLCBWYWxHQjEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxIDw8IDggICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcFNyYywgcHBTcmMKKyAgICAgICAgTV9MRFIgICAgICAgcERzdCwgcHBEc3QKKyAgICAgICAgQUREUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIygxIDw8IDgpLTQgICAgICAgICAgIDsvLyBMb29wIHRpbGwgd2lkdGggaXMgMTIKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzgKKyAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzE8PDgKKyAgICAgICAgQlBMICAgICAgICAgV2lkdGhMb29wCisgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgIDsvLworICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCAjMjQKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzI0CisgICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0CisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgorICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKKworSGVpZ2h0TG9vcDEKKyAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKworCisgICAgICAgIExEUiAgICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBjIDAgYV0KKyAgICAgICAgTERSICAgICAgICAgVmFsREIsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQorICAgICAgICBMRFIgICAgICAgICBWYWxHRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCisgICAgICAgIExEUiAgICAgICAgIFZhbEhGLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBoIDAgZl0KKworICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAorICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAorICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAorICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAorICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KKworICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisgICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQorCisgICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM4ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2CisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKKyAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAorCisgICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAorICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCisgICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAorICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCisgICAgICAgIE1PViAgICAgICAgIEFjYzIsIEFjYzIsIExTUiAjMTAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAorCisgICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQorICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MyLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQorRW5kCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTBjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzOSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLyBGdW5jdGlvbjogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCis7Ly8gYmUgYWxpZ25lZC4gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCisKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworQWNjMCAgICAgICAgICAgIFJOIDQKK0FjYzEgICAgICAgICAgICBSTiA1CitBY2MyICAgICAgICAgICAgUk4gNgorQWNjMyAgICAgICAgICAgIFJOIDcKKworVmFsQSAgICAgICAgICAgIFJOIDQKK1ZhbEIgICAgICAgICAgICBSTiA1CitWYWxDICAgICAgICAgICAgUk4gNgorVmFsRCAgICAgICAgICAgIFJOIDcKK1ZhbEUgICAgICAgICAgICBSTiA4CitWYWxGICAgICAgICAgICAgUk4gOQorVmFsRyAgICAgICAgICAgIFJOIDEyCitWYWxIICAgICAgICAgICAgUk4gMTQKK1ZhbEkgICAgICAgICAgICBSTiAxCisKK1RlbXAxICAgICAgICAgICBSTiAzCitUZW1wMiAgICAgICAgICAgUk4gMQorVGVtcDMgICAgICAgICAgIFJOIDEyCitUZW1wNCAgICAgICAgICAgUk4gNworVGVtcDUgICAgICAgICAgIFJOIDUKK3IweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQorcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CitDb3VudGVyICAgICAgICAgUk4gMTEKKworSGVpZ2h0ICAgICAgICAgIFJOIDMKKworICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAorICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjYKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgQ291bnRlciwgIzIKKyAgICAgICAgTV9TVFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCisgICAgICAgIE1fU1RSICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAorICAgICAgICBMRFIgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKKworTmV4dFR3b1Jvd3NMb29wCisgICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KKyAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQorICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCisgICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCisgICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KKyAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KKyAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KKyAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQorICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQorICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKKyAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKKyAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKKyAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCisKKyAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIDB4MGZlMDBmZTAgPSAoMTYgKiBPZmZzZXQpIC0gMTYgd2hlcmUgT2Zmc2V0IGlzIDI1NSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKKyAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAKKyAgICAgICAgVVNBVDE2ICBBY2MwLCAjMTMsIEFjYzAKKyAgICAgICAgVVNBVDE2ICBBY2MxLCAjMTMsIEFjYzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCisgICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFORCAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNQorICAgICAgICBBTkQgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUKKyAgICAgICAgT1JSICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgIAorICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDUgICAgICAgIAorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMworICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKKyAgICAgICAgVVhUQUIxNiBUZW1wNSwgVmFsRSwgVmFsSCwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXA1LCBUZW1wMiwgTFNMICMyCisgICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wNQorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVU0FUMTYgIEFjYzMsICMxMywgQWNjMworICAgICAgICBVU0FUMTYgIEFjYzIsICMxMywgQWNjMiAgICAgICAgCisKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcAorICAgICAgICBBTkQgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUKKyAgICAgICAgQU5EICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1CisgICAgICAgIE9SUiAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4CisgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKKyAgICAgICAgUEtIQlQgICBBY2MxLCBBY2MwLCBBY2MyLCBMU0wgIzE2ICAgCisgICAgICAgIE1fU1RSICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQxCisgICAgICAgIFBLSFRCICAgQWNjMiwgQWNjMiwgQWNjMCwgQVNSICMxNiAgIAorICAgICAgICBNX1NUUiAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MgorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgQkdUICAgICBOZXh0VHdvUm93c0xvb3AKK0VuZAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgIEVORAorICAgIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2NkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE4NSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorCisKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorCisgICAgICAgIDsvLyBGdW5jdGlvbjogCisgICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEltcGxlbWVudHMgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCisgICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCisgICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKKyAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjYKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworVmFsQSAgICAgICAgICAgIFJOIDUKK1ZhbEEwICAgICAgICAgICBSTiA0CitWYWxBMSAgICAgICAgICAgUk4gNQorVmFsQUYwICAgICAgICAgIFJOIDQKK1ZhbEFGMSAgICAgICAgICBSTiA1CisKK1ZhbEIgICAgICAgICAgICBSTiAxMQorCitWYWxDICAgICAgICAgICAgUk4gNQorVmFsQzAgICAgICAgICAgIFJOIDQKK1ZhbEMxICAgICAgICAgICBSTiA1CitWYWxDRDAgICAgICAgICAgUk4gMTIKK1ZhbENEMSAgICAgICAgICBSTiAxNAorVmFsQ0YwICAgICAgICAgIFJOIDQKK1ZhbENGMSAgICAgICAgICBSTiA1CisKK1ZhbEQgICAgICAgICAgICBSTiAxMAorCitWYWxFICAgICAgICAgICAgUk4gNworVmFsRTAgICAgICAgICAgIFJOIDYKK1ZhbEUxICAgICAgICAgICBSTiA3CitWYWxFQjAgICAgICAgICAgUk4gMTAKK1ZhbEVCMSAgICAgICAgICBSTiAxMQorVmFsRUQwICAgICAgICAgIFJOIDYKK1ZhbEVEMSAgICAgICAgICBSTiA3CisKK1ZhbEYgICAgICAgICAgICBSTiAxMAorCitWYWxHICAgICAgICAgICAgUk4gMTQKK1ZhbEcwICAgICAgICAgICBSTiAxMgorVmFsRzEgICAgICAgICAgIFJOIDE0CitWYWxHQjAgICAgICAgICAgUk4gMTIKK1ZhbEdCMSAgICAgICAgICBSTiAxNAorCitBY2MwICAgICAgICAgICAgUk4gNAorQWNjMSAgICAgICAgICAgIFJOIDUKK0FjYzIgICAgICAgICAgICBSTiA2CitBY2MzICAgICAgICAgICAgUk4gNworCitUZW1wICAgICAgICAgICAgUk4gNworSGVpZ2h0ICAgICAgICAgIFJOIDMKK1N0ZXAgICAgICAgICAgICBSTiA2CisKK0NvdW50ZXIgICAgICAgICBSTiA4CityMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CityMHgwZmUwMGZlMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCisKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMyCisgICAgICAgIAorVHdvUm93c0xvb3AKKyAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQorICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQorICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAorICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KKyAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgOy8vIEFjYzEgLT0gKDE2Kk9mZiAtIDE2KQorICAgICAgICBVUVNVQjE2ICAgICBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQorICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMyAtPSAoMTYqT2ZmIC0gMTYpCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzIsIEFjYzIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgQWNjMSwgIzEzLCBBY2MxICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXR1cmF0ZSB0byA4KzUgPSAxMyBiaXRzCisgICAgICAgIFVTQVQxNiAgICAgIEFjYzAsICMxMywgQWNjMAorICAgICAgICBVU0FUMTYgICAgICBBY2MzLCAjMTMsIEFjYzMgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBBY2MyLCAjMTMsIEFjYzIKKyAgICAgICAgQU5EICAgICAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNSAgICAgICAgIDsvLyBbMCBhMyAwIGExXQorICAgICAgICBBTkQgICAgICAgICBBY2MwLCByMHgwMGZmMDBmZiwgQWNjMCwgTFNSICM1ICAgICAgICAgOy8vIFswIGEyIDAgYTBdCisgICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgICAgICAgICA7Ly8gW2EzIGEyIGExIGEwXQorICAgICAgICBBTkQgICAgICAgICBBY2MzLCByMHgwMGZmMDBmZiwgQWNjMywgTFNSICM1ICAgICAgICAgOy8vIFswIGIzIDAgYjFdCisgICAgICAgIEFORCAgICAgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjIgMCBiMF0KKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKKyAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIEJHVCAgICAgICAgIFR3b1Jvd3NMb29wCitFbmQKKyAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFkMTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKQEAgLTAsMCArMSwyNzMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vIGlucHV0IHJlZ2lzdGVycworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitpU3JjU3RlcCAgICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgICAgICBSTiAzCitpV2lkdGggICAgICAgICAgICAgICBSTiA0CitpSGVpZ2h0ICAgICAgICAgICAgICBSTiA1CitkeCAgICAgICAgICAgICAgICAgICBSTiA2CitkeSAgICAgICAgICAgICAgICAgICBSTiA3CisKKworOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwordGVtcCAgICAgICAgICAgICAgICAgUk4gMTEKK3IweDIwICAgICAgICAgICAgICAgIFJOIDEyCit0bXAweDIwICAgICAgICAgICAgICBSTiAxNAorcmV0dXJuICAgICAgICAgICAgICAgUk4gMAorZHhQbHVzZHkgICAgICAgICAgICAgUk4gMTAKK0VpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCitFaWdodE1pbnVzZHkgICAgICAgICBSTiA5CitkeEVpZ2h0TWludXNkeCAgICAgICBSTiA4CitCQUNvZWZmICAgICAgICAgICAgICBSTiA2CitEQ0NvZWZmICAgICAgICAgICAgICBSTiA3CisgICAgICAgICAgICAgICAgICAgICAKK2lEc3RTdGVweDJNaW51c1dpZHRoIFJOIDgKK2lTcmNTdGVweDJNaW51c1dpZHRoIFJOIDkKK2lTcmNTdGVwMSAgICAgICAgICAgIFJOIDEwCisKK3BTcmMxICAgICAgICAgICAgICAgIFJOIDEKK3BTcmMyICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QxICAgICAgICAgICAgICAgIFJOIDgKK3BEc3QyICAgICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK3BpeDAwICAgICAgICAgICAgICAgIFJOIDgKK3BpeDAxICAgICAgICAgICAgICAgIFJOIDkKK3BpeDEwICAgICAgICAgICAgICAgIFJOIDEwCitwaXgxMSAgICAgICAgICAgICAgICBSTiAxMQorCitPdXQwMTAwICAgICAgICAgICAgICBSTiA4ICAKK091dDExMTAgICAgICAgICAgICAgIFJOIDEwIAorCit4MDAgICAgICAgICAgICAgICAgICBSTiA4Cit4MDEgICAgICAgICAgICAgICAgICBSTiAxMAoreDAyICAgICAgICAgICAgICAgICAgUk4gMTIKK3gxMCAgICAgICAgICAgICAgICAgIFJOIDkKK3gxMSAgICAgICAgICAgICAgICAgIFJOIDExCit4MTIgICAgICAgICAgICAgICAgICBSTiAxNAoreDIwICAgICAgICAgICAgICAgICAgUk4gMTAKK3gyMSAgICAgICAgICAgICAgICAgIFJOIDEyCit4MjIgICAgICAgICAgICAgICAgICBSTiAxNAorICAgICAgICAgICAgICAgICAgICAgCit4MDF4MDAgICAgICAgICAgICAgICBSTiA4ICAKK3gwMngwMSAgICAgICAgICAgICAgIFJOIDEwIAoreDExeDEwICAgICAgICAgICAgICAgUk4gOSAgCit4MTJ4MTEgICAgICAgICAgICAgICBSTiAxMSAKK3gyMXgyMCAgICAgICAgICAgICAgIFJOIDEwIAoreDIyeDIxICAgICAgICAgICAgICAgUk4gMTIgCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAwICAgICAgICAgICAgIFJOIDEyCitPdXRSb3cwMSAgICAgICAgICAgICBSTiAxNAorT3V0Um93MTAgICAgICAgICAgICAgUk4gMTAKK091dFJvdzExICAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKK091dFJvdzAxMDAgICAgICAgICAgIFJOIDEyCitPdXRSb3cxMTEwICAgICAgICAgICBSTiAxMgorICAgICAgICAgICAgICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0CisgICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAorICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsICBXaWR0aCAgCisgICAgICAgIE1fTERSICAgaUhlaWdodCwgSGVpZ2h0ICAKKyAgICAgICAgTV9MRFIgICBkeCwgICAgICBEeCAKKyAgICAgICAgTV9MRFIgICBkeSwgICAgICBEeQorICAgICAgICAKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5CisgICAgICAgIAorICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKKyAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMsIGlTcmNTdGVwCisgICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4CisgICAgICAgIENNTiAgICAgZHgsZHkKKyAgICAgICAgQUREICAgICBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R4LCBkeCwgTFNMICMxNgorICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gUGFja2VkIENvZWZmcy4KKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgQkFDb2VmZiwgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBNVUwgICAgIERDQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBkeSAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNraW5nIGVpdGhlciBvZiBkeCBhbmQgZHkgYmVpbmcgbm9uLXplcm8KKyAgICAgICAgCisgICAgICAgIEJFUSAgICAgTVZJc1plcm8KKyAgICAgICAgCis7Ly8gUGl4ZWwgbGF5b3V0OgorOy8vCis7Ly8gICB4MDAgeDAxIHgwMgorOy8vICAgeDEwIHgxMSB4MTIKKzsvLyAgIHgyMCB4MjEgeDIyCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQorICAgICAgICAKK091dGVyTG9vcE1WSXNOb3RaZXJvCisKK0lubmVyTG9vcE1WSXNOb3RaZXJvCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMCwgW3BTcmMsICAjKzBdICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDEwLCBbcFNyYzEsICMrMF0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MDEsIFtwU3JjLCAgIysxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDExLCBbcFNyYzEsICMrMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMiwgW3BTcmMsICAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgxMiwgW3BTcmMxLCAjKzJdISAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgwMXgwMCwgeDAwLCB4MDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgICAgICAgICAgT1JSICAgICB4MDJ4MDEsIHgwMSwgeDAyLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHIweDIwLCAgIzMyCisgICAgICAgICAgICAgICAgT1JSICAgICB4MTF4MTAsIHgxMCwgeDExLCBMU0wgIzE2ICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgeDEyeDExLCB4MTEsIHgxMiwgTFNMICMxNiAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MDF4MDAsIHgwMXgwMCwgQkFDb2VmZiwgcjB4MjAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMngwMSwgeDAyeDAxLCBCQUNvZWZmLCByMHgyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gaVdpZHRoIHBhY2tlZCB3aXRoIE1TQiAodG9wIDE2IGJpdHMpIAorICAgICAgICAgICAgICAgIDsvLyBhcyBpbm5lciBsb29wIGNvdW50ZXIgdmFsdWUgaS5lIAorICAgICAgICAgICAgICAgIDsvLyAoaVdpZHRoIC0xKSBhbmQgTFNCIChsb3dlciAxNiBiaXRzKQorICAgICAgICAgICAgICAgIDsvLyBhcyBvcmlnaW5hbCB3aWR0aAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDAsIHgxMXgxMCwgRENDb2VmZiwgeDAxeDAwICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMSwgeDEyeDExLCBEQ0NvZWZmLCB4MDJ4MDEgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBSU0IgICAgIHBTcmMyLCBwU3JjLCBwU3JjMSwgTFNMICMxCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMCwgT3V0Um93MDAsIExTUiAjNgorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDEsIE91dFJvdzAxLCBMU1IgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgyMCxbcFNyYzIsICMtMl0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzAxMDAsIE91dFJvdzAwLCBPdXRSb3cwMSwgTFNMICM4CisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cwMTAwLCBbcERzdF0sICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjEsW3BTcmMyLCAjLTFdCisgICAgICAgICAgICAgICAgTERSQiAgICB4MjIsW3BTcmMyLCAjKzBdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0MSwgcERzdCwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMXgyMCwgeDIwLCB4MjEsIExTTCAjMTYKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgyMngyMSwgeDIxLCB4MjIsIExTTCAjMTYgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgdG1wMHgyMCwgIzMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIFJldXNpbmcgdGhlIHBhY2tlZCBkYXRhIHgxMXgxMCBhbmQgeDEyeDExCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTF4MTAsICB4MTF4MTAsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICB4MTJ4MTEsICB4MTJ4MTEsICBCQUNvZWZmLCB0bXAweDIwCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMCwgeDIxeDIwLCBEQ0NvZWZmLCB4MTF4MTAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzExLCB4MjJ4MjEsIERDQ29lZmYsIHgxMngxMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTAsIE91dFJvdzEwLCBMU1IgIzYKKyAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzExLCBPdXRSb3cxMSwgTFNSICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MTExMCwgT3V0Um93MTAsIE91dFJvdzExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzExMTAsIFtwRHN0MSwgIy0yXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCisKK01WSXNaZXJvCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKK091dGVyTG9vcE1WSXNaZXJvCisKK0lubmVyTG9vcE1WSXNaZXJvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDAsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDEsIFtwU3JjXSwgICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTAsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTEsIFtwU3JjMV0sICMrMQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDIsICBwRHN0LCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPUlIgICAgIE91dDAxMDAsIHBpeDAwLCBwaXgwMSwgTFNMICM4IAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MTExMCwgcGl4MTAsIHBpeDExLCBMU0wgIzgKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dDAxMDAsIFtwRHN0XSwgICMyCisgICAgICAgICAgICAgICAgU1RSSCAgICBPdXQxMTEwLCBbcERzdDJdLCAjMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2CisgICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCisgICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCisgICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQorICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCisgICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgorICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FTkQKKworICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIEVORAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYyZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDc0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisgICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgorICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisgICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBFTkQKKyAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWQxODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCkBAIC0wLDAgKzEsNDA3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKzsvLyAKKzsvLyAKKworICAgICAgICAKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERzdCAgICAgICAgICAgICAgICBSTiAgMAorcFNyYyAgICAgICAgICAgICAgICBSTiAgMQorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2luMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKK2luMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQoraW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCitpbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KK2luMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQoraW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KK2luMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCitpbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQorCis7Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQordHJSb3cwMCAgICAgICAgICAgICBSTiAgMgordHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKK3RyUm93MDIgICAgICAgICAgICAgUk4gIDMKK3RyUm93MTIgICAgICAgICAgICAgUk4gIDUKK3RyUm93MjAgICAgICAgICAgICAgUk4gIDExCit0clJvdzMwICAgICAgICAgICAgIFJOICAxMgordHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKK3RyUm93MjIgICAgICAgICAgICAgUk4gIDcKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2UwICAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitlMSAgICAgICAgICAgICAgICAgIFJOICA2CitlMiAgICAgICAgICAgICAgICAgIFJOICA4CitlMyAgICAgICAgICAgICAgICAgIFJOICA5Citjb25zdFplcm8gICAgICAgICAgIFJOICAxCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2cwICAgICAgICAgICAgICAgICAgUk4gIDEwCitnMSAgICAgICAgICAgICAgICAgIFJOICAxMQorZzIgICAgICAgICAgICAgICAgICBSTiAgMTIKK2czICAgICAgICAgICAgICAgICAgUk4gIDE0ICAgCisKKzsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscworY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitjb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitjb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK2NvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAorCisKK3RlbXAxICAgICAgICAgICAgICAgUk4gIDEwICAgICAgICAgICAgICAgICAgOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworY29uc3QxICAgICAgICAgICAgICBSTiAgMTEgICAgICAKK2NvbnN0MiAgICAgICAgICAgICAgUk4gIDEyCittYXNrICAgICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gT3V0cHV0IHBpeGVscworb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK291dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCitvdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAorb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK291dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCitvdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAorb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK291dDMyICAgICAgICAgICAgICAgUk4gIDkgIAorICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCxyMTEKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwU3JjLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9CisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgY29uc3RaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIDtMRFIgICAgICAgY29uc3RaZXJvLD0weDAwMDAwMDAwICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCisgICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKKyAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4CisgICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0CisgICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0CisgICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0CisgICAgICAgIDsvLworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIGQwIGQxIC0gLQorICAgICAgICA7Ly8gICBkNCBkNSAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCisgICAgICAgIAorICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KKyAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyICAKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAgYXZvaWQgcGlwZWxpbmUgc3RhbGxzIGZvciBlMiBhbmQgZTMKKyAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAgCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgIAorICAgICAgICBTQUREMTYgICAgcm93T3AwMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMyAgCisgICAgICAgIFNBREQxNiAgICByb3dPcDEwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyICAKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMjAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIgIAorICAgICAgICBTU1VCMTYgICAgcm93T3AzMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAyLHRyUm93MjIKKyAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMyLGNvbnN0WmVybworICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMyCisgICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTIKKyAgICAgICAgU0FERDE2ICAgIHJvd09wMDIsIGUwLCBlMworICAgICAgICBTQUREMTYgICAgcm93T3AxMiwgZTEsIGUyCisgICAgICAgIFNTVUIxNiAgICByb3dPcDIyLCBlMSwgZTIKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMzIsIGUwLCBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQorICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAwLHRyQ29sMjAKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzAsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzAKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMAorICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjAsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMCwgZzAsIGczCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAyLHRyQ29sMjIKKyAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzIsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzIKKyAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMgorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgZzAsIGczCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBnMSwgZzIKKyAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjIsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AzMiwgZzAsIGczCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBjb25zdDE6IFNlcnZlcyBkdWFsIHB1cnBvc2UgCisgICAgICAgIDsvLyAoMSkgQWRkICMzMiB0byBib3RoIHRoZSBsb3dlciBhbmQgaGlnaGVyIDE2Yml0cyBvZiB0aGUgU0lNRCByZXN1bHQgCisgICAgICAgIDsvLyAoMikgQ29udmVydCB0aGUgbG93ZXIgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIG51bWJlciAoQWRkIDMyNzY4KQorICAgICAgICAKKyAgICAgICAgTERSICAgICBjb25zdDEsID0weDAwMjA4MDIwICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICBtYXNrLCA9MHhmZmZmMDNmZiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gbWFzayB0aGUgZG93biBzaGlmdGVkIDYgYml0cyAgCisgICAgICAgIAorICAgICAgICA7Ly8gY29uc3QyKCM1MTIpOiB1c2VkIHRvIGNvbnZlcnQgdGhlIGxvd2VyIDE2Yml0IG51bWJlciBiYWNrIHRvIHNpZ25lZCB2YWx1ZSAKKyAgICAgIAorICAgICAgICBNT1YgICAgIGNvbnN0MiwjMHgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29uc3QyID0gMl45CisgICAgICAgIAorICAgICAgICA7Ly8gRmlyc3QgUm93IAorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGNvbE9wMDAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgY29sT3AwMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AwMCwgbWFzaywgY29sT3AwMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AwMiwgbWFzaywgY29sT3AwMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MDAsY29sT3AwMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQwMixjb2xPcDAyLGNvbnN0MiAgICAKKyAgICAgICAgCisKKyAgICAgICAgOy8vIFNlY29uZCBSb3cKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBjb2xPcDEwLCBjb25zdDEKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGNvbE9wMTIsIGNvbnN0MQorICAgICAgICBBTkQgICAgIGNvbE9wMTAsIG1hc2ssIGNvbE9wMTAsIEFTUiAjNgorICAgICAgICBBTkQgICAgIGNvbE9wMTIsIG1hc2ssIGNvbE9wMTIsIEFTUiAjNgorICAgICAgICBTU1VCMTYgIG91dDEwLGNvbE9wMTAsY29uc3QyCisgICAgICAgIFNTVUIxNiAgb3V0MTIsY29sT3AxMixjb25zdDIgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRoaXJkIFJvdworICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMjAsIGNvbE9wMjAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AyMiwgY29sT3AyMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AyMCwgbWFzaywgY29sT3AyMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AyMiwgbWFzaywgY29sT3AyMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MjAsY29sT3AyMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQyMixjb2xPcDIyLGNvbnN0MgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBGb3VydGggUm93ICAgCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgY29sT3AzMCwgY29sT3AzMCwgY29uc3QxCisgICAgICAgIFNBREQxNiAgICBjb2xPcDMyLCBjb2xPcDMyLCBjb25zdDEKKyAgICAgICAgQU5EICAgICBjb2xPcDMwLCBtYXNrLCBjb2xPcDMwLCBBU1IgIzYKKyAgICAgICAgQU5EICAgICBjb2xPcDMyLCBtYXNrLCBjb2xPcDMyLCBBU1IgIzYKKyAgICAgICAgU1NVQjE2ICBvdXQzMCxjb2xPcDMwLGNvbnN0MgorICAgICAgICBTU1VCMTYgIG91dDMyLGNvbE9wMzIsY29uc3QyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEc3Qse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgCisgICAgCisgICAgCisKKworCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKQEAgLTAsMCArMSw5MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCitwRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKK0ZsYWcgICAgICAgICAgICBSTiAzICAgIAorVmFsdWUgICAgICAgICAgIFJOIDQgICAgCitWYWx1ZTIgICAgICAgICAgUk4gNSAgICAKK3N0ck9mZnNldCAgICAgICBSTiA2ICAgIAorY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisgICAgICAgIAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCisgICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKKyAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAorICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCisgICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKKyAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQorICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlNmI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jaworICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KKyAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIzODYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCisgKigxNngxNikuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgorICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4CisgKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCisJY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTlmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KKyAqCQkJCQkJCQlidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKKyAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCisgKQorCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmI0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAorICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAorICogb2YgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sKKyAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybworICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKKyAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCisgKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3MTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKQEAgLTAsMCArMSw0ODAgQEAKKzsvLworOy8vIChjKSBDb3B5cmlnaHQgMjAwNyBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworICAgICAgICAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAorICAgICAgICAKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUywgQVJNMTEzNkpTX1UKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswMHwwYV0KKyAgICAgICAgTERSSCAgICB0ZW1wMyxbcFZSb3csIzJdICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzICAgICA9IFswMHwwYl0gICAKKyAgICAgICAgTERSSCAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswMHwwY10gCisgICAgICAgIE9SUiAgICAgcm93THVtYTAxLHJvd0x1bWEwMSx0ZW1wMyxMU0wgIzE2ICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcworICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCisgICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAorICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQorICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKKyAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCisgICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKKyAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCisgICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCisgICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCisgICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscworICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAyCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMyAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0ICAgCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgorICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCisgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTX1UKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcFNyY0RzdCAgICAgICBSTiAgMAorUVAgICAgICAgICAgICBSTiAgMQorCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcFFQZGl2ICAgICAgICAgIFJOICA0CitwUVBtb2QgICAgICAgICAgUk4gIDUKK3BWUm93ICAgICAgICAgICBSTiAgMgorUVBtb2QgICAgICAgICAgIFJOICA2CitzaGlmdCAgICAgICAgICAgUk4gIDMKK3Jvd0x1bWEwMSAgICAgICBSTiAgMQorcm93THVtYTIzICAgICAgIFJOICA0CisKK1NyY0RzdDAwICAgICAgICBSTiAgNQorU3JjRHN0MDIgICAgICAgIFJOICA2CitTcmNEc3QxMCAgICAgICAgUk4gIDcKK1NyY0RzdDEyICAgICAgICBSTiAgOAorU3JjRHN0MjAgICAgICAgIFJOICA5CitTcmNEc3QyMiAgICAgICAgUk4gIDEwCitTcmNEc3QzMCAgICAgICAgUk4gIDExCitTcmNEc3QzMiAgICAgICAgUk4gIDEyCisKK3RlbXAxICAgICAgICAgICBSTiAgMgordGVtcDIgICAgICAgICAgIFJOICAzCit0ZW1wMyAgICAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0LHIxMQorICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXQorICAgICAgICBMRFIgICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMGR8MGNdICAgIAorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCisgICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKKyAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0CisgICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5CisgICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQorICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKKyAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgorICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKKyAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKKyAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKKyAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbworICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAzICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDQgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2CisgICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTX1UgICAgICAgIAorCisKKworCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgUk4gIDAKK3BQcmVkICAgICAgIFJOICAxCitwREMgICAgICAgICBSTiAgMgorcERzdCAgICAgICAgUk4gIDMKKyAgIAorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERlbHRhICAgICAgUk4gIDQKK3BEZWx0YVRtcCAgIFJOICA2CitBQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK3BQcmVkVGVtcCAgIFJOICA3CitwRENUZW1wICAgICBSTiAgOAorcERzdFRlbXAgICAgUk4gIDkKK3BEZWx0YUFyZzEgIFJOICAxCitwRGVsdGFBcmcwICBSTiAgMAorUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitEQ3ZhbCAgICAgICBSTiAgMTAgIAorREN2YWxDb3B5ICAgUk4gIDExCitwcmVkc3RlcCAgICBSTiAgMQorZHN0U3RlcCAgICAgUk4gIDEwCit5Y291bnRlciAgICBSTiAgMAorUHJlZFZhbDEgICAgUk4gIDMKK1ByZWRWYWwyICAgIFJOICA1CitEZWx0YVZhbDEgICBSTiAgMgorRGVsdGFWYWwyICAgUk4gIDExCitQcmVkVmFsICAgICBSTiAgOAordG1wRGVsdGFWYWwgUk4gIDYKK3N1bTEgICAgICAgIFJOICAxMgorc3VtMiAgICAgICAgUk4gIDE0CisgICAgCisgICAgCisgICAgICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCisgICAgICAgICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0CisgICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKKyAgCisgICAgICAgIAorICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAorICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAorICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAorICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCisgICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBBQywjMAorICAgICAgICBCRVEgICAgIERDY2FzZQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIERlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIERlcXVhbnRMdW1hQUM0eDQKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgcERDVGVtcCwjMAorICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBTVFJITkUgIERDdmFsLFtwRGVsdGFdCisgICAgICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCisgICAgICAgIAorCitEQ2Nhc2UKKyAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCisgICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAorICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2CisgICAgICAgIFBLSEJUICAgREN2YWwsREN2YWwsREN2YWwsTFNMICMxNiAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGluZyB0aGUgTG93ZXIgaGFsZndvcmQKKyAgICAgICAgTU9WICAgICBEQ3ZhbENvcHksIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5lZWRlZCBmb3IgU1RSRAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzhdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMxNl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzI0XSAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorT3V0RENjYXNlICAgICAgCisgICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCisgICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICBNT1YgICAgIHljb3VudGVyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvdW50ZXIgZm9yIHRoZSBQcmVkUGx1c0RlbHRhTG9vcAorICAgICAgICBMRFIgICAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCisKK1ByZWRQbHVzRGVsdGFMb29wCisgICAgICAgIAorICAgICAgIAorICAgICAgICBTVUJTICAgIHljb3VudGVyLHljb3VudGVyLCMxCisgICAgICAgIEFERCAgICAgcFByZWRUZW1wLHBQcmVkVGVtcCxwcmVkc3RlcCAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBQcmVkIHB0cgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBEZWx0YVZhbDEsdG1wRGVsdGFWYWwsRGVsdGFWYWwyLExTTCAjMTYgICAgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXSAgIAorICAgICAgICBQS0hUQiAgIERlbHRhVmFsMixEZWx0YVZhbDIsdG1wRGVsdGFWYWwsQVNSICMxNiAgICAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCisgICAgICAgIAorICAgICAgICBVWFRCMTYgIFByZWRWYWwxLFByZWRWYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwxID0gWzBjMGFdCisgICAgICAgIFVYVEIxNiAgUHJlZFZhbDIsUHJlZFZhbCxST1IgIzggICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDIgPSBbMGQwYl0KKyAgICAgICAgCisgICAgICAgIExEUkdUICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKyAgICAgICAgCisgICAgICAgIFFBREQxNiAgc3VtMixEZWx0YVZhbDIsUHJlZFZhbDIgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgICAgIFFBREQxNiAgc3VtMSxEZWx0YVZhbDEsUHJlZFZhbDEKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgc3VtMiwjOCxzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLDI1NSxzdW0yKQorICAgICAgICBVU0FUMTYgIHN1bTEsIzgsc3VtMQorICAgICAgICAKKyAgICAgICAgTERNR1RJQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICAgIAorICAgICAgICBPUlIgICAgIHN1bTEsc3VtMSxzdW0yLExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSBbZGNiYV0KKyAgICAgICAgU1RSICAgICBzdW0xLFtwRHN0VGVtcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRlbXAscERzdFRlbXAsZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgcHRyCisgICAgICAgIEJHVCAgICAgUHJlZFBsdXNEZWx0YUxvb3AgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgCisgICAgCisgICAgCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKyAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2MGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDMzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNgorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMTAKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorCithcDBxMCAgICAgICBSTiA0ICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorcFEwICAgICAgICAgUk4gMAorU3RlcCAgICAgICAgUk4gMQorICAgICAgICAgICAgCis7Ly8gT3V0cHV0CisgICAgICAgICAgICAKK1BfMCAgICAgICAgIFJOIDYKK1FfMCAgICAgICAgIFJOIDcgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDICAgICAgICAgIFJOIDEyCit0QzAgICAgICAgICBSTiA1Cit0QzEgICAgICAgICBSTiAxMgorcG9zICAgICAgICAgUk4gNQorbmVnICAgICAgICAgUk4gOQorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKKworYSAgICAgICAgICAgUk4gMTAKK3QxICAgICAgICAgIFJOIDEwCit0MiAgICAgICAgICBSTiAxMgordDMgICAgICAgICAgUk4gMTQKK3Q0ICAgICAgICAgIFJOIDYKK3Q1ICAgICAgICAgIFJOIDUKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4CisgICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKKyAgICAgICAgTV9BTExPQzQgcHBCUyw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCisgICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQorICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCisKKyAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCitMb29wWQorTG9vcFgKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzIKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSxzcmNkc3RTdGVwCisKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSxzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8xLCBbcFEwXQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICAKKyAgICAgICAgOy8vIHBfMCA9IFtyM3AwIHIycDAgcjFwMCByMHAwXQorICAgICAgICA7Ly8gcF8xID0gW3IzcDEgcjJwMSByMXAxIHIwcDFdCisgICAgICAgIDsvLyBxXzAgPSBbcjNxMCByMnEwIHIxcTAgcjBxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyM3ExIHIycTEgcjFxMSByMHExXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZjAwCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTLCAjMHhmZgorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiUywgIzQKKworICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKworICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKKyAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIE1WTiAgICAgdDIsIHBfMQorICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKKyAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCisgICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNworCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICMyCisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCisgICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCisgICAgICAgIE1WTiAgICAgdDMsIHFfMQorICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCisgICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNworICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCitOb0ZpbHRlckJTMAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgCisgICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdworICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKKyAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKKyAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKKworICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCisKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwjMQorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKKyAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMCwgdEMxLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBNX1NUUiAgIFBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1RSICAgICBRXzAsIFtwUTBdLCAjNAorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKyAgICAgICAgQUREICAgICBwQlMsIHBCUywgIzQKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM4MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDQzNyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4MDAwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDUwMDAwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDYKK3BCUyAgICAgICAgIFJOIDkKK3BRMCAgICAgICAgIFJOIDAKK2JTICAgICAgICAgIFJOIDIKK2JTVGVtcCAgICAgIFJOIDEwCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitxXzAgICAgICAgICBSTiA4ICAKK3FfMSAgICAgICAgIFJOIDkgIAorCis7Ly8gVW5wYWNraW5nCittYXNrICAgICAgICBSTiAxMSAKKworcm93MCAgICAgICAgUk4gMgorcm93MSAgICAgICAgUk4gNAorcm93MiAgICAgICAgUk4gNQorcm93MyAgICAgICAgUk4gMworCityb3c0ICAgICAgICBSTiA4Cityb3c1ICAgICAgICBSTiA5Cityb3c2ICAgICAgICBSTiAxMAorcm93NyAgICAgICAgUk4gMTIKKwordHVucGswICAgICAgUk4gMgordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCisKK3R1bnBrNCAgICAgIFJOIDQKK3R1bnBrNSAgICAgIFJOIDUKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKKworYXAwcTAgICAgICAgUk4gNCAgCitmaWx0ICAgICAgICBSTiAyCisgICAgICAgIAorbTAwICAgICAgICAgUk4gMTQKK20wMSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKK3BRMCAgICAgICAgIFJOIDAKK1N0ZXAgICAgICAgIFJOIDEKKyAgICAgICAgICAgIAorOy8vIE91dHB1dAorICAgICAgICAgICAgCitQXzAgICAgICAgICBSTiA2CitRXzAgICAgICAgICBSTiA3IAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QyAgICAgICAgICBSTiAxMgordEMwICAgICAgICAgUk4gNQordEMxICAgICAgICAgUk4gMTIKK3BvcyAgICAgICAgIFJOIDUKK25lZyAgICAgICAgIFJOIDkKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworCis7Ly8gTWlzY2VsbGFub3VzCitYWSAgICAgICAgICBSTiA4CisKK2EgICAgICAgICAgIFJOIDEwCit0MSAgICAgICAgICBSTiAxMAordDIgICAgICAgICAgUk4gMTIKK3QzICAgICAgICAgIFJOIDE0Cit0NCAgICAgICAgICBSTiA2Cit0NSAgICAgICAgICBSTiA1CisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisgICAgICAgIAorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCisgICAgICAgIExEUiAgICAgYSw9TUFTS18xCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KKworICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKKworICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgCisgICAgICAgIAorTG9vcFkKK0xvb3BYCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcTAtcTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzgKKyAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCisKKyAgICAgICAgTV9MRFJIICByb3c0LCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUkggIHJvdzUsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgTERSSCAgICByb3c2LCBbcFEwXQorICAgICAgICBMRFJIICAgIHJvdzcsIFtwUTAsIHNyY2RzdFN0ZXBdCisKKyAgICAgICAgOy8vIHJvdzQgPSBbMCAwIHIwcTAgcjBxMV0KKyAgICAgICAgOy8vIHJvdzUgPSBbMCAwIHIxcTAgcjFxMV0KKyAgICAgICAgOy8vIHJvdzYgPSBbMCAwIHIycTAgcjJxMV0KKyAgICAgICAgOy8vIHJvdzcgPSBbMCAwIHIzcTAgcjNxMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbMCAwIHIwcTAgcjFxMF0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFswIDAgcjBxMSByMXExXQorICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyB0dW5wazcgPSBbMCAwIHIycTEgcjNxMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzIKKworICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisgICAgICAgIDsvLyBxXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIHFfMSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHAwLXAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0xEUkggIHJvdzAsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBNX0xEUkggIHJvdzEsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAorICAgICAgICBMRFJIICAgIHJvdzIsIFtwUTBdCisgICAgICAgIExEUkggICAgcm93MywgW3BRMCwgc3JjZHN0U3RlcF0KKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gWzAgMCByMHAwIHIwcDFdCisgICAgICAgIDsvLyByb3cxID0gWzAgMCByMXAwIHIxcDFdCisgICAgICAgIDsvLyByb3cyID0gWzAgMCByMnAwIHIycDFdCisgICAgICAgIDsvLyByb3czID0gWzAgMCByM3AwIHIzcDFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCICAgdHVucGsyLCB0dW5wazIsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCICAgdHVucGs2LCB0dW5wazYsIHJvdzEKKworICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MgorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazAsIHR1bnBrMCwgcm93MywgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazMsIHR1bnBrMywgcm93MworCisgICAgICAgIDsvLyB0dW5wazIgPSBbMCAwIHIwcDAgcjFwMF0KKyAgICAgICAgOy8vIHR1bnBrNiA9IFswIDAgcjBwMSByMXAxXQorICAgICAgICA7Ly8gdHVucGswID0gWzAgMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyB0dW5wazMgPSBbMCAwIHIycDEgcjNwMV0KKworICAgICAgICBQS0hCVCAgIHBfMCwgdHVucGswLCB0dW5wazIsIExTTCMxNgorICAgICAgICBNX0xEUiAgIGJTVGVtcCwgcHBCUworICAgICAgICBQS0hCVCAgIHBfMSwgdHVucGszLCB0dW5wazYsIExTTCMxNgorCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorCis7Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMQorICAgICAgICBMRFJIICAgIGJTVGVtcCwgW2JTVGVtcCAsIy04XQorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYwMAorICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKKyAgICAgICAgVFNUICAgICBiU1RlbXAsICMweGZmCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzQKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAorICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAorICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgTVZOICAgICB0MiwgcF8xCisgICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKKyAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3CisKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEwYiAKKyAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKKyAgICAgICAgTVZOICAgICB0MywgcV8xCisgICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKKyAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCisKKyAgICAgICAgQiAgICAgICBTdG9yZVJlc3VsdEFuZEV4aXQKKworOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCis7Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KKworTm9GaWx0ZXJGaWx0MAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjMgorTm9GaWx0ZXJCUzAKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICAKKworICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKKyAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0CisgICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3CisgICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3CisKKyAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MworCisgICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwVGhyZXNob2xkc10sICMxCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwgIzMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCisgICAgICAgIE9SUiAgICAgdEMsIHRDMSwgdEMwLCBMU0wgIzE2CisgICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAorICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKKyAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQorICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0CisgICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKworICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCisgICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCisgICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCisgICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKKyAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKKyAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QworICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZworICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZworICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKKyAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCisgICAgCitTdG9yZVJlc3VsdEFuZEV4aXQKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICAgICBwUTAsIHBRMCwgIzEgICAgICAKKyAKKyAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzI0CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXQorICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjMjQKKyAgICAgICAgTV9TVFJCICB0MSwgW3BRMF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMxNgorICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAorCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICM4CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTBdCisgICAgICAgIFNUUkIgICAgUF8wLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjOAorICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0hCisgICAgICAgIFNUUkIgICAgUV8wLCBbcFEwLCBzcmNkc3RTdGVwXQorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorCitFeGl0TG9vcFkKKworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNCAKKyAgICAgICAgU1VCICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM2CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwzMzEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMKKworCitNQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAorTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKK01BU0tfMiAgICAgIEVRVSAweGZmMDBmZjAwCitMT09QX0NPVU5UICBFUVUgMHgxMTExMDAwMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhQXJnICAgUk4gMgorcEJldGFBcmcgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiAxNAorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMgorCithbHBoYSAgICAgICBSTiA2CithbHBoYTAgICAgICBSTiA2CithbHBoYTEgICAgICBSTiA4CisKK2JldGEgICAgICAgIFJOIDcKK2JldGEwICAgICAgIFJOIDcKK2JldGExICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgICAgICBSTiAzICAKK3BfMSAgICAgICAgIFJOIDUgIAorcF8yICAgICAgICAgUk4gNCAgCitwXzMgICAgICAgICBSTiAyICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCitxXzIgICAgICAgICBSTiAxMCAKK3FfMyAgICAgICAgIFJOIDEyIAorCis7Ly8gRmlsdGVyaW5nCisKK2RwMHEwICAgICAgIFJOIDEyCitkcDFwMCAgICAgICBSTiAxMgorZHExcTAgICAgICAgUk4gMTIKK2RwMnAwICAgICAgIFJOIDEyCitkcTJxMCAgICAgICBSTiAxMgorICAgICAgICAgICAgCithcDBxMCAgICAgICBSTiAxICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorYXBmbGcgICAgICAgUk4gMCAKK2FxZmxnICAgICAgIFJOIDYKK2FwcWZsZyAgICAgIFJOIDAKKyAgICAgICAgICAgIAorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCit0QzAgICAgICAgICBSTiA3CitwdEMwICAgICAgICBSTiAxCisKK3BRMGEgICAgICAgIFJOIDAgICAgCitTdGVwYSAgICAgICBSTiAxICAgIAorbWFza2EgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBhICAgICAgICAgUk4gMQorUDFhICAgICAgICAgUk4gOAorUTBhICAgICAgICAgUk4gNworUTFhICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworcFEwYiAgICAgICAgUk4gMAorU3RlcGIgICAgICAgUk4gMQorbWFza2IgICAgICAgUk4gMTQKKyAgICAgICAgICAgIAorUDBiICAgICAgICAgUk4gNgorUDFiICAgICAgICAgUk4gNworUDJiICAgICAgICAgUk4gMQorUDNiICAgICAgICAgUk4gMworICAgICAgICAgICAgCitRMGIgICAgICAgICBSTiA5IAorUTFiICAgICAgICAgUk4gMCAgIAorUTJiICAgICAgICAgUk4gMiAKK1EzYiAgICAgICAgIFJOIDMgCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKK3QwICAgICAgICAgIFJOIDMgCit0MSAgICAgICAgICBSTiAxMgordDIgICAgICAgICAgUk4gMTQKK3Q3ICAgICAgICAgIFJOIDcKK3Q0ICAgICAgICAgIFJOIDQKK3Q1ICAgICAgICAgIFJOIDEgIAordDggICAgICAgICAgUk4gNiAgCithICAgICAgICAgICBSTiAwCisKKyAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DNCBwUV8zLDQKKyAgICAgICAgTV9BTExPQzQgcFBfMyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0CisgICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0xvb3BZCitMb29wWAorOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgcFEwLCBwcFEwU3RlcAorICAgICAgICBNX0xEUiAgIHBfMywgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBwXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCisgICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjMQorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgIHBfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICBiUywgIzAKKyAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHFfMSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzIsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8zLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBCRVEgICAgIE5vRmlsdGVyQlMwCisgICAgICAgIENNUCAgICAgYlMsICM0CisgICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKworICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKKyAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTU9WICAgICBwXzIsIFExYgorICAgICAgICBNT1YgICAgIHBfMSwgUDJiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICMxCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIHBfMSwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgTV9TVFIgICBQMWIsIFtwUTBiLCBTdGVwYl0hCisgICAgICAgIE1fU1RSICAgUDBiLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBNX1NUUiAgIFEwYiwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgU1RSICAgICBwXzIsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICBRMmIsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQorCisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIsIExTTCAjMgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckJTMAorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzMKK05vRmlsdGVyRmlsdDAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKyAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKworYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzEKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTU9WICAgICBwXzIsIFAwYQorICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAorICAgICAgICBNX1NUUiAgIFAxYSwgW3BRMGEsIFN0ZXBhLCBMU0wgIzFdIQorICAgICAgICBNX1NUUiAgIHBfMiwgW3BRMGEsIFN0ZXBhXSEKKyAgICAgICAgTV9TVFIgICBRMGEsIFtwUTBhLCBTdGVwYV0hCisgICAgICAgIFNUUiAgICAgUTFhLCBbcFEwYSwgU3RlcGFdCisgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBhLCBTdGVwYSwgTFNMICMyCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorRXhpdExvb3BZCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0VORAorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZGRjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNTUwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDE0CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAyCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitwXzIgICAgICAgICBSTiA0ICAKK3BfMyAgICAgICAgIFJOIDIgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKK3FfMiAgICAgICAgIFJOIDEwIAorcV8zICAgICAgICAgUk4gMTIgCisKKzsvLyBVbnBhY2tpbmcKK21hc2sgICAgICAgIFJOIDExIAorCityb3cwICAgICAgICBSTiAyCityb3cxICAgICAgICBSTiA0Cityb3cyICAgICAgICBSTiA1Cityb3czICAgICAgICBSTiAzCisKK3JvdzQgICAgICAgIFJOIDgKK3JvdzUgICAgICAgIFJOIDkKK3JvdzYgICAgICAgIFJOIDEwCityb3c3ICAgICAgICBSTiAxMgorcm93OCAgICAgICAgUk4gMTQKK3JvdzkgICAgICAgIFJOIDcKKyAgICAgICAgICAgIAordHVucGswICAgICAgUk4gOAordHVucGsxICAgICAgUk4gOQordHVucGsyICAgICAgUk4gMTAKK3R1bnBrMyAgICAgIFJOIDEyCit0dW5wazQgICAgICBSTiAwCisKK3R1bnBrNSAgICAgIFJOIDEKK3R1bnBrNiAgICAgIFJOIDE0Cit0dW5wazcgICAgICBSTiAyIAordHVucGs4ICAgICAgUk4gNSAKK3R1bnBrOSAgICAgIFJOIDYgCisgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorZHAycDAgICAgICAgUk4gMTIKK2RxMnEwICAgICAgIFJOIDEyCisgICAgICAgICAgICAKK2FwMHEwICAgICAgIFJOIDEgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCithcGZsZyAgICAgICBSTiAwIAorYXFmbGcgICAgICAgUk4gNgorYXBxZmxnICAgICAgUk4gMAorICAgICAgICAgICAgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDMCAgICAgICAgIFJOIDcKK3B0QzAgICAgICAgIFJOIDEKKworcFEwYSAgICAgICAgUk4gMCAgICAKK1N0ZXBhICAgICAgIFJOIDEgICAgCittYXNrYSAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGEgICAgICAgICBSTiAxCitQMWEgICAgICAgICBSTiA4CitRMGEgICAgICAgICBSTiA3CitRMWEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCitwUTBiICAgICAgICBSTiAwCitTdGVwYiAgICAgICBSTiAxCittYXNrYiAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGIgICAgICAgICBSTiA2CitQMWIgICAgICAgICBSTiA3CitQMmIgICAgICAgICBSTiAxCitQM2IgICAgICAgICBSTiAzCisgICAgICAgICAgICAKK1EwYiAgICAgICAgIFJOIDkgCitRMWIgICAgICAgICBSTiAwICAgCitRMmIgICAgICAgICBSTiAyIAorUTNiICAgICAgICAgUk4gMyAKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAordDAgICAgICAgICAgUk4gMyAKK3QxICAgICAgICAgIFJOIDEyCit0MiAgICAgICAgICBSTiAxNAordDcgICAgICAgICAgUk4gNwordDQgICAgICAgICAgUk4gNAordDUgICAgICAgICAgUk4gMSAgCit0OCAgICAgICAgICBSTiA2ICAKK2EgICAgICAgICAgIFJOIDAKKworICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKKyAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKKyAgICAgICAgTV9BTExPQzQgcFFfMyw0CisgICAgICAgIE1fQUxMT0M0IHBQXzMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAorICAgICAgICBNX0FMTE9DNCBwU3RlcCw0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAorICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQorCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKworICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKKyAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0CisKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisKKyAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAorICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZworICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAorICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICAKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzQKK0xvb3BZCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIE1fTERSICAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgcm93MiwgW3BRMF0KKyAgICAgICAgTERSICAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyByb3cwID0gW3IwcDAgcjBwMSByMHAyIHIwcDNdCisgICAgICAgIDsvLyByb3cxID0gW3IxcDAgcjFwMSByMXAyIHIxcDNdCisgICAgICAgIDsvLyByb3cyID0gW3IycDAgcjJwMSByMnAyIHIycDNdCisgICAgICAgIDsvLyByb3czID0gW3IzcDAgcjNwMSByM3AyIHIzcDNdCisKKyAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2ssIHJvdzAKKyAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIHJvdzEsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs2LCB0dW5wazYsIHJvdzEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzIKKyAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2ssIHJvdzIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIHJvdzMsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIHJvdzMKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcDAgcjFwMCByMHAyIHIxcDJdCisgICAgICAgIDsvLyB0dW5wazYgPSBbcjBwMSByMXAxIHIwcDMgcjFwM10KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMnAwIHIzcDAgcjJwMiByM3AyXQorICAgICAgICA7Ly8gdHVucGszID0gW3IycDEgcjNwMSByMnAzIHIzcDNdCisKKyAgICAgICAgUEtIVEIgICBwXzAsIHR1bnBrMCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIVEIgICBwXzEsIHR1bnBrNiwgdHVucGszLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICBwXzIsIHR1bnBrMiwgdHVucGswLCBMU0wjMTYKKyAgICAgICAgUEtIQlQgICBwXzMsIHR1bnBrMywgdHVucGs2LCBMU0wjMTYKKworCisgICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorICAgICAgICA7Ly8gcF8yID0gW3IwcDIgcjFwMiByMnAxIHIzcDJdCisgICAgICAgIDsvLyBwXzMgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KKworICAgICAgICBNX1NUUiAgIHBfMywgcFBfMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMb29wWAorICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzQKKyAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCisgICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX1NUUiAgIHBCUywgcHBCUworCisgICAgICAgIExEUiAgICAgcm93NCwgW3BRMCwgIzRdIQorICAgICAgICBCRVEuVyAgIE5vRmlsdGVyQlMwCisgICAgICAgIE1fTERSICAgcm93NSwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NiwgW3BRMCwgc3JjZHN0U3RlcF0hCisgICAgICAgIE1fTERSICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KKworICAgICAgICA7Ly8gcm93NCA9IFtyMHEzIHIwcTIgcjBxMSByMHEwXQorICAgICAgICA7Ly8gcm93NSA9IFtyMXEzIHIxcTIgcjFxMSByMXEwXQorICAgICAgICA7Ly8gcm93NiA9IFtyMnEzIHIycTIgcjJxMSByMnEwXQorICAgICAgICA7Ly8gcm93NyA9IFtyM3EzIHIzcTIgcjNxMSByM3EwXQorICAgIAorICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAorICAgICAgICBDTVAgICAgIGJTLCAjNAorICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazUsIHR1bnBrNSwgcm93NQorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgorICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazcsIHR1bnBrNywgcm93NworCisgICAgICAgIDsvLyB0dW5wazQgPSBbcjBxMCByMXEwIHIwcTIgcjFxMl0KKyAgICAgICAgOy8vIHR1bnBrNSA9IFtyMHExIHIxcTEgcjBxMyByMXEzXQorICAgICAgICA7Ly8gdHVucGs2ID0gW3IycTAgcjNxMCByMnEyIHIzcTJdCisgICAgICAgIDsvLyB0dW5wazcgPSBbcjJxMSByM3ExIHIycTMgcjNxM10KKworICAgICAgICBQS0hUQiAgIHFfMywgdHVucGs0LCB0dW5wazYsIEFTUiMxNgorICAgICAgICBQS0hUQiAgIHFfMiwgdHVucGs1LCB0dW5wazcsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgorICAgICAgICBNX1NUUiAgIHFfMywgcFFfMworICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgorCisKKyAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisgICAgICAgIDsvLyBxXzIgPSBbcjBxMiByMXEyIHIycTEgcjNxMl0KKyAgICAgICAgOy8vIHFfMyA9IFtyMHEzIHIxcTMgcjJxMyByM3EzXQorCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAorICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCisKKyAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCisgICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCisgICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCisgICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKKworICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKKyAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCisgICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCisgICAgICAgIE1PViAgICAgdDcsIzAKKyAgICAgICAgCisKKyAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCisgICAgICAgIENNUCAgICAgZmlsdCwgIzAKKyAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBMRFIgICAgIG1hc2tiLD1NQVNLXzIKKworICAgICAgICA7Ly8gUDBiID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCisgICAgICAgIDsvLyBQMWIgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KKyAgICAgICAgOy8vIFAyYiA9IFtyMHAyIHIxcDIgcjJwMiByM3AyXQorICAgICAgICA7Ly8gUDNiID0gW3IwcDMgcjFwMyByMnAzIHIzcDNdCisKKyAgICAgICAgTV9MRFIgICBQM2IsIHBQXzMgICAKKyAgICAgICAgTV9TVFIgICBRMGIsIHBQXzMgICAKKworICAgICAgICA7Ly8tLS0tLS1QYWNrIHAwLXAzLS0tLS0tCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgUDBiCisgICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgUDBiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBQMWIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFAxYgorCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUDJiCisgICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUDJiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBQM2IsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFAzYgorCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQorICAgICAgICA7Ly8gdHVucGszID0gW3IwcDIgcjBwMyByMnAyIHIycDNdCisgICAgICAgIDsvLyB0dW5wazggPSBbcjFwMiByMXAzIHIzcDIgcjNwM10KKworICAgICAgICBNT1YgICAgIHBfMiwgUTFiCisgICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCisKKyAgICAgICAgUEtIVEIgICByb3c5LCB0dW5wazAsIHR1bnBrMywgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGszLCB0dW5wazAsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzMsIHR1bnBrMiwgdHVucGs4LCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazgsIHR1bnBrMiwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzkgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KKyAgICAgICAgOy8vIHJvdzMgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KKworICAgICAgICBNX1NUUiAgIHJvdzksIFtwUTBiXSwgU3RlcGIKKyAgICAgICAgU1RSICAgICByb3c3LCBbcFEwYiwgU3RlcGJdCisgICAgICAgIFNUUiAgICAgcm93NiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCisgICAgICAgIFNUUiAgICAgcm93MywgW3BRMGJdLCAjNAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBRM2IsIHBRXzMKKworICAgICAgICA7Ly8gUTBiID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBRMWIgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKyAgICAgICAgOy8vIFEyYiA9IFtyMHEyIHIxcTIgcjJxMiByM3EyXQorICAgICAgICA7Ly8gUTNiID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCisKKyAgICAgICAgOy8vLS0tLS0tUGFjayBxMC1xMy0tLS0tLQorICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFza2IsIHBfMgorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2IsIHBfMiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgUTBiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBRMGIKKworICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2IsIFEzYgorICAgICAgICBBTkQgICAgIHR1bnBrOCwgbWFza2IsIFEzYiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUTJiLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrOCwgdHVucGs4LCBRMmIKKworICAgICAgICA7Ly8gdHVucGswID0gW3IwcTEgcjBxMCByMnExIHIycTBdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KKyAgICAgICAgOy8vIHR1bnBrMyA9IFtyMHEzIHIwcTIgcjJxMyByMnEyXQorICAgICAgICA7Ly8gdHVucGs4ID0gW3IxcTMgcjFxMiByM3EzIHIzcTJdCisKKyAgICAgICAgUEtIVEIgICByb3c4LCB0dW5wazMsIHR1bnBrMCwgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcm93NywgdHVucGswLCB0dW5wazMsIExTTCMxNgorICAgICAgICBQS0hUQiAgIHJvdzQsIHR1bnBrOCwgdHVucGsyLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazIsIHR1bnBrOCwgTFNMIzE2CisKKyAgICAgICAgOy8vIHJvdzggPSBbcjBxMCByMHExIHIwcTIgcjBxM10KKyAgICAgICAgOy8vIHJvdzQgPSBbcjFxMCByMXExIHIxcTIgcjFxM10KKyAgICAgICAgOy8vIHJvdzcgPSBbcjJxMCByMnExIHIycTIgcjJxM10KKyAgICAgICAgOy8vIHJvdzYgPSBbcjNxMCByM3ExIHIzcTIgcjNxM10KKworICAgICAgICBTVFIgICAgIHJvdzQsIFtwUTBiXQorICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIKKyAgICAgICAgTU9WICAgICBwXzEsIFEyYgorCisgICAgICAgIFNUUiAgICAgcm93OCwgW3BRMF0KKworICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CitOb0ZpbHRlckJTMAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BZCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisgICAgICAgIAorYlNMVDQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICAKKyAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzQKKyAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vLS0tLS0tLS1QYWNrIHAxLHAwLHExLHEwLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly9Mb2FkIGRlc3RpbmF0aW9uIHBvaW50ZXIKKyAgICAgICAgTERSICAgICBtYXNrYSw9TUFTS18yCisgICAgICAgIE1fU1RSICAgUTBhLCBwUF8zCisgICAgICAgIE1PViAgICAgcF8xLCBxXzIKKworICAgICAgICA7Ly8gUDFhID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisgICAgICAgIDsvLyBQMGEgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFEwYSA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gUTFhID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisKKyAgICAgICAgQU5EICAgICB0dW5wazEsIG1hc2thLCBQMGEKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2thLCBQMGEsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGsxLCB0dW5wazEsIFAxYSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFhCisKKyAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKKworICAgICAgICBBTkQgICAgIHR1bnBrOSwgbWFza2EsIFExYQorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2EsIFExYSwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazksIHR1bnBrOSwgUTBhLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMGEKKworICAgICAgICA7Ly8gdHVucGsxID0gW3IwcDAgcjBwMSByMnAwIHIycDFdCisgICAgICAgIDsvLyB0dW5wazIgPSBbcjFwMCByMXAxIHIzcDAgcjNwMV0KKyAgICAgICAgOy8vIHR1bnBrOSA9IFtyMHExIHIwcTAgcjJxMSByMnEwXQorICAgICAgICA7Ly8gdHVucGszID0gW3IxcTEgcjFxMCByM3ExIHIzcTBdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsxLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrOSwgTFNSICMxNgorCisgICAgICAgIFNUUkggICAgdDQsW3BRMGEsICMyXSEgICAgICAgICAgOy8vU3RvcmVzIFtyMHAwIHIwcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMHEwIHIwcTFdCisKKyAgICAgICAgTU9WICAgICB0NCwgdHVucGsyLCBMU1IgIzE2CisgICAgICAgIE1PViAgICAgdDAsIHR1bnBrMywgTFNSICMxNgorCisgICAgICAgIE1fU1RSSCAgdDQsW3BRMGEsIFN0ZXBhXSEgICAgICAgOy8vU3RvcmVzIFtyMXAwIHIxcDFdCisgICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMXEwIHIxcTFdCisgICAgICAgIAorICAgICAgICBNX1NUUkggIHR1bnBrMSxbcFEwYSwgU3RlcGFdISAgIDsvL1N0b3JlcyBbcjJwMCByMnAxXQorICAgICAgICBTVFJIICAgIHR1bnBrMixbcFEwYSwgU3RlcGFdICAgIDsvL1N0b3JlcyBbcjNwMCByM3AxXQorICAgICAgICBTVFJIICAgIHR1bnBrOSxbcFEwYSwgIzJdISAgICAgICAgOy8vU3RvcmVzIFtyMnEwIHIycTFdCisgICAgICAgIFNUUkggICAgdHVucGszLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3EwIHIzcTFdCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzEKKworICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKworICAgICAgICA7Ly8gUmVsb2FkIFBpeGVscworICAgICAgICBNX0xEUiAgIHBfMCwgcFFfMworICAgICAgICBNT1YgICAgIHBfMiwgUTFhCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFgKKyAgICAgICAgCis7Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKK0V4aXRMb29wWQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNQorICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE1CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgQk5FICAgICBMb29wWQorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRU5ESUYgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCisgKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCisgKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKyAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6CisgKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCisgKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCisgKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjExYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpAQCAtMCwwICsxLDQyNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorOy8vCis7Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgorOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KKzsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7Ly8gUGFyYW1ldGVyczoKKzsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCis7Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCis7Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCis7Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCis7Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vCis7Ly8gUmV0dXJuIFZhbHVlOgorOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKzsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCis7Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCis7Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KKzsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgorOy8vCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgICAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgRU5ESUYKKworICAgIElGIEFSTTExMzZKUworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEVORElGCisgICAgCisgICAgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKK2lIZWlnaHQgICAgICAgICBSTiA0CitpV2lkdGggICAgICAgICAgUk4gNQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpZHggICAgICAgICAgICAgUk4gNgoraWR5ICAgICAgICAgICAgIFJOIDcKK2luZGV4ICAgICAgICAgICBSTiA2CitUZW1wICAgICAgICAgICAgUk4gMTIKK3BBcmdzICAgICAgICAgICBSTiAxMQorCisKKyAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAorICAgICAgICAgICAgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAorICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgTV9BTExPQzQgcHBEc3QsIDgKKyAgICAgICAgTV9BTExPQzQgcHBTcmMsIDgKKyAgICAgICAgTV9BTExPQzQgcHBBcmdzLCAxNgorICAgICAgICBNX0FMTE9DNCBwQnVmZmVyLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTJ4MTAKKyAgICAgICAgTV9BTExPQzggcEludGVyQnVmLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDEyMCA9IDEyKjUqMgorICAgICAgICBNX0FMTE9DOCBwVGVtcEJ1ZiwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzIgPSAgOCo0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KKyAgICAgICAgOy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBwYXJ0cyAoZHgsZHkpLCBvbmUgb3V0IG9mIDE2IGNhc2VzIHdpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICA7Ly8gUmVnaXN0ZXJzIHI0LCByNSwgcjYgdG8gYmUgcHJlc2VydmVkIGJ5IGludGVybmFsIHVuc2FmZSBmdW5jdGlvbnMKKyAgICAgICAgOy8vIHI0IC0gaUhlaWdodAorICAgICAgICA7Ly8gcjUgLSBpV2lkdGgKKyAgICAgICAgOy8vIHI2IC0gaW5kZXgKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKK3BCdWYgICAgICAgICAgICBSTiA4CitIZWlnaHQgICAgICAgICAgUk4gOSAKK2J1ZlN0ZXAgICAgICAgICBSTiA5CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHB0cmlkeCwgNAorICAgICAgICBNX0FSRyAgIHB0cmlkeSwgNCAgICAgICAgCisgICAgICAgIE1fQVJHICAgcHRyV2lkdGgsIDQKKyAgICAgICAgTV9BUkcgICBwdHJIZWlnaHQsIDQgICAgICAgIAorCisgICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCisgICAgICAgIE1fTERSICAgaWR4LCBwdHJpZHgKKyAgICAgICAgTV9MRFIgICBpZHksIHB0cmlkeQorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBwdHJIZWlnaHQKKyAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJyb2kud2lkdGggJWRcbiIsIGlXaWR0aAorICAgICAgICBNX1BSSU5URiAicm9pLmhlaWdodCAlZFxuIiwgaUhlaWdodAorCisgICAgICAgIEFERCAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisKK0ludGVycG9sYXRlTHVtYQorQmxvY2s0eDRXaWR0aExvb3AKK0Jsb2NrNHg0SGVpZ2h0TG9vcAorCisgICAgICAgIFNUTSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4CisgICAgICAgIE1fU1dJVENIIGluZGV4LCBMCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8wCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8xCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8yCisgICAgICAgIE1fQ0FTRSAgQ2FzZV8zCisgICAgICAgIE1fQ0FTRSAgQ2FzZV80CisgICAgICAgIE1fQ0FTRSAgQ2FzZV81CisgICAgICAgIE1fQ0FTRSAgQ2FzZV82CisgICAgICAgIE1fQ0FTRSAgQ2FzZV83CisgICAgICAgIE1fQ0FTRSAgQ2FzZV84CisgICAgICAgIE1fQ0FTRSAgQ2FzZV85CisgICAgICAgIE1fQ0FTRSAgQ2FzZV9hCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9iCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9jCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9kCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9lCisgICAgICAgIE1fQ0FTRSAgQ2FzZV9mCisgICAgICAgIE1fRU5EU1dJVENICisKK0Nhc2VfMAorICAgICAgICA7Ly8gQ2FzZSBHCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorCitDYXNlXzEKKyAgICAgICAgOy8vIENhc2UgYQorICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV8yCisgICAgICAgIDsvLyBDYXNlIGIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzMKKyAgICAgICAgOy8vIENhc2UgYworICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV80CisgICAgICAgIDsvLyBDYXNlIGQKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNQorICAgICAgICA7Ly8gQ2FzZSBlCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICAKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV82CisgICAgICAgIDsvLyBDYXNlIGYKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfNworICAgICAgICA7Ly8gQ2FzZSBnCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV84CisgICAgICAgIDsvLyBDYXNlIGgKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzkKKyAgICAgICAgOy8vIENhc2UgaQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9hCisgICAgICAgIDsvLyBDYXNlIGoKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2IKKyAgICAgICAgOy8vIENhc2UgaworICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYworICAgICAgICA7Ly8gQ2FzZSBuCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHBTcmMgdG8gb25lIHJvdyBkb3duCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2QKKyAgICAgICAgOy8vIENhc2UgcAorICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9CisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9lCisgICAgICAgIDsvLyBDYXNlIHEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZgorICAgICAgICA7Ly8gQ2FzZSByCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworQmxvY2s0eDRMb29wRW5kCisKKyAgICAgICAgOy8vIFdpZHRoIExvb3AKKyAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzQKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0V2lkdGhMb29wCisKKyAgICAgICAgOy8vIEhlaWdodCBMb29wCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgTV9MRFIgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAorICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAorICAgICAgICBCR1QgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAorCitFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgTU9WICAgICByMCwgIzAKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgICAgICAgICAgICAgICAgIAorCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKQEAgLTAsMCArMSw0OTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAorICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQorICAgIERDVyAgIDMsIDIsIDEsNCAKKyAgICBEQ1cgIC0zLC0yLC0xLDAKKyAgICBEQ1cgICAxLCAyLCAzLDQKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorCitCTEtfU0laRSAgICAgICAgRVFVIDB4OAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKK01VTF9DT05TVDEgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit5ICAgICAgICAgICAgICAgUk4gMTIgICAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitwU3JjTGVmdDIgICAgICAgUk4gMSAgICAKK3BEc3QyICAgICAgICAgICBSTiAyICAgIAorc3VtMSAgICAgICAgICAgIFJOIDYgICAgCitzdW0yICAgICAgICAgICAgUk4gNyAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAorZHN0U3RlcHgyICAgICAgIFJOIDExICAgCitsZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKK291dGVyQ291bnQgICAgICBSTiAxNCAgIAorcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCityMHgwMEZGMDBGRiAgICAgUk4gMTEgICAKKwordFZhbDAgICAgICAgICAgIFJOIDAgICAgCit0VmFsMSAgICAgICAgICAgUk4gMSAgICAKK3RWYWwyICAgICAgICAgICBSTiAyICAgIAordFZhbDMgICAgICAgICAgIFJOIDMgICAgCit0VmFsNCAgICAgICAgICAgUk4gNCAgICAKK3RWYWw1ICAgICAgICAgICBSTiA1ICAgIAordFZhbDYgICAgICAgICAgIFJOIDYgICAgCit0VmFsNyAgICAgICAgICAgUk4gNyAgICAKK3RWYWw4ICAgICAgICAgICBSTiA4ICAgIAordFZhbDkgICAgICAgICAgIFJOIDkgICAgCit0VmFsMTAgICAgICAgICAgUk4gMTAgICAKK3RWYWwxMSAgICAgICAgICBSTiAxMSAgIAordFZhbDEyICAgICAgICAgIFJOIDEyICAgCit0VmFsMTQgICAgICAgICAgUk4gMTQgICAKKworYiAgICAgICAgICAgICAgIFJOIDE0ICAgCitjICAgICAgICAgICAgICAgUk4gMTIgICAKKworcDJwMCAgICAgICAgICAgIFJOIDAgICAgCitwM3AxICAgICAgICAgICAgUk4gMSAgICAKK3A2cDQgICAgICAgICAgICBSTiAyICAgIAorcDdwNSAgICAgICAgICAgIFJOIDQgICAgCisKK3BwMnBwMCAgICAgICAgICBSTiA2ICAgIAorcHAzcHAxICAgICAgICAgIFJOIDcgICAgCitwcDZwcDQgICAgICAgICAgUk4gOCAgICAKK3BwN3BwNSAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCitPTVhfVkNfQ0hST01BX0RDCisgICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgYXZhaWxhYmlsaXR5LCMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICgjT01YX1ZDX1VQUEVSIHwgI09NWF9WQ19MRUZUKSkKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwCisgICAgICAgIEJORSAgICAgIFRTVF9VUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCisgICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIHN1bTEsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICBzdW0yLCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDggKyB0VmFsOQorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIAorICAgICAgICBMRFJCICAgICB0VmFsNCwgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTIsW3BTcmNMZWZ0Ml0gICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDE0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsMTQsICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGxlZnRzdW0yICsgMgorICAgICAgICBBREQgICAgICB0VmFsOSwgc3VtMiwgICAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB1cHN1bTIgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTEsICBzdW0xLCB0VmFsMiAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gdXBzdW0xICsgbGVmdHN1bTEKKyAgICAgICAgQUREICAgICAgc3VtMiwgIHN1bTIsIHRWYWwxNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgPSB1cHN1bTIgKyBsZWZ0c3VtMgorICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KQorICAgICAgICBNT1YgICAgICBzdW0xLCAgc3VtMSwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KT4+MworICAgICAgICBNT1YgICAgICB0VmFsOSwgdFZhbDksIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw5ICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgdFZhbDgsIHRWYWw4LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOCArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsICBzdW0yLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpPj4zCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsMCwgc3VtMSwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsMSwgdFZhbDkscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOSwgc3VtMiwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCAwIHRvIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9VUFBFUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICAKKyAgICAgICAgQk5FICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgc3VtMSwgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHN1bTIsICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHN1bTEsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHN1bTIsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK1RTVF9MRUZUIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MyAgICAgICAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJORSAgICAgIFRTVF9DT1VOVDAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsNCArIHRWYWwxMgorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQorICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQorICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBzdW0xLCAgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gc3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCisgICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIEFERCAgICAgIHN1bTIsICB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgIDsvLyBzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCisgICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCisgICAgICAgIAorICAgICAgICBNVUwgICAgICB0VmFsNiwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgTU9WICAgICAgdFZhbDcsdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQorICAgICAgICBNT1YgICAgICB0VmFsOSx0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBzdW0yCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK1RTVF9DT1VOVDAKKyAgICAgICAgTERSICAgICAgc3VtMSwgPU1VTF9DT05TVDEgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IDB4ODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsNywgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsIGxlZnRTdGVwICAgICAgOy8vIGxlZnRTdGVweDIgPSBsZWZ0U3RlcCAqIDIKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyID0gcERzdCArIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjNCAgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgNAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQorICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbNF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbN10KKyAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ19DSFJPTUFfVkVSVAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDd9ICAgICAgICAgICAgOy8vIHRWYWwgNiB0byA3ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKKyAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKKworICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfQ0hST01BX1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjMyAgOy8vIDcqbGVmdFN0ZXAKKyAgICAgICAgTERSQiAgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMrN10gICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XQorICAgICAgICBMRFJCICAgICB0VmFsNiwgW3BTcmNMZWZ0LCArdFZhbDE0XSAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsICMrNiBdICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzBdCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gVjAgPSBwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIEgwID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSAgICAgICAgCisgICAgICAgIExTTCAgICAgIHRWYWwyLCB0VmFsMiwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxTXSkKKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksdFZhbDEwICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCisgICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlLCMrNV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0KKyAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysxXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxXQorICAgICAgICBBREQgICAgICB0VmFsOSwgdFZhbDksIHRWYWw5LCBMU0wgIzEgICAgICAgICA7Ly8gSDEgPSAzICogKHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXSkKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw5LCB0VmFsNywgTFNMICMyICAgICAgICAgOy8vIEggPSBIMSArIEgwCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KKyAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsIys0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzJdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzJdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBIID0gSCArIEgyCisgICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDE0LGxlZnRTdGVwICAgICAgICAgICAgIDsvLyA2KmxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgcFNyY0xlZnQsIHRWYWwxMSAgICAgICAgICAgIDsvLyBwU3JjTGVmdCArIDYqbGVmdFN0ZXAKKyAgICAgICAgTU9WICAgICAgdFZhbDEyLCBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIEggPSBIICsgSDMKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzQgICAgICAgICA7Ly8gMTcgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNyAqIEggKyAxNgorICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICBiLCB0VmFsNywgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYiA9ICgxNyAqIEggKyAxNikgPj4gNQorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gVjEgPSAzICogKHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDYsIExTTCAjMiAgICAgICAgIDsvLyBWID0gVjAgK1YxCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmIKKyAgICAgICAgU1VCICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNiAtIDMqYgorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcsIExTTCAjMSAgICAgICAgIDsvLyBWID0gViArIFYyCisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCA9TUFTS19DT05TVCAgICAgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIFYgPSBWICsgVjcKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQgICAgICAgICAgICAgICAgOy8vIGRzdFN0ZXAgLSA0CisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDYsIExTTCAjNCAgICAgICAgIDsvLyAxNypWCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNypWICsgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBU1IgICAgICBjLCB0VmFsNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYyA9ICgxNypWICsgMTYpPj41CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDYsIGMsIGMsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYworICAgICAgICBVWFRIICAgICBjLCBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb25seSBpbiBoYWxmIHdvcmQKKyAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIGEgLSAzKmIgLSAzKmMgKyAxNgorICAgICAgICBPUlIgICAgICBjLCBjLCBjLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gYyBjCisgICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAyYgorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcHAyID0gZCArIDIqYgorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gM2IKKyAgICAgICAgT1JSICAgICAgcDJwMCwgICB0VmFsNiwgIHRWYWwyLCAgTFNMICMxNiAgICAgOy8vIHAycDAgICA9IHBhY2sge3AyLCBwMH0KKyAgICAgICAgVVhUSCAgICAgYiwgYgorICAgICAgICBVWFRIICAgICB0VmFsNywgdFZhbDcKKyAgICAgICAgT1JSICAgICAgYiwgYiwgYiwgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIHtiLGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjMTYgICAgICAgIDsvLyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDJwMCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwM3AxICAgPSBwMnAwICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwM3AxLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHA2cDQgICA9IHAzcDEgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDZwNCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwN3A1ICAgPSBwNnA0ICsge2IsYn0KKyAgICAgICAgTU9WICAgICAgb3V0ZXJDb3VudCwgI0JMS19TSVpFICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQgICAgICAgIAorICAgICAgICAKK0xPT1BfUExBTkUgICAgICAgIAorCisgICAgICAgIFVTQVQxNiAgIHA3cDUsICAgIzEzLCBwN3A1ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA3KSBjbGlwMTMocDUpCisgICAgICAgIFVTQVQxNiAgIHA2cDQsICAgIzEzLCBwNnA0ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA2KSBjbGlwMTMocDQpCisgICAgICAgIFVTQVQxNiAgIHAzcDEsICAgIzEzLCBwM3AxICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAzKSBjbGlwMTMocDEpCisgICAgICAgIFVTQVQxNiAgIHAycDAsICAgIzEzLCBwMnAwICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAyKSBjbGlwMTMocDApCisgICAgICAgIAorICAgICAgICBBTkQgICAgICBwcDdwcDUsIHIweDAwRkYwMEZGLCBwN3A1LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA3KSBjbGlwOChwNSkKKyAgICAgICAgQU5EICAgICAgcHA2cHA0LCByMHgwMEZGMDBGRiwgcDZwNCwgQVNSICM1ICAgIDsvLyBjbGlwOChwNikgY2xpcDgocDQpCisgICAgICAgIEFORCAgICAgIHBwM3BwMSwgcjB4MDBGRjAwRkYsIHAzcDEsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDMpIGNsaXA4KHAxKQorICAgICAgICBBTkQgICAgICBwcDJwcDAsIHIweDAwRkYwMEZGLCBwMnAwLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAyKSBjbGlwOChwMCkKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIG91dGVyQ291bnQsIG91dGVyQ291bnQsICMxICAgICAgICAgICA7Ly8gb3V0ZXJDb3VudC0tCisgICAgICAKKyAgICAgICAgT1JSICAgICAgcDMyMTAsIHBwMnBwMCwgcHAzcHAxLCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwMyxwMiwgcDEsIHAwfQorICAgICAgICBTVFIgICAgICBwMzIxMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzBdIHRvIHBEc3RbM119ICAKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHA3NjU0LCBwcDZwcDQsIHBwN3BwNSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDcscDYsIHA1LCBwNH0KKyAgICAgICAgTV9TVFIgICAgcDc2NTQsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFs0XSB0byBwRHN0WzddfQorCisgICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A3ICsgY30sIHtwNSArIGN9CisgICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A2ICsgY30sIHtwNCArIGN9CisgICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AzICsgY30sIHtwMSArIGN9CisgICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AyICsgY30sIHtwMCArIGN9CisgICAgICAKKyAgICAgICAgQk5FICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU3MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKQEAgLTAsMCArMSw1MDEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMgICAgCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgRVFVIDB4MTAKK01VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQorTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0CitNVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKK01VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQorTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCisKK3JldHVybiAgICAgICAgICBSTiAwICAgIAoraW5uZXJDb3VudCAgICAgIFJOIDAgICAgCitvdXRlckNvdW50ICAgICAgUk4gMSAgICAKK3BTcmNMZWZ0MiAgICAgICBSTiAxICAgIAorcERzdDIgICAgICAgICAgIFJOIDIgICAgCitzdW0gICAgICAgICAgICAgUk4gNiAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAordGVtcDEgICAgICAgICAgIFJOIDEwICAgCit0ZW1wMiAgICAgICAgICAgUk4gMTIgICAKK2NNdWwxICAgICAgICAgICBSTiAxMSAgIAorY011bDIgICAgICAgICAgIFJOIDEyICAgCitjb3VudCAgICAgICAgICAgUk4gMTIgICAKK2RzdFN0ZXB4MiAgICAgICBSTiAxMSAgIAorbGVmdFN0ZXB4MiAgICAgIFJOIDE0ICAgCityMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKK3IweDAwRkYwMEZGICAgICBSTiAxMQorCit0VmFsMCAgICAgICAgICAgUk4gMCAgICAKK3RWYWwxICAgICAgICAgICBSTiAxICAgIAordFZhbDIgICAgICAgICAgIFJOIDIgICAgCit0VmFsMyAgICAgICAgICAgUk4gMyAgICAKK3RWYWw0ICAgICAgICAgICBSTiA0ICAgIAordFZhbDUgICAgICAgICAgIFJOIDUgICAgCit0VmFsNiAgICAgICAgICAgUk4gNiAgICAKK3RWYWw3ICAgICAgICAgICBSTiA3ICAgIAordFZhbDggICAgICAgICAgIFJOIDggICAgCit0VmFsOSAgICAgICAgICAgUk4gOSAgICAKK3RWYWwxMCAgICAgICAgICBSTiAxMCAgIAordFZhbDExICAgICAgICAgIFJOIDExICAgCit0VmFsMTIgICAgICAgICAgUk4gMTIgICAKK3RWYWwxNCAgICAgICAgICBSTiAxNCAgIAorCitiICAgICAgICAgICAgICAgUk4gMTIgICAKK2MgICAgICAgICAgICAgICBSTiAxNCAgIAorCitwMnAwICAgICAgICAgICAgUk4gMCAgICAKK3AzcDEgICAgICAgICAgICBSTiAxICAgIAorcDZwNCAgICAgICAgICAgIFJOIDIgICAgCitwN3A1ICAgICAgICAgICAgUk4gNCAgICAKK3AxMHA4ICAgICAgICAgICBSTiA2ICAgIAorcDExcDkgICAgICAgICAgIFJOIDcgICAgCitwMTRwMTIgICAgICAgICAgUk4gOCAgICAKK3AxNXAxMyAgICAgICAgICBSTiA5ICAgIAorCitwMzIxMCAgICAgICAgICAgUk4gMTAgICAKK3A3NjU0ICAgICAgICAgICBSTiAxMCAgIAorcDExMTA5OCAgICAgICAgIFJOIDEwICAgCitwMTUxNDEzMTIgICAgICAgUk4gMTAgICAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisgICAgICAgIAorT01YX1ZDXzE2WDE2X1ZFUlQKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9Oy8vIHRWYWwgNiB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gMTVdCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdGFsbCBvdXRzaWRlIHRoZSBsb29wCisKK0xPT1BfVkVSVAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX1ZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCisgICAgICAgIAorT01YX1ZDXzE2WDE2X0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCisgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwICAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNT1YgICAgICB5LCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswIHRvIDNdCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsMSA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjMTIgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgMTIKKyAgICAgICAKK0xPT1BfSE9SICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMCB0byAzXQorICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNVQlMgICAgIHksIHksICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KKyAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzggdG8gMTFdCisgICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzggdG8gMTFdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sIGRzdFN0ZXB4MiAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCisgICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgQk5FICAgICAgTE9PUF9IT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDMgdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfREMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCRVEgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5LHRWYWwxMCx0VmFsMTF9Oy8vIHRWYWwgOCB0byAxMSA9IHBTcmNBYm92ZVswIHRvIDE1XQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw2LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXSArIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEyLCAxNF0KKyAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs4LCAxMF0gKyBwU3JjQWJvdmVbMTIsIDE0XQorICAgICAgICBVWFRCMTYgICB0VmFsMTAsIHRWYWwxMCwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXQorICAgICAgICBVWFRCMTYgICB0VmFsMTEsIHRWYWwxMSwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEzLCAxNV0KKyAgICAgICAgVUFERDE2ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs5LCAxMV0gKyBwU3JjQWJvdmVbMTMsIDE1XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs4XSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzE1XSkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsIHRWYWwyLCBMU1IgIzE2ICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeHRyYWN0IHRoZSBsb3dlciBoYWxmIGZvciByZXN1bHQKKyAgICAgICAgCitUU1RfTEVGVCAgICAgICAgCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gSW5jIENvdW50ZXIgaWYgTGVmdCBpcyBhdmFpbGFibGUKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDEwICsgdFZhbDExCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKKyAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3CisKK1RTVF9DT1VOVCAgICAgICAgCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1ZFUSAgICBzdW0sICMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQorICAgICAgICBDTVAgICAgICBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMSkKKyAgICAgICAgQURERVEgICAgc3VtLCBzdW0sICM4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSA4IGlmKGNvdW50ID09IDEpCisgICAgICAgIEFERE5FICAgIHN1bSwgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW1sZWZ0ICsgc3VtdXBwZXIKKyAgICAgICAgQURETkUgICAgc3VtLCBzdW0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSAxNiBpZihjb3VudCA9PSAyKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIHN1bSwgc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gb25seSBieXRlIHJlc3QgY2xlYXJlZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUkVRICAgIHN1bSwgc3VtLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNCBpZihjb3VudCA9PSAxKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIExTUk5FICAgIHN1bSwgc3VtLCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNSBpZihjb3VudCA9PSAyKQorCitUU1RfQ09VTlQwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgc3VtLCBzdW0sIHN1bSwgTFNMICM4ICAgICAgICAgICAgICAgOy8vIHN1bSByZXBsaWNhdGVkIGluIHR3byBoYWxmd29yZAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCBzdW0sIHN1bSwgTFNMICMxNiAgICAgICAgICAgIDsvLyBzdW0gIHJlcGxpY2F0ZWQgaW4gYWxsIGJ5dGVzCisgICAgICAgIENQWSAgICAgIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw4LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IHRWYWwwCisgICAgICAgIENQWSAgICAgIHRWYWw5LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMyA9IHRWYWwwCisgICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICAKK0xPT1BfREMgICAgICAgIAorICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5CisgICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KKyAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMT09QX0RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKworT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICM0ICA7Ly8gdFZhbDE0ID0gMTUqbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCisgICAgICAgIExEUkIgICAgIHRWYWwxMCwgW3BTcmNMZWZ0LCAgdFZhbDE0XSAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgTERSQiAgICAgdFZhbDExLCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgOy8vIHRWYWwxMSA9IHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDEyLCBbcFNyY0Fib3ZlLCAjMTVdCisKKyAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMTIsICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KKyAgICAgICAgU1VCICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCA9IFYwID0gcFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBTVUIgICAgICB0VmFsMTEsIHRWYWwxMiwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gSDAgPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwyLCAgIExTTCAjNCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSA9IDE2ICogKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0pCisKKyAgICAgICAgTU9WICAgICB0VmFsMTEsIHRWYWwxMSwgTFNMICMzICAgICAgICAgICAgICA7Ly8gOCpbMTVdLVstMV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzBdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxNF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIFJTQiAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMzICAgICAgICAgOy8vIDcqWzE0XS1bMF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzFdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxM10KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOAorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyA2KlsxM10tWzFdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMyXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTJdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMiAgICAgICAgIDsvLyA1KlsxMl0tWzJdCisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4CisgICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMzXQorICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTFdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMyICAgICAgIDsvLyArIDQqWzExXS1bM10KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzRdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMF0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDMqWzEwXS1bNF0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzVdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM5XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsIExTTCAjMSAgICAgICA7Ly8gKyAyKls5XS1bNV0KKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzZdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM4XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyAxKls4XS1bNl0KKyAgICAgICAgQUREICAgICB0VmFsNywgdFZhbDExLCB0VmFsOAorCisgICAgICAgIEFERCAgICAgIHRWYWwyLCAgdFZhbDIsICAgIzE2ICAgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYKKyAgICAgICAgTU9WICAgICAgdFZhbDEsICBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHBTcmNMZWZ0CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCAgdFZhbDE0LCAgIGxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOSAgPSAxNCpsZWZ0U3RlcAorICAgICAgICBBREQgICAgICB0VmFsOSwgIHBTcmNMZWZ0LCB0VmFsOSAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcFNyY0xlZnQgKyAxNCpsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0xlZnRbMF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgIHRWYWw3LCAgTFNMICMyICAgICAgOy8vIHRWYWw3ICA9IDUgKiBICisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAjMzIgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSA1ICogSCArIDMyCisgICAgICAgIFNVQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQorICAgICAgICBBU1IgICAgICB0VmFsMTIsIHRWYWw3LCAgIzYgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gYiA9ICg1ICogSCArIDMyKSA+PiA2CisgICAgICAgIAorICAgICAgICBSU0IgICAgICB0VmFsOCwgIHRWYWw4LCAgdFZhbDgsICBMU0wgIzMgICAgICA7Ly8gdFZhbDggID0gVjEgPSA3KiAocFNyY0xlZnRbMTQqbGVmdFN0ZXBdLXBTcmNMZWZ0WzBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDEwLCBMU0wgIzMgICAgICA7Ly8gdFZhbDYgID0gViA9IFYwICtWMQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTMqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgUlNCICAgICAgdFZhbDcsICB0VmFsMTIsICB0VmFsMTIsICBMU0wgIzMgICAgOy8vIHRWYWw3ICA9IDcqYgorICAgICAgICBTVUIgICAgICB0VmFsMiwgIHRWYWwyLCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSArIDE2IC0gNypiCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEyKmxTXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gMiAqIChwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0pCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSA2ICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjIKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzIgICAgIDsvLyB0VmFsNyAgPSA1ICogKHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMworICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTEqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEwKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjQKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzE2ICAgICAgICAgICAgICAgOy8vIHRWYWw1ICA9IGRzdFN0ZXAgLSAxNgorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDcgID0gMyAqIChwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjUKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjcKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDYsICBMU0wgIzIgICAgIDsvLyB0VmFsNiAgPSA1KlYKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICAjMzIgICAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IDUqViArIDMyCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBBU1IgICAgICB0VmFsMTQsIHRWYWw2LCAgICM2ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gYyA9ICg1KlYgKyAzMik+PjYKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIFJTQiAgICAgIHRWYWw2LCAgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzMgICAgIDsvLyB0VmFsNiAgPSA3KmMKKyAgICAgICAgVVhUSCAgICAgdFZhbDE0LCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMiwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gMipiCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzE2ICAgIDsvLyB0VmFsMTQgPSB7YyAgLCAgY30KKyAgICAgICAgU1VCICAgICAgdFZhbDYsICB0VmFsMiwgICB0VmFsNiAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IGQgPSBhIC0gNypiIC0gNypjICsgMTYKKyAgICAgICAgQUREICAgICAgdFZhbDEsICB0VmFsNiwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHBwMiA9IGQgKyAyKmIKKyAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxMCA9MypiCisgICAgICAgIE9SUiAgICAgIHRWYWwwLCAgdFZhbDYsICAgdFZhbDEsICBMU0wgIzE2ICAgIDsvLyB0dmFsMCAgPSBwMnAwICAgPSBwYWNrIHtwMiwgcDB9CisgICAgICAgIFVYVEggICAgIHRWYWwxMiwgdFZhbDEyICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKKyAgICAgICAgVVhUSCAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwxMiwgIHRWYWwxMiwgTFNMICMxNiAgICA7Ly8gdFZhbDEyID0ge2IgICwgIGJ9CisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDEwLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTAgPSB7M2IgLCAzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDEsICB0VmFsMCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHAzcDEgICA9IHAycDAgICArIHtiLGJ9CisgICAgICAgIFNBREQxNiAgIHRWYWwyLCAgdFZhbDEsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBwNnA0ICAgPSBwM3AxICAgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHRWYWw0LCAgdFZhbDIsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNCAgPSBwN3A1ICAgPSBwNnA0ICAgKyB7YixifQorICAgICAgICBTQUREMTYgICB0VmFsNiwgIHRWYWw0LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gcDEwcDggID0gcDdwNSAgICsgezNiLDNifQorICAgICAgICBTQUREMTYgICB0VmFsNywgIHRWYWw2LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcDExcDkgID0gcDEwcDggICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDgsICB0VmFsNywgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHAxNHAxMiA9IHAxMXA5ICArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDksICB0VmFsOCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw5ICA9IHAxNXAxMyA9IHAxNHAxMiArIHtiLGJ9CisgICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCAgICAgPU1BU0tfQ09OU1QgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKKyAgICAgICAgCitMT09QX1BMQU5FICAgICAgICAKKworICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwM3AxCisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAycDAKKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMnAwLCAgIHAycDAsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwN3A1CisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHA2cDQKKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwNnA0LCAgIHA2cDQsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwMTFwOQorICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTBwOAorICAgICAgICBTQUREMTYgICBwMTFwOSwgIHAxMXA5LCAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAxMHA4LCAgcDEwcDgsICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxNXAxMworICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTRwMTIKKyAgICAgICAgU0FERDE2ICAgcDE1cDEzLCBwMTVwMTMsIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICBwMTRwMTIsIHAxNHAxMiwgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQorICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKKyAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4CisgICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0CisgICAgICAgIAorICAgICAgICBBRERTICAgICByMHgwMEZGMDBGRiwgcjB4MDBGRjAwRkYsICMxPDwyOCAgICAgOy8vIExvb3AgY291bnRlciB2YWx1ZSBpbiB0b3AgNCBiaXRzCisgICAgICAgIAorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKyAgICAgICAgICAgIAorICAgICAgICBFTkQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBmNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCkBAIC0wLDAgKzEsNTY3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAorICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgRENEICBPTVhfVkNfNHg0X0hVICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICAgICAgICBFUVUgMHg4CitNVUxfQ09OU1QwICAgICAgICAgICAgRVFVIDB4MDEwMTAxMDEKK0FERF9DT05TVDEgICAgICAgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXR1cm4gICAgICAgICAgUk4gMAorcFRhYmxlICAgICAgICAgIFJOIDkKK3BjICAgICAgICAgICAgICBSTiAxNQorcjB4MDEwMTAxMDEgICAgIFJOIDEKK3IweDgwODA4MDgwICAgICBSTiAwCisKK3RWYWwwICAgICAgICAgICBSTiAwCit0VmFsMSAgICAgICAgICAgUk4gMQordFZhbDIgICAgICAgICAgIFJOIDIKK3RWYWw0ICAgICAgICAgICBSTiA0Cit0VmFsNiAgICAgICAgICAgUk4gNgordFZhbDcgICAgICAgICAgIFJOIDcKK3RWYWw4ICAgICAgICAgICBSTiA4Cit0VmFsOSAgICAgICAgICAgUk4gOQordFZhbDEwICAgICAgICAgIFJOIDEwCit0VmFsMTEgICAgICAgICAgUk4gMTEKK3RWYWwxMiAgICAgICAgICBSTiAxMgordFZhbDE0ICAgICAgICAgIFJOIDE0CisKK091dDAgICAgICAgICAgICBSTiA2CitPdXQxICAgICAgICAgICAgUk4gNworT3V0MiAgICAgICAgICAgIFJOIDgKK091dDMgICAgICAgICAgICBSTiA5CisKK0xlZnQwICAgICAgICAgICBSTiA2CitMZWZ0MSAgICAgICAgICAgUk4gNworTGVmdDIgICAgICAgICAgIFJOIDgKK0xlZnQzICAgICAgICAgICBSTiA5CisKK0Fib3ZlMDEyMyAgICAgICBSTiAxMgorQWJvdmU0NTY3ICAgICAgIFJOIDE0CisKK0Fib3ZlTGVmdCAgICAgICBSTiAxMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworT01YX1ZDXzR4NF9WRVJUCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbMCAgdG8gM10gID0gQWJvdmUwMTIzCisgICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzQgIHRvIDddICA9IEFib3ZlMDEyMworICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs4ICB0byAxMV0gPSBBYm92ZTAxMjMKKyAgICAgICAgU1RSICAgICAgQWJvdmUwMTIzLCAgW3BEc3RdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTIgdG8gMTVdID0gQWJvdmUwMTIzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02IAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBNVUwgICAgICBPdXQwLCAgIExlZnQwLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQxLCAgIExlZnQxLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQyLCAgIExlZnQyLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RDCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NgorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQk5FICAgICAgVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICB0VmFsMTEsIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgdFZhbDExLCAgTFNSICMxNiAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgVVhUSCAgICAgdFZhbDExLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgQUREICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gTGVmdDIgKyBMZWZ0MworICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsNiArIHRWYWw3CisgICAgICAgIEFERCAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyBPdXQwICA9IHRWYWw2ICsgdFZhbDExICAgCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjNCAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyA0CisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgIExTUiAjMyAgICAgICAgICAgICAgIDsvLyBPdXQwID0gKE91dDAgKyA0KT4+MworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCTkUgICAgICBMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIE91dDAsICAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMTYgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIE91dDAsICAgT3V0MCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgIHRvIDcgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICAKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIE91dDAsICAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICBPdXQxLCAgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gT3V0MSAgPSBMZWZ0MiArIExlZnQzCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBPdXQxICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgICsgT3V0MQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitOb25lQXZhaWxhYmxlCisgICAgICAgIE1PViAgICAgIE91dDAsICAgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXQwID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gZiA9IChhKzIqYitjKzIpPj4yCisgICAgICAgIDsvLyBDYWxjdWxhdGUgYXM6CisgICAgICAgIDsvLyBkID0gKGEgKyBjICk+PjEKKyAgICAgICAgOy8vIGUgPSAoZCAtIGInKT4+MQorICAgICAgICA7Ly8gZiA9IGUgKyAxMjgKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUICAgICAgICAgICAgICAgICAgCisgICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwgIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIEJORSAgICAgIERMVXBwZXJSaWdodEF2YWlsYWJsZQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNT1YgICAgICB0VmFsNywgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDExLCB0VmFsNywgIExTTCAjMjQgICAgICAgICAgICAgOy8vIHtVMywgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIE1VTCAgICAgIE91dDMsICAgdFZhbDcsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgVTMgfSAKKyAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gezAwJywgVTMnLCBVMicsIFUxJ30KKyAgICAgICAgVUhBREQ4ICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZDEsICBkMCB9CisgICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7eHgsICBkMiwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIGUyLCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICB4eCwgIGYxLCAgZjAgfQorICAgICAgICBVQUREOCAgICB0VmFsNiwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgZjIsICB4eCwgIHh4IH0KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBQS0hCVCAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDYgICAgICAgICAgICAgICA7Ly8ge3h4LCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgQklDICAgICAgdFZhbDYsICB0VmFsNiwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHswMCwgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB7VTMsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgT3V0MywgICBPdXQwLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIGYyLCAgZjEgfQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgZjIgfQorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK0RMVXBwZXJSaWdodEF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmU0NTY3LCBMU0wgIzggICA7Ly8ge1U2LCAgVTUsICBVNCwgIFUzIH0KKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIEFib3ZlNDU2NywgTFNMICMyNCAgOy8vIHtVNCwgIFUzLCAgVTIsICBVMSB9CisgICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB7VTUsICBVNCwgIFUzLCAgVTIgfQorICAgICAgICBNVk4gICAgICB0VmFsMSwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U2JywgVTUnLCBVNCcsIFUzJ30KKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNCcsIFUzJywgVTInLCBVMSd9CisgICAgICAgIE1WTiAgICAgIHRWYWwyLCAgQWJvdmU0NTY3ICAgICAgICAgICAgICAgICAgIDsvLyB7VTcnLCBVNicsIFU1JywgVTQnfQorICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge2QzLCAgZDIsICBkMSwgIGQwIH0KKyAgICAgICAgVUhBREQ4ICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NyAgICAgICAgICAgOy8vIHtkNSwgIGQ0LCAgZDMsICBkMiB9CisgICAgICAgIFVIQUREOCAgIHRWYWw4LCAgQWJvdmU0NTY3LCAgdFZhbDggICAgICAgICAgIDsvLyB7ZDYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge2UzLCAgZTIsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIHtlNSwgIGU0LCAgZTMsICBlMiB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB7ZTYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2YzLCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNiwgIHh4LCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjUsICBmNCwgIGYzLCAgZjIgfQorICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gezAwLCAgZjMsICBmMiwgIGYxIH0KKyAgICAgICAgQU5EICAgICAgdFZhbDksICB0VmFsOSwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHtmNiwgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIFBLSEJUICAgIE91dDEsICAgdFZhbDcsICBPdXQyLCAgTFNMICM4ICAgICAgIDsvLyB7ZjQsICBmMywgIGYyLCAgZjEgfQorICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgT3V0MiwgIExTUiAjOCAgICAgICA7Ly8ge2Y2LCAgZjUsICBmNCwgIGYzIH0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCisKK09NWF9WQ180eDRfRElBR19EUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MCwgIExTTCAjOCAgICAgIDsvLyB0VmFsNyA9IDAwIDAwIEwwIEwxCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgPUFERF9DT05TVDEgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBPUlIgICAgICB0VmFsOCwgIExlZnQzLCAgTGVmdDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDggPSAwMCAwMCBMMiBMMworICAgICAgICBQS0hCVCAgICB0VmFsNywgIHRWYWw4LCAgdFZhbDcsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSBMMCBMMSBMMiBMMworICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw3LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBMMCBMMSBMMgorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmVMZWZ0ICAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCBVTAorICAgICAgICBPUlIgICAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmVMZWZ0LCBMU0wgIzI0ICA7Ly8gdFZhbDkgPSBVTCBMMCBMMSBMMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTTCAjMjQgICAgICAgICA7Ly8gdFZhbDEwPSBVMCAwMCAwMCAwMAorICAgICAgICBVWFRCICAgICB0VmFsMTEsIHRWYWw3LCAgUk9SICMyNCAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBMMAorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDksICBMU1IgIzggICAgICA7Ly8gdFZhbDEwPSBVMCBVTCBMMCBMMQorICAgICAgICBPUlIgICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsICBMU0wgIzggICAgICA7Ly8gdFZhbDExPSBVMSBVMCBVTCBMMAorICAgICAgICBVSEFERDggICB0VmFsMTEsIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDExPSBkMSBkMCBkTCBnMAorICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw3LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBnMCBnMSBnMiBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVMidVMSdVMCdVTCcKKyAgICAgICAgTVZOICAgICAgdFZhbDksICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gVUwnTDAnTDEnTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGUxIGUwIGVMIGgwCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGgwIGgxIGgyIGgzCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDEwLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGkwIGkxIGkyIGkzCisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwICA9IGYxIGYwIGZMIGkwCisgICAgICAgIFVYVEggICAgIHRWYWwxMSwgT3V0MywgICBST1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIGkxIGkyCisgICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNyA9IGYwIGZMIGkwIDAwCisgICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDcsICB0VmFsMTEsICBMU1IgIzggICAgIDsvLyBPdXQxICA9IGYwIGZMIGkwIGkxCisgICAgICAgIFBLSEJUICAgIE91dDIsICAgdFZhbDExLCBPdXQwLCAgICBMU0wgIzE2ICAgIDsvLyBPdXQyICA9IGZMIGkwIGkxIGkyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjEgdG8gaTB9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjAgdG8gaTF9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZkwgdG8gaTJ9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTAgdG8gaTN9IGF0IHBEc3RbMTUgdG8gMTJdIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9WUgorCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCAgICAgPSAwMCAwMCAwMCBMMAorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgICAgID0gMDAgMDAgMDAgTDEKKyAgICAgICAgTERSQiAgICAgTGVmdDIsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQyICAgICA9IDAwIDAwIDAwIEwyCisgICAgICAgIE1PViAgICAgIHRWYWwwLCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMCAgICAgPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gVTMgVTIgVTEgVTAgCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDAsICAgQWJvdmVMZWZ0ICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMiBVMSBVMCBVTAorICAgICAgICBNVk4gICAgICB0VmFsMTEsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDExICAgID0gVTInVTEnVTAnVUwnCisgICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCAwMAorICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZDIgZDEgZDAgZEwKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCBBYm92ZUxlZnQsIExlZnQxICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IDAwIDAwIDAwIGoxICAgICAgIAorICAgICAgICBNVk4gICAgICB0VmFsNCwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgTDAnCisgICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDEwLCAgdFZhbDQgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBrMQorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwwLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDEyICAgID0gVTIgVTEgVTAgTDAKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMiwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxIFUwIFVMIEwwCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDksICAgdFZhbDE0ICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBnMyBnMiBnMSBnMAorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxLCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MCAgICAgID0gZTIgZTEgZTAgZUwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGgzIGgyIGgxIGgwCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTIgdG8gZUx9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1PViAgICAgIHRWYWwxLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsNiwgIE91dDAsICAgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDYgICAgID0gZTEgZTAgZUwgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsMiwgICBMZWZ0MSAgICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIEwxCisgICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBsMSAgICAgICAgCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDEwLCAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQxICAgICAgPSBpMyBpMiBpMSBpMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEnVTAnVUwnTDEnCisgICAgICAgIE9SUiAgICAgIHRWYWwxLCAgdFZhbDEsICAgTGVmdDIgICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCBMMgorICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw2LCAgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gT3V0MiAgICAgID0gZTEgZTAgZUwgbDEKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEsICB0VmFsMSwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGcyIGcxIGcwIGoyCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7aTMgdG8gaTB9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTEgdG8gbDF9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEsICAgdFZhbDIgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBoMiBoMSBoMCBrMgorICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWw5LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MyAgICAgID0gaTIgaTEgaTAgbDIKKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMiB0byBsMn0gYXQgcERzdFsxNSB0byAxMl0gCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfSEQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IDAwIDAwIDAwIEwwCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IDAwIDAwIDAwIEwxCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IDAwIDAwIDAwIEwyCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IDAwIDAwIDAwIEwzCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgQWJvdmVMZWZ0LCBBYm92ZTAxMjMsIExTTCAjODsvLyB0VmFsMiA9IFUyIFUxIFUwIFVMCisgICAgICAgIE1WTiAgICAgIHRWYWwxLCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIEwwJworICAgICAgICBPUlIgICAgICB0VmFsNCwgIExlZnQwLCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDQgPSBVMSBVMCBVTCBMMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBVMidVMSdVMCdVTCcKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWw0ID0gZzMgZzIgZzEgZzAKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZUxlZnQsICB0VmFsMSAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZEwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaDMgaDIgaDEgaDAKKyAgICAgICAgVUFERDggICAgdFZhbDEsICB0VmFsMSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZUwKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gaTMgaTIgaTEgaTAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICBMZWZ0MCwgIEFib3ZlTGVmdCwgIExTTCAjMTYgOy8vIHRWYWwyID0gMDAgVUwgMDAgTDAKKyAgICAgICAgTU9WICAgICAgdFZhbDQsICB0VmFsNCwgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTIgaTEgaTAgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MSwgIExlZnQwLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDAgMDAgTDEKKyAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDEgMDAgTDIKKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCBMZWZ0MywgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMD0gMDAgTDIgMDAgTDMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNCwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gaTIgaTEgaTAgZUwKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdIAorICAgICAgICBNT1YgICAgICB0VmFsNCwgIE91dDAsICAgTFNMICMxNiAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMSBpMCAwMCAwMAorICAgICAgICBVSEFERDggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBqMSAwMCBqMgorICAgICAgICBVSEFERDggICB0VmFsNiwgIHRWYWwxMSwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBqMiAwMCBqMworICAgICAgICBNVk4gICAgICB0VmFsMTIsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMCcwMCBMMScKKyAgICAgICAgTVZOICAgICAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxND0gMDAgTDEnMDAgTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGsxIDAwIGsyCisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDcsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGQxIDAwIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDYsICB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGsyIDAwIGszCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEwLCB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGQyIDAwIGQzCisgICAgICAgIFVBREQ4ICAgIHRWYWwyLCAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGwxIDAwIGwyCisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUxIDAwIGUyCisgICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGwyIDAwIGwzCisgICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDksICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGUyIDAwIGUzCisgICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDgsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyBPdXQyICA9IGwxIGUxIGwyIGUyCisgICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICB0VmFsMTEsIExTTCAjOCAgICAgIDsvLyBPdXQzICA9IGwyIGUyIGwzIGUzCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgdFZhbDQsICBPdXQyLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQxICA9IGkxIGkwIGwxIGUxCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfVkwKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTU9WICAgICAgdFZhbDExLCBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgVTMKKyAgICAgICAgTVVMRVEgICAgQWJvdmU0NTY3LCB0VmFsMTEsIHIweDAxMDEwMTAxICAgICAgOy8vIEFib3ZlNDU2NyA9IFUzIFUzIFUzIFUzCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIFUzIFUyIFUxCisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFUzJ1UyJ1UxJ1UwJworICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWw5LCAgQWJvdmU0NTY3LCAgTFNMICMyNCA7Ly8gdFZhbDIgPSBVNCBVMyBVMiBVMQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBkNCBkMyBkMiBkMQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCA9IGU0IGUzIGUyIGUxCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw5LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCAwMCBVMyBVMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlNDU2NywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCAwMAorICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8gdFZhbDkgPSBVNSBVNCBVMyBVMgorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCBVMworICAgICAgICBVSEFERDggICB0VmFsMTEsIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDExPSBnNSBnNCBnMyBnMgorICAgICAgICBVSEFERDggICB0VmFsMTQsIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSBnNiBnNSBnNCBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVNCdVMydVMidVMScKKyAgICAgICAgTVZOICAgICAgdFZhbDcsICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gVTUnVTQnVTMnVTInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IGQ1IGQ0IGQzIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGg1IGg0IGgzIGgyCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IGg2IGg1IGg0IGgzCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQxICA9IGk1IGk0IGkzIGkyCisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQyICA9IGU1IGU0IGUzIGUyCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGk2IGk1IGk0IGkzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIE1fU1RSICAgIE91dDMsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9IVQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1PViAgICAgIHIweDgwODA4MDgwLCAgcjB4MDEwMTAxMDEsIExTTCAjNyAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNiA9IDAwIEwxIDAwIEwwCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwyIDAwIEwxCisgICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDIsICBMZWZ0MywgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwzIDAwIEwyCisgICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyBPdXQzICA9IEwzIEwzIEwzIEwzCisgICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIEwyJzAwIEwxJworICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSAwMCBMMycwMCBMMicKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgZzMgMDAgZzIKKyAgICAgICAgVVhUQjE2ICAgdFZhbDEyLCBPdXQzICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDMgMDAgTDMKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaDMgMDAgaDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gMDAgZDIgMDAgZDEKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZDMgMDAgZDIKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgZzQgMDAgZzMKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaTMgMDAgaTIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaDQgMDAgaDMKKyAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTIgMDAgZTEKKyAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZTMgMDAgZTIKKyAgICAgICAgVUFERDggICAgdFZhbDEyLCB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaTQgMDAgaTMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsOCwgIHRWYWw0LCAgTFNMICM4ICAgICAgOy8vIE91dDAgID0gaTMgZTIgaTIgZTEKKyAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsMTEsIHRWYWwxMiwgTFNMICM4ICAgICAgOy8vIE91dDEgID0gaTQgZTMgaTMgZTIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQyICA9IEwzIEwzIGk0IGUzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTk3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsMTI4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgIAorCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICBSTiAwCitwRHN0ICAgICAgICBSTiAxCitRUCAgICAgICAgICBSTiAyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgIFJOIDkKK1ZhbHVlICAgICAgIFJOIDQKK1ZhbHVlMiAgICAgIFJOIDUKK0ZsYWcgICAgICAgIFJOIDYKK3N0ck9mZnNldCAgIFJOIDcKK2NzdE9mZnNldCAgIFJOIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjB3MCAgICAgICAgUk4gIDMKK3IwdzEgICAgICAgIFJOICA0CisKK2MwdzAgICAgICAgIFJOICA1CitjMXcwICAgICAgICBSTiAgNgorCityZXR1cm4gICAgICBSTiAgMAorcFFQRGl2VGFibGUgUk4gIDUKK3BRUE1vZFRhYmxlICAgIFJOICA2CitTaGlmdCAgICAgICAgUk4gIDkKK1NjYWxlICAgICAgICBSTiAgMgorCitUZW1wMSAgICAgICBSTiAgMworVGVtcDIgICAgICAgUk4gIDQKK1RlbXAzICAgICAgIFJOICA3CitUZW1wNCAgICAgICBSTiAgOAorCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCisgICAgICAgIAorCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKKworCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQorICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KKyAgICAgICAgCisgICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQorICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KKyAgICAgICAgCisgICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIAorICAgICAgICBTTVVMVEIgICBUZW1wMiwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUKKyAgICAgICAgU01VTFRCICAgVGVtcDQsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlCisgICAgICAgIFNNVUxCQiAgIFRlbXAxLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZQorICAgICAgICBTTVVMQkIgICBUZW1wMywgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUKKyAgICAgICAgTU9WICAgICAgVGVtcDIsIFRlbXAyLCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVGVtcDIgPj4gMSAmIFRlbXAxID0gKFRlbXAxID4+IDEpIDw8IDE2CisgICAgICAgIE1PViAgICAgIFRlbXA0LCBUZW1wNCwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFRlbXA0ID4+IDEgJiBUZW1wMyA9IChUZW1wMyA+PiAxKSA8PCAxNgorICAgICAgICBQS0hCVCAgICBjMHcwLCAgVGVtcDIsIFRlbXAxLCBMU0wgIzE1ICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAxIHwgVGVtcDIgfAorICAgICAgICBQS0hCVCAgICBjMXcwLCAgVGVtcDQsIFRlbXAzLCBMU0wgIzE1ICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAzIHwgVGVtcDQgfAorICAgICAgICBTVE1JQSAgICBwRHN0LCB7YzB3MCwgYzF3MH0gICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgIAorICAgIAorICAgIAorICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSw0NjkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMgCisKKworOy8vSW5wdXQgUmVnaXN0ZXJzCitwRGF0YSAgICAgICAgICAgICAgIFJOICAwCitRUCAgICAgICAgICAgICAgICAgIFJOICAxCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAoraW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCitpbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KK2luMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQoraW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCitpbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQoraW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KK2luMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCisKKzsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCit0clJvdzAwICAgICAgICAgICAgIFJOICAyCit0clJvdzEwICAgICAgICAgICAgIFJOICAxMAordHJSb3cwMiAgICAgICAgICAgICBSTiAgMwordHJSb3cxMiAgICAgICAgICAgICBSTiAgNQordHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKK3RyUm93MzAgICAgICAgICAgICAgUk4gIDEyCit0clJvdzMyICAgICAgICAgICAgIFJOICAxNAordHJSb3cyMiAgICAgICAgICAgICBSTiAgNworCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworcm93U3VtMSAgICAgICAgICAgICBSTiAgNAorcm93U3VtMiAgICAgICAgICAgICBSTiAgNgorcm93RGlmZjEgICAgICAgICAgICBSTiAgOAorcm93RGlmZjIgICAgICAgICAgICBSTiAgOQorCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2NvbFN1bTEgICAgICAgICAgICAgUk4gIDEwCitjb2xTdW0yICAgICAgICAgICAgIFJOICAxMQorY29sRGlmZjEgICAgICAgICAgICBSTiAgMTIKK2NvbERpZmYyICAgICAgICAgICAgUk4gIDE0CisKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitjb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK2NvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitjb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitjb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCisKKzsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKK3BRUERpdlRhYmxlICAgICAgICAgUk4gIDAKK3BRUE1vZFRhYmxlICAgICAgICAgUk4gIDExCitTaGlmdCAgICAgICAgICAgICAgIFJOICAxMAorU2NhbGUgICAgICAgICAgICAgICBSTiAgMTQKK1JvdW5kICAgICAgICAgICAgICAgUk4gIDAKKwordGVtcDEgICAgICAgICAgICAgICBSTiAgMTAKK3RlbXAyICAgICAgICAgICAgICAgIFJOICAxMQordGVtcDMgICAgICAgICAgICAgICBSTiAgMTIKK3RlbXA0ICAgICAgICAgICAgICAgUk4gIDEKKworCisKKzsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCitvdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK291dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitvdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK291dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitvdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCisgICAgICAKKyAgICAgICAgCisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCAgICBwRGF0YU9uU3RhY2ssIDQKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjExCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKKyAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgCisgICAgICAgIExETUlBICAgcERhdGEse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKKyAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAorICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAorICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKKyAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKKyAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMCxpbjEwLGluMDAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0gICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMCxpbjAwLGluMTAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0clJvdzMwLGluMTIsaW4wMixBU1IgIzE2ICAgICAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyUm93MjAsaW4wMixpbjEyLExTTCAjMTYgICAgICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAorICAgICAgICAKKyAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgLSAtIGQyIGQzIAorICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHRyUm93MDIsaW4yMCxpbjMwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMixpbjMwLGluMjAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzMyLGluMzIsaW4yMixBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJSb3cyMixpbjIyLGluMzIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMDAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMzAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCisgICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQorICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gU3RvcmUgcERhdGEoUk4wKSBvbiBzdGFjayBhbmQgcmVzdG9yZSBpdCBvbmx5IGF0IHRoZSBmaW5hbCBzdG9yZSBiYWNrCisgICAgICAgIDsvLyBUaGlzIGZyZWVzIHVwIGEgcmVnaXN0ZXIgKFJOMCkgd2hpY2ggaXMgdXNlZCB0byByZWR1Y2UgbnVtYmVyIG9mIGludGVybWVkaWF0ZSBzdGFsbHMgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgICAgIHBEYXRhLHBEYXRhT25TdGFjaworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgTERSICAgICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSU0IgICAgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIExEUlNCICAgICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKKyAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgorICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKKyAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAorICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKKyAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBSb3VuZCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJvdW5kID0gMgorICAgICAgICBMU0wgICAgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MDAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDAyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDEwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQxMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDMKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMiAKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQyMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MjIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0CisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBwRGF0YSxwRGF0YU9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEYXRhIHBvaW50ZXIgZnJvbSBzdGFjaworICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDMwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQzMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3N0b3JlX2NvZWZmCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEYXRhLHtvdXQwMCxvdXQwMixvdXQxMCxvdXQxMixvdXQyMCxvdXQyMixvdXQzMCxvdXQzMn0KKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORCAgICAgICAgCisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAorICAgIAorCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgICAgICAgICAgUk4gIDAKK3BEc3QgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjIgICAgICAgICAgICAgICAgUk4gIDIKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERzdFI0ICAgICAgICAgICAgICBSTiAgNAorcERzdFIwICAgICAgICAgICAgICBSTiAgMAorUVBSMSAgICAgICAgICAgICAgICBSTiAgMQorUVBSNSAgICAgICAgICAgICAgICBSTiAgNQorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQorICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCisgICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAorICAgIAorCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxMTVkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY4NjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAorCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWU1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCkBAIC0wLDAgKzEsNzUgQEAKKzsgLyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgQ2xpcHBpbmcgMTYgYml0IHZhbHVlIHRvIFswLDI1NV0gUmFuZ2UKKzsgKi8gCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgCisgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBMb2NhbCB2YXJpYWJsZXMKKworeDAgICAgICAgICAgICAgICAgICAgUk4gMworeDEgICAgICAgICAgICAgICAgICAgUk4gNAoreDIgICAgICAgICAgICAgICAgICAgUk4gNQoreDMgICAgICAgICAgICAgICAgICAgUk4gNgorCitDb3VudCAgICAgICAgICAgICAgICBSTiAxNAorICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4LHI2CisgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgIENvdW50LCM4Citsb29wCisKKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MCwgeDF9CisgICAgICAgIFNVQlMgICAgICAgICBDb3VudCxDb3VudCwgIzEgICAgICAgICAgOy8vIGNvdW50IGRvd24KKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MiwgeDN9CisgICAgICAgIFVTQVQxNiAgICAgICB4MCwgIzgsIHgwICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFVTQVQxNiAgICAgICB4MSwgIzgsIHgxICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3RdCisgICAgICAgIE1PViAgICAgICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdCwjMV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjMl0KKyAgICAgICAgTU9WICAgICAgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMzXQorICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICAgeDIsICM4LCB4MiAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBVU0FUMTYgICAgICAgeDMsICM4LCB4MyAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM0XQorICAgICAgICBNT1YgICAgICAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzVdCisgICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzZdCisgICAgICAgIE1PViAgICAgICAgICB4MywgeDMsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjN10KKyAgICAgICAgQUREICAgICAgICAgIHBEc3QscERzdCxzdGVwICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBieSBzdGVwIHZhbHVlCisgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgIGxvb3AgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb250aW51ZSBsb29wIHVudGlsIENvdW50IHJlYWNoZXMgNjQgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMDkwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzOTggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQorICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAorICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAKKworICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQorCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCisgICAgICAgIAorICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCisgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKKworZnR5cGUyCisKKyAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCisgICAgICAgIAorRmlsbFZMREwxICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKKyAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAorIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAKK3N0b3JlTGV2ZWxMMQorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworIAorCisKKyAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKKworRXNjYXBlTW9kZTMKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCisKKyAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQorICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2CisgICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgICAgIAorCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKworCisgCitzdG9yZUxldmVsTGFzdAorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCisgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgICAKK2VuZAorCisgICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKKworICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cworCisgICAgICAgIAorRXhpdE9rCisgICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAorICAgCisgICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKworICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgICAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCisgICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgorCitFeGl0RXJyb3IKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworZXhpdDIKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRkMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDIxMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisKKworCisvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKKworLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6CisvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cworLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKKy8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCisvLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0CisvLworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCisvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCisvLworLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorCisvLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQorLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCisvLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKKyAKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCisgICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCisgICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCisgICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCisgICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCisgICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCisgICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCisgICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCisgICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCisgICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCisgICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCisgICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCisgICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCisgICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCisgICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCisgICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCisgICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCisgICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCisgICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCisgICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCisgICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCisgICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKK307CisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKKworCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKKyAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKKyAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKKyAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKKyAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKKyAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKKyAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKKyAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKKyAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKKyAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAoreworICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCisgICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAoreworICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKKyAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisKKwk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEKK307CisKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Cit7CisgICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCisJCisJMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2Y4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpAQCAtMCwwICsxLDc1IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBMb29rdXAgdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyAgICAvKiAqIFRhYmxlIEVudHJpZXMgY29udGFpbiBEYyBTY2FsZXIgdmFsdWVzCisgICAgICAgKiBhcm1WQ000UDJfRENTY2FsZXJbaV09IDggICAgICAgICAgIGZvciBpPTEgIHRvICA0IGFuZCBpPTMzIHRvIDM2CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaSAgICAgICAgIGZvciBpPTUgIHRvICA4CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGkrOCAgICAgICAgIGZvciBpPTkgIHRvICAyNQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmktMTYgICAgICBmb3IgaT0yNiB0byAgMzEKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gKGktMzIrMTMpLzIgZm9yIGk9MzcgdG8gIDU5CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGktNi0zMiAgICAgIGZvciBpPTYwIHRvICA2MworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICBmb3IgaT0wIGFuZCBpPTMyCisgICAgICAgKi8KKyAgICAgICAKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfRENTY2FsZXJbNjRdPXsKKwkweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweGEsICAweGMsICAweGUsICAKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKKyAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAorICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MmEsIDB4MmMsIDB4MmUsCisgICAgMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHg5LCAgMHg5LCAgMHhhLCAgCisgICAgMHhhLCAgMHhiLCAgMHhiLCAgMHhjLCAgMHhjLCAgMHhkLCAgMHhkLCAgMHhlLCAgCisgICAgMHhlLCAgMHhmLCAgMHhmLCAgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgCisgICAgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKKworfTsKKworICAgICAgICAgICAgICAKKyAgICAgLyogIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNltpXT1yb3VuZCgzMjc2Ny9pKQorICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzBdPSAwCisgICAgICAqLworCitjb25zdCBPTVhfUzE2IGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNls2NF09eworCTB4MDAwMCwweDdmZmYsMHg0MDAwLDB4MmFhYSwweDIwMDAsMHgxOTk5LDB4MTU1NSwweDEyNDksCisgICAgMHgxMDAwLDB4MGUzOSwweDBjY2QsMHgwYmEzLDB4MGFhYiwweDA5ZDksMHgwOTI1LDB4MDg4OCwKKyAgICAweDA4MDAsMHgwNzg3LDB4MDcxYywweDA2YmQsMHgwNjY2LDB4MDYxOCwweDA1ZDEsMHgwNTkxLAorICAgIDB4MDU1NSwweDA1MWYsMHgwNGVjLDB4MDRiZSwweDA0OTIsMHgwNDZhLDB4MDQ0NCwweDA0MjEsCisgICAgMHgwNDAwLDB4MDNlMSwweDAzYzQsMHgwM2E4LDB4MDM4ZSwweDAzNzYsMHgwMzVlLDB4MDM0OCwKKyAgICAweDAzMzMsMHgwMzFmLDB4MDMwYywweDAyZmEsMHgwMmU5LDB4MDJkOCwweDAyYzgsMHgwMmI5LAorICAgIDB4MDJhYiwweDAyOWQsMHgwMjhmLDB4MDI4MiwweDAyNzYsMHgwMjZhLDB4MDI1ZiwweDAyNTQsCisgICAgMHgwMjQ5LDB4MDIzZiwweDAyMzUsMHgwMjJiLDB4MDIyMiwweDAyMTksMHgwMjExLDB4MDIwOAorCSAgIAorfTsKKyAgICAgCisgICAgICAvKiBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbaV09cm91bmQoMTMxMDcxL2kpCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbMF09IDAKKyAgICAgICAqLworCitjb25zdCBPTVhfUzMyIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMls2NF09eworCTB4MDAwMDAwMDAsMHgwMDAxZmZmZiwweDAwMDEwMDAwLDB4MDAwMGFhYWEsIDB4MDAwMDgwMDAsIDB4MDAwMDY2NjYsIDB4MDAwMDU1NTUsIDB4MDAwMDQ5MjQsCisgICAgMHgwMDAwNDAwMCwweDAwMDAzOGUzLDB4MDAwMDMzMzMsMHgwMDAwMmU4YywgMHgwMDAwMmFhYiwgMHgwMDAwMjc2MiwgMHgwMDAwMjQ5MiwgMHgwMDAwMjIyMiwKKyAgICAweDAwMDAyMDAwLDB4MDAwMDFlMWUsMHgwMDAwMWM3MiwweDAwMDAxYWYyLCAweDAwMDAxOTlhLCAweDAwMDAxODYxLCAweDAwMDAxNzQ2LCAweDAwMDAxNjQzLAorICAgIDB4MDAwMDE1NTUsMHgwMDAwMTQ3YiwweDAwMDAxM2IxLDB4MDAwMDEyZjYsIDB4MDAwMDEyNDksIDB4MDAwMDExYTgsIDB4MDAwMDExMTEsIDB4MDAwMDEwODQsCisgICAgMHgwMDAwMTAwMCwweDAwMDAwZjg0LDB4MDAwMDBmMGYsMHgwMDAwMGVhMSwgMHgwMDAwMGUzOSwgMHgwMDAwMGRkNiwgMHgwMDAwMGQ3OSwgMHgwMDAwMGQyMSwKKyAgICAweDAwMDAwY2NkLDB4MDAwMDBjN2QsMHgwMDAwMGMzMSwweDAwMDAwYmU4LCAweDAwMDAwYmEzLCAweDAwMDAwYjYxLCAweDAwMDAwYjIxLCAweDAwMDAwYWU1LAorICAgIDB4MDAwMDBhYWIsMHgwMDAwMGE3MywweDAwMDAwYTNkLDB4MDAwMDBhMGEsIDB4MDAwMDA5ZDksIDB4MDAwMDA5YTksIDB4MDAwMDA5N2IsIDB4MDAwMDA5NGYsCisgICAgMHgwMDAwMDkyNSwweDAwMDAwOGZiLDB4MDAwMDA4ZDQsMHgwMDAwMDhhZSwgMHgwMDAwMDg4OSwgMHgwMDAwMDg2NSwgMHgwMDAwMDg0MiwgMHgwMDAwMDgyMAorCQorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTJkODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCkBAIC0wLDAgKzEsMTA0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7ICoqCis7ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCis7ICoKKzsgKi8KKworICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIElOQ0xVREUgb214VkNfcy5oCisKKworICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgIElGIEFSTTExMzZKUworIAorOy8vIElucHV0IEFyZ3VtZW50cworQmxvY2tJbmRleCAgICAgICAgIFJOIDAKK3BDb2VmQnVmUm93ICAgICAgICBSTiAxCitwQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgorcHJlZERpciAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgICBSTiA0CitwUXBCdWYgICAgICAgICAgICAgUk4gNQorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICBSTiAwCitibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCitibG9ja0RDVG9wICAgICAgICAgUk4gNworYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKK3RlbXAxICAgICAgICAgICAgICBSTiA5Cit0ZW1wMiAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKKworICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAorICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAorICAgIAorICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQorICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCisgICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KKyAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KKyAgICAgICAgICAgICAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAorICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCisgICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAorICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCisgICAgICAKKyAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgorICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCisgICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCisgICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCisgICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKKworICAgICAgICAgCisgICAgCisgICAgICAgTV9FTkQKKyAKKyAgICAgICBFTkRJRgorCisgICAgICAgRU5EICAgIAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKy8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCisgKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAorICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKK3sKKyAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKKyAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAorICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKKyAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCisgICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAorICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCisgICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAorICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCisKKwkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAorICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAorICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKKyAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKKyAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAorICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKKyAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCisgICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKKworICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCisgICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAorICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKKyAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCisgICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAorICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCisgICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2CisKKworfTsKKworCisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZyBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5CisgKiBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvcgorICogZnVydGhlciByZWNvbnN0cnVjdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddCisgKiBbaW5dCVFQCQkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgaW5kaWNhdGVzIHVzaW5nIHF1YW50aXphdGlvbiBtZXRob2QgZGVmaW5lZCBpbiBzaG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoZWFkZXIgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgaW5kaWNhdGVzIG5vcm1haWwgcXVhbnRpemF0aW9uIG1ldGhvZC4KKyAqIFtvdXRdIHBwQml0U3RyZWFtIAkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XSBwRHN0CQkJcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cyBvZgorICogICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBkYXRhIHR5cGUpLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0CisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOgorICogICAtICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIFFQIDw9IDA7CisgKgkgLSBwRHN0IG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKKyAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KKyAgICBPTVhfUzE2IHRlbXBCdWZbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7CisgICAgCisgICAgCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisJICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDlhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgorICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKKyAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddLgorICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKKyAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKKyAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCisgKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KKyAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgorICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAorICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCisgKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQworICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQorICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCisgKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0CisgKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKKyAqCQkJCQkJCQltYWNyb2Jsb2NrLgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgorICogICAgICBvcgorICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKKyAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCisgKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCisgKiAgICAgIG9yCisgKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICAKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7CisgICAgfQorCisgICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGlmIChpbnRyYURDVkxDID09IDEpCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgdmlkZW9Db21wKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgIGN1clFQLAorICAgICAgICBwcmVkUVAsCisgICAgICAgIHByZWREaXIsCisgICAgICAgIEFDUHJlZEZsYWcsCisgICAgICAgIHZpZGVvQ29tcCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIGN1clFQLAorICAgICB2aWRlb0NvbXAsCisgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCisgICAgICAgaXQgdG8gMCB0byAyNTUgKi8KKyAgICAKKwlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7CisJCisJCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4NjFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKQEAgLTAsMCArMSwzNjQgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqIAorOyAqKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUAorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogRGVjb2RlcyBhbmQgcGFkcyBmb3VyIG1vdGlvbiB2ZWN0b3JzIG9mIHRoZSBub24taW50cmEgbWFjcm9ibG9jayBpbiBQLVZPUC4KKzsgKiBUaGUgbW90aW9uIHZlY3RvciBwYWRkaW5nIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjYuMS42IG9mCis7ICogSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCis7ICogW2luXSAgICBwU3JjTVZMZWZ0TUIgICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyTUIgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlciBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyUmlnaHRNQiBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIGZjb2RlRm9yd2FyZCAgICAgICBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00Cis7ICogICAgICAgICAgICAgICAgICAgICBiaXQgc3RyZWFtIHN5bnRheAorOyAqIFtpbl0gICAgTUJUeXBlICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlCis7ICogICAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbgorOyAqICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgZmlsbGVkIHdpdGggdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBzYW1lIGRlY29kZWQgdmVjdG9yLgorOyAqIFtvdXRdICAgcHBCaXRTdHJlYW0gICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgIHBEc3RNVkN1ck1CICAgICAgICAgcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgd2hpY2ggY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtbm8gZXJyb3IKKzsgKiAKKzsgKiAgICAgICAgICAgICAgICAgICAgIAorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICoKKzsgKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorICAgICAgICBJTkNMVURFIG9teFZDX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgIAorICAgICAgICAgICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgIFJOIDEKK3BTcmNNVkxlZnRNQiAgICAgICAgICBSTiAyCitwU3JjTVZVcHBlck1CICAgICAgICAgUk4gMworcFNyY01WVXBwZXJSaWdodE1CICAgIFJOIDQKK3BEc3RNVkN1ck1CICAgICAgICAgICBSTiA1CitmY29kZUZvcndhcmQgICAgICAgICAgUk4gNgorTUJUeXBlICAgICAgICAgICAgICAgIFJOIDcKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK3plcm8gICAgICAgICAgICAgICAgICBSTiA0CitvbmUgICAgICAgICAgICAgICAgICAgUk4gNAorc2NhbGVGYWN0b3IgICAgICAgICAgIFJOIDEKKworCitSZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCitWbGNNVkQgICAgICAgICAgICAgICAgUk4gMAoraW5kZXggICAgICAgICAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgICBSTiA3CisKK212SG9yRGF0YSAgICAgICAgICAgICBSTiA0CittdkhvclJlc2lkdWFsICAgICAgICAgUk4gMAorCittdlZlckRhdGEgICAgICAgICAgICAgUk4gNCAgICAgICAgICAgICAKK212VmVyUmVzaWR1YWwgICAgICAgICBSTiAwCisKK3RlbXAgICAgICAgICAgICAgICAgICBSTiAxCisKK3RlbXAxICAgICAgICAgICAgICAgICBSTiAzCitIaWdoICAgICAgICAgICAgICAgICAgUk4gNAorTG93ICAgICAgICAgICAgICAgICAgIFJOIDIKK1JhbmdlICAgICAgICAgICAgICAgICBSTiAxCisKK0Jsa0NvdW50ICAgICAgICAgICAgICBSTiAxNAorCitkaWZmTVZkeCAgICAgICAgICAgICAgUk4gMAorZGlmZk1WZHkgICAgICAgICAgICAgIFJOIDEKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgICBSTiA4CitSQml0Q291bnQgICAgICAgICAgICAgUk4gOQorUkJpdEJ1ZmZlciAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgIFJOIDEyCitMUiAgICAgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRAorICAgICAgIElNUE9SVCAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAgICAgICAgCisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwRHN0TVZDdXJNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBEc3RNVlByZWRNRSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBCbGtDb3VudCw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwQml0T2Zmc2V0LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVkxlZnRNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZVcHBlck1CLDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR4LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR5LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEhpZ2gsNAorICAgICAgIAorICAgICAgICAgICAgICAKKworCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLHIxMQorICAgICAgIAorICAgICAgIE1fQVJHICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrLDQgICAgICAgICAgIDsvLyBwb2ludGVyIHRvICBwU3JjTVZVcHBlclJpZ2h0TUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgcERzdE1WQ3VyTUJvblN0YWNrLDQgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBwRHN0TVZDdXJNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBmY29kZUZvcndhcmRvblN0YWNrLDQgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIGZjb2RlRm9yd2FyZCBvbiBzdGFjayAKKyAgICAgICBNX0FSRyAgICAgICAgICAgTUJUeXBlb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBNQlR5cGUgb24gc3RhY2sKKworICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0U3RyZWFtIE1hY3JvCisKKyAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjayAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE1CVHlwZSBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIHBEc3RNVkN1ck1CLHBEc3RNVkN1ck1Cb25TdGFjayAgICAgICAgOy8vIExvYWQgcERzdE1WQ3VyTUIgZnJvbSBzdGFjaworICAgICAgIE1PViAgICAgICAgICAgICB6ZXJvLCMwCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkEgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQQorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQV9RICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBX1EKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIE1PViAgICAgICAgICAgICBCbGtDb3VudCwjMAorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdE9LCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0ViAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFZfUSAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0Vl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCM0CisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzEKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgZmNvZGVGb3J3YXJkLGZjb2RlRm9yd2FyZG9uU3RhY2sgICAgICA7Ly8gTG9hZCBmY29kZUZvcndhcmQgIGZyb20gc3RhY2sKKworICAgICAgIDsvLyBTdG9yaW5nIHRoZSB2YWx1ZXMgdGVtcG9yYXJpbHkgb24gc3RhY2sKKworICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgICAgICAKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMSAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPWZjb2RlRm9yd2FyZC0xCisgICAgICAgTU9WICAgICAgICAgICAgIG9uZSwjMQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixvbmUsdGVtcCAgICAgICAgICAgICAgICAgIDsvLyBzY2FsZUZhY3Rvcj0xPDwoZmNvZGVGb3J3YXJkLTEpCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isc2NhbGVGYWN0b3IsIzUgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgc2NhbGVGYWN0b3IscEhpZ2ggICAgICAgICAgICAgICAgICAgICA7Ly8gW3BIaWdoXT0zMipzY2FsZUZhY3RvcgorICAgICAgICAgICAgICAKKyAgICAgICA7Ly8gVkxEIERlY29kaW5nCisKKworTG9vcAorCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZCB0aGUgb3B0aW1pemVkIE1WRCBWTEMgdGFibGUKKworICAgICAgIDsvLyBIb3Jpem9udGFsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gdmFyaWFibGUgbGVuZ2h0IGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgdGhlIGRlY29kZWQgc3ltYm9sIGlzIGFuIGludmFsaWVkIHN5bWJvbCAKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLCMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvclJlc2lkdWFsPTEKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdkhvckRhdGE9MCBkaWZmTVZkeD1tdkhvckRhdGEgICAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgVmVydGljYWxEYXRhCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12SG9yUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIGdldCBtdkhvclJlc2lkdWFsIGZyb20gYml0c3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtdkhvckRhdGEhPTAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZIb3JEYXRhLG12SG9yRGF0YSwjMCAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWFicyhtdkhvckRhdGEpCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsbXZIb3JSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhLGZjb2RlRm9yd2FyZCxtdkhvclJlc2lkdWFsIDsvLyBkaWZmTVZkeD1hYnMobXZIb3JEYXRhKSpmY29kZUZvcndhcmQrbXZIb3JSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzAKKyAgICAgICAKKyAgICAgICA7Ly8gVmVydGljYWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworVmVydGljYWxEYXRhCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIGRpZmZNVmR4IG9uIHN0YWNrCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZGluZyB0aGUgYWRkcmVzcyBvZiBvcHRpbWl6ZWQgVkxDIHRhYmxlcworCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIFZMQyBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBhbiBJbnZhbGllZCBTeW1ib2wgb2NjdXJzCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12VmVyRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCwjMSAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHkgPSBtdlZlckRhdGEgaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZWZXJEYXRhPTAKKyAgICAgICBCRVEgICAgICAgICAgICAgRmluZE1WUHJlZAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12VmVyUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIEdldCBtdlZlclJlc2lkdWFsIGZyb20gYml0IHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbW5WZXJEYXRhIT0wCisgICAgICAgICAgICAgCisKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12VmVyRGF0YSxtdlZlckRhdGEsIzAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCxtdlZlclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEsZmNvZGVGb3J3YXJkLG12VmVyUmVzaWR1YWwgOy8vIGRpZmZNVmR5PWFicyhtdlZlckRhdGEpKmZjb2RlRm9yd2FyZCttdlZlclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMAorCisgICAgICAgOy8vQ2FsbGluZyB0aGUgRnVuY3Rpb24gb214VkNNNFAyX0ZpbmRNVnByZWQKKyAgICAgICAgCitGaW5kTVZQcmVkCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHkscGRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAscERzdE1WQ3VyTUIsQmxrQ291bnQsTFNMICMyICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAgb24gc3RhY2sgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQgdG8gRmluZE1WUHJlZAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLCMwCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscERzdE1WUHJlZE1FICAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3MgcERzdE1WUHJlZE1FPU5VTEwgYXMgYW4gYXJndW1lbnQgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzc3MgQmxrQ291bnQgYXMgQXJndW1lbnQgdGhyb3VnaCBzdGFjaworCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAscFNyY01WTGVmdE1CICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAgKFJOIDEpPXBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIscFNyY01WVXBwZXJSaWdodE1Cb25TdGFjaworICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZMZWZ0TUIscFNyY01WVXBwZXJNQiAgICAgICAgICAgIDsvLyBwU3JjTVZMZWZ0TUIgKCBSTiAyKSA9IHBTcmNNVlVwcGVyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcHBCaXRTdHJlYW0scERzdE1WQ3VyTUIgICAgICAgICAgICAgICA7Ly8gcHBCaXRTdHJlYW0gICggUk4gMCkgPSBwRHN0TVZDdXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIDsvLyBwU3JjTVZVcHBlck1CKCBSTiAzKSA9IHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIAorICAgICAgIEJMICAgICAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBzdWJyb3V0aW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gU3RvcmUgSG9yaXpvbnRhbCBNb3Rpb24gVmVjdG9yCisgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEJsa0NvdW50IGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgSGlnaCxwSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0zMipzY2FsZUZhY3RvcgorICAgICAgIExTTCAgICAgICAgICAgICB0ZW1wMSxCbGtDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPUJsa0NvdW50KjQKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIAorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBMb3csSGlnaCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb3cgPSAtMzIqc2NhbGVGYWN0b3IKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHg9cERzdE1WQ3VyTUJbQmxrQ291bnRdK2RpZmZNVmR4CisgICAgICAgQUREICAgICAgICAgICAgIFJhbmdlLEhpZ2gsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJhbmdlPTY0KlNjYWxlRmFjdG9yCisgICAgICAgU1VCICAgICAgICAgICAgIEhpZ2gsSGlnaCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9IDMyKnNjYWxlRmFjdG9yLTEKKworICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeDxMb3cgICAgICAgICAgCisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4Kz1SYW5nZQorICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHggPiBIaWdoIGRpZmZNVmR4LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdCisKKyAgICAgICA7Ly8gU3RvcmUgVmVydGljYWwKKworICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSx0ZW1wMSwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT00KkJsa0NvdW50KzIKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR5ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeQorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XS5kaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICBCbGtDb3VudCxCbGtDb3VudCwjMSAgICAgICAgICAgICAgICAgIDsvLyBCbGtDb3VudD1CbGtDb3VudCsxCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdworICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeTxMb3cgIGRpZmZNVmR5Kz1SYW5nZSAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeSA+IEhpZ2ggZGlmZk1WZHktPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEJsa0NvdW50LENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKworICAgICAgIEJMVCAgICAgICAgICAgICBMb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBCbGtDb3VudDxDb3VudCBDb250aW51ZSB0aGUgTG9vcAorCisKKyAgICAgICA7Ly8gSWYgTUJUeXBlPU9NWF9WQ19JTlRFUiBvciBNQnR5cGU9T01YX1ZDX0lOVEVSX1EgY29weSBwRHN0TVZDdXJNQlswXSB0bworICAgICAgIDsvLyBwRHN0TVZDdXJNQlsxXSwgcERzdE1WQ3VyTUJbMl0sIHBEc3RNVkN1ck1CWzNdIAorCisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBMRFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzhdCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCMxMl0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGluZyB0aGUgTWFjcm8gICAgICAgCisKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSworIAorRXhpdEVycm9yCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorCitFeGl0T0sgICAgICAgICAgICAgCisKKyAgICAgICBNX0VORAorICAgICAgIEVORElGCisgICAgICAgRU5ECisKKworICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzYjI1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpAQCAtMCwwICsxLDEzMiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgorCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKKyAgICAgICAgIAorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCkBAIC0wLDAgKzEsMTM2IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KKworCisKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5Y2IxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCkBAIC0wLDAgKzEsMjI0IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorICAgICAgCisKKworICAgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCisgICAgICAgIAorCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwordmlkZW9Db21wICAgICAgICAgICAgUk4gNQorOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAorcERDQ2hyb21hSW5kZXggICAgICAgUk4gNworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgorcG93T2ZTaXplICAgICAgICAgICAgUk4gNwordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0RDVmFsICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0CisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCisgICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCisKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCisKKyAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCisKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQorCisgICAgCisgICAgICAgCisKK0RlY29kZURDCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAorICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCisgICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKKyAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCisgICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCisKK0NoZWNrRENWYWx1ZVNpemUKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAorCisgICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQorCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICAKKworICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50CisKK0FDRGVjb2RlCisKKyAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCisgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjaworICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgorCisgICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjaworICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgICAgICAgIAorICAgICAgICAgICAgICAKKworRXhpdEVycm9yCisgCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKK0V4aXRPSworICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCkBAIC0wLDAgKzEsMTk0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtVkNDT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQorICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCisgICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCitwU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKK3BTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQorcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCitwU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKK3BEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAorcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1CitpQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0CitDYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCisKK3BDYW5kTVYxICAgICAgICAgICAgICAgUk4gNworcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4CitwQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKKworQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAorQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAorQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCitDYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKK0NhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKK0NhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKKwordGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAorCit6ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKKyAgICAgICAgCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFpbiByb3V0aW5lCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAorCisgICAgICAgIE1fQUxMT0M0IE1WLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0CisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAorICAgICAgICBNX0FSRyAgIEJsaywgNAorICAgICAgICAKKyAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgorICAgICAgICBNT1YgICB6ZXJvLCAjMAorICAgICAgICBNX0xEUiBpQmxrLCBCbGsKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCisgICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKKyAgICAKKyAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KKworICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKKyAgICAgICAgTV9TV0lUQ0ggaUJsaworICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorT01YVkNCbGswCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAorCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMworICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKyAgICAKK09NWFZDQmxrMQorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgorICAgIAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazMKKyAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgIAorQmxrRW5kCisKKyAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybworICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5CisgICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCisgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQorCisgICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQorICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KKyAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCisKKyAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAorCisgICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKKyAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKKworICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KKyAgICAgICAgICAgCisgICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCisKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKKworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAorICAgIAorICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgorICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCisKKyAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAKKyAgICAgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYjU0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKQEAgLTAsMCArMSw3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsaworOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKKyAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQorICAgICAgICA7Ly8gICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0CisgICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0CisgICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAorICAgIEVORElGCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0lEQ1Q4eDhibGssIHIxMQorICAgIEVORElGCisgICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1Jlc3VsdCAgICAgICAgICBSTiAwCisKKzsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAorOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCis7Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKKzsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCis7Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworcFNyYyAgICBSTiAwICAgIAorU3RyaWRlICBSTiAxICAgIAorcERlc3QgICBSTiAyICAgIAorcFNjYWxlICBSTiAzICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAorICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCisgICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQgICAgICAgCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2NWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCkBAIC0wLDAgKzEsNzEzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8KKzsvLworCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCisKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgSUYgIEFSTTExMzZKUworICAgIAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1BQ1JPIERFRklOSVRJT05TCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLworICAgIDsvLyAgIGRlc3Rbal0gPSAoeFtqXSArIHlbal0gKyByb3VuZCkgPj4gMSwgICBqPTAuLjMKKyAgICA7Ly8KKyAgICA7Ly8gU2ltaWxhciB0byBVSEFERDggaW5zdHJ1Y3Rpb24sIGJ1dCB3aXRoIGEgcm91bmRpbmcgdmFsdWUgb2YgMSBhZGRlZCB0bworICAgIDsvLyBlYWNoIHN1bSBiZWZvcmUgZGl2aWRpbmcgYnkgdHdvLCBpZiByb3VuZCBpcyAxCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIDsvLworICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR4ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB4WzNdIDogIHhbMl0gIDogIHhbMV0gIDogIHhbMF0KKyAgICA7Ly8gJHkgICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHlbM10gOiAgeVsyXSAgOiAgeVsxXSAgOiAgeVswXQorICAgIDsvLyAkcm91bmQgICAgMCBpZiBubyByb3VuZGluZyB0byBiZSBhZGRlZCwgMSBpZiByb3VuZGluZyB0byBiZSBkb25lCisgICAgOy8vICRtYXNrICAgICBzb21lIHJlZ2lzdGVyIHNldCB0byAweDgwODA4MDgwCisgICAgOy8vCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRkZXN0ICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KKworICAgIE1BQ1JPCisgICAgTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIElGICRyb3VuZCA9IDEKKyAgICAgICAgSUYgICRkZXN0IC89ICR5CisgICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHgKKyAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeSwgJGRlc3QKKyAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR5CisgICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHgsICRkZXN0CisgICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCisgICAgICAgIEVORElGCisgICAgRUxTRQorICAgICAgICBVSEFERDggICAgICAkZGVzdCwgJHgsICR5CisgICAgRU5ESUYKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSAkcFNyYyAoYWxpZ25lZCBvciB1bmFsaWduZWQgbG9jYXRpb25zKQorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLyAkc2NyYXRjaCAgICBBIHNjcmF0Y2ggcmVnaXN0ZXIsIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVtcCBjYWxjdWxhdGlvbnMKKyAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKKyAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKKyAgICA7Ly8KKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgSW4gY2FzZSB0aGUgbWFjcm8gYWNjZXB0cyBzdHJpZGUsIGl0IGluY3JlbWVudHMgdGhlIHBTcmMgYnkgCisgICAgOy8vICAgICAgICAgICAgIHRoYXQgdmFsdWUsIGVsc2UgdW5jaGFuZ2VkCisgICAgOy8vICRvdXQwICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQorICAgIDsvLyAkb3V0MSAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzddIDogIHpbNl0gIDogIHpbNV0gIDogIHpbNF0KKyAgICA7Ly8KKyAgICA7Ly8gTm90ZTogeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nLiBJbiBjYXNlIG9mZnNldCBpcyAwLCAkc2NyYXRjaCBpcyBub3QgbW9kaWZpZWQuCisKKyAgICBNQUNSTworICAgIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgICAgICBJRiAkb2Zmc2V0ID0gMAorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDF9CisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gCisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQwLCAkb3V0MCwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDAsICRvdXQwLCAkb3V0MSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDEsICRvdXQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MSwgJG91dDEsICRzY3JhdGNoLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkcyB0aHJlZSB3b3JkcyBmb3IgWCBpbnRlcnBvbGF0aW9uLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IHJvdy4gRm9yIAorICAgIDsvLyBYIGludGVycG9sYXRpb24sIGdpdmVuIGEgdHJ1bmNhdGVkLTRieXRlQWxpZ25lZCBzb3VyY2UgcG9pbnRlciwgCisgICAgOy8vIGludmFyaWFibHkgdGhyZWUgY29udGlub3VzIHdvcmRzIGFyZSByZXF1aXJlZCBmcm9tIHRoZXJlIHRvIGdldCB0aGUKKyAgICA7Ly8gbmluZSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciBmb3IgZmlsdGVyaW5nLiAKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLworICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLworICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgorICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQorICAgIDsvLworICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICBJbmNyZW1lbnRlZCBieSAkc3JjU3RlcAorICAgIDsvLworICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIG91dHB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKKyAgICA7Ly8gICAgICAgICAgICAgVGhlIG91dHB1dHMgYXJlIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4gRm9sbG93aW5nIGlzIHRoZSBpbGx1c3RyYXRpb24gdG8gc2hvdyAKKyAgICA7Ly8gICAgICAgICAgICAgaG93IHRoZSBuaW5lIGJ5dGVzIGFyZSBzcGFubmVkIGZvciBkaWZmZXJlbnQgb2Zmc2V0cyBmcm9tIAorICAgIDsvLyAgICAgICAgICAgICBub3RUcnVuY2F0ZWRGb3JBbGlnbm1lbnRTb3VyY2VQb2ludGVyLgorICAgIDsvLworICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8CisgICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8ICAgICAgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gCisgICAgOy8vICAgICAgICAgICAgIHdoZXJlIHRoZSBudW1iZXJpbmcgKDAtOCkgaXMgdG8gZGVzaWduYXRlIHRoZSA5IGJ5dGVzIGZyb20KKyAgICA7Ly8gICAgICAgICAgICAgc3RhcnQgb2YgYSBwYXJ0aWN1bGFyIHJvdy4gVGhlIGlsbHVzdHJhdGlvbiBkb2Vzbid0IHRha2UgaW4gCisgICAgOy8vICAgICAgICAgICAgIGFjY291bnQgdGhlIHBvc2l0aW9uaW5nIG9mIGJ5dGVzIHdpdGggaW4gdGhlIHdvcmQgYW5kIHRoZSAKKyAgICA7Ly8gICAgICAgICAgICAgbWFjcm8gY29tYmluYXRpb24gd2l0aCBNX0VYVF9YSU5UIHdpbGwgd29yayBvbmx5IGluIGxpdHRsZSAKKyAgICA7Ly8gICAgICAgICAgICAgZW5kaWFuIGVudmlyb25zCisgICAgOy8vIAorICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCisgICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZworCisgICAgTUFDUk8KKyAgICBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgICAgICBJRiAkb2Zmc2V0IC89IDMKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDEsICR3b3JkMn0KKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMiwgJHdvcmQzfQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBFeHRyYWN0IGZvdXIgcmVnaXN0ZXJzIG9mIGZvdXIgcGl4ZWxzIGZvciBYIGludGVycG9sYXRpb24gCisgICAgOy8vIAorICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCisgICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCisgICAgOy8vIAorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIGlucHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAorICAgIDsvLyAgICAgICAgICAgICBUaGUgaW5wdXRzIGFyZSBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4KKyAgICA7Ly8KKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCB5eXl5ICB8IDEyMzQgIHwgNTY3OCAgfAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgQnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIHBvaW50ZXIgKG5vdCB0cnVuY2F0ZWQgZm9yCisgICAgOy8vICAgICAgICAgICAgIDQgYnl0ZSBhbGlnbm1lbnQpIGFzIHNob3duIGluIHRoZSB0YWJsZS4gCisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICA7Ly8gICAgICAgICAgICAgfCAwMTIzICB8IDQ1NjcgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vCisgICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCisKKyAgICBNQUNSTworICAgIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgICAgIElGICRvZmZzZXQgPSAwCisgICAgICAgICAgICA7ICR3b3JkMCBhbmQgJHdvcmQxIGFyZSBvaworICAgICAgICAgICAgOyAkd29yZDIsICR3b3JkMyBhcmUganVzdCA4IHNoaWZ0ZWQgdmVyc2lvbnMKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjMjQKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKKyAgICAgICAgRUxJRiAkb2Zmc2V0ID0gMworICAgICAgICAgICAgOyAkd29yZDIgYW5kICR3b3JkMyBhcmUgb2sgKHRha2VuIGNhcmUgd2hpbGUgbG9hZGluZyBpdHNlbGYpCisgICAgICAgICAgICA7IHNldCAkd29yZDAgJiAkd29yZDEKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQyLCBMU0wgIzgKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQyLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQzLCBMU0wgIzgKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgoJG9mZnNldCkrMSkpCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0CisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBDb21wdXRlcyBoYWxmLXN1bSBhbmQgeG9yIG9mIHR3byBpbnB1dHMgYW5kIHB1dHMgdGhlbSBpbiB0aGUgaW5wdXQgCisgICAgOy8vIHJlZ2lzdGVycyBpbiB0aGF0IG9yZGVyCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR2MCAgICAgICAgIGEsIGZpcnN0IGlucHV0CisgICAgOy8vICR2MSAgICAgICAgIGIsIHNlY29uZCBpbnB1dAorICAgIDsvLyAkdG1wICAgICAgICBzY3JhdGNoIHJlZ2lzdGVyCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkdjAgICAgICAgICAoYSArIGIpLzIKKyAgICA7Ly8gJHYxICAgICAgICAgYSBeIGIKKworICAgIE1BQ1JPCisgICAgTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgICAgIFVIQUREOCAgICAgICR0bXAsICR2MCwgJHYxICAgICA7Ly8gczAgPSBhICsgYgorICAgICAgICBFT1IgICAgICAgICAkdjEsICR2MCwgJHYxICAgICAgOy8vIGwwID0gYSBeIGIKKyAgICAgICAgTU9WICAgICAgICAgJHYwLCAkdG1wICAgICAgICAgIDsvLyBzMAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIENhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0IHZhbHVlcyAoYSxiLGMsZCkgZm9yIEhhbGZQaXhlbFhZIHByZWRpY3QgdHlwZSBpbiAKKyAgICA7Ly8gbWNSZWNvbkJsb2NrIG1vZHVsZS4gVmVyeSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgCisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZIGRvbmUgaGVyZS4gVXNlcyAidG1wIiBhcyBzY3JhdGNoIHJlZ2lzdGVyIGFuZCAKKyAgICA7Ly8gInlNYXNrIiBmb3IgbWFzayB2YXJpYWJsZSAiMHgxMDEwMTAxeCIgc2V0IGluIGl0LiBJbiB5TWFzayA0IGxzYnMgYXJlIAorICAgIDsvLyBub3Qgc2lnbmlmaWNhbnQgYW5kIGFyZSB1c2VkIGJ5IHRoZSBjYWxsZWUgZm9yIHJvdyBjb3VudGVyICh5KQorICAgIDsvLworICAgIDsvLyBTb21lIHBvaW50cyB0byBub3RlIGFyZToKKyAgICA7Ly8gMS4gSW5wdXQgaXMgcGFpciBvZiBwYWlyLWF2ZXJhZ2VzIGFuZCBYb3JzCisgICAgOy8vIDIuICRzdW0xIGFuZCAkbHNiMSBhcmUgbm90IG1vZGlmaWVkIGFuZCBoZW5jZSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgCisgICAgOy8vICAgIHJ1bm5pbmcgYXZlcmFnZQorICAgIDsvLyAzLiBPdXRwdXQgaXMgaW4gdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9BVkc0ICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiKSA+PiAxLCB3aGVyZSBhIGFuZCBiIGFyZSAxc3QgYW5kIDJuZCBpbnB1dHMgdG8gYmUgYXZlcmFnZWQKKyAgICA7Ly8gJGxzYjAgICAgICAgKGEgXiBiKQorICAgIDsvLyAkc3VtMSAgICAgICAoYyArIGQpID4+IDEuIE5vdCBtb2RpZmllZAorICAgIDsvLyAkbHNiMSAgICAgICAoYyBeIGQpICAgICAgIE5vdCBtb2RpZmllZAorICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiICsgYyArIGQgKyAxKSAvIDQgOiBJZiBubyByb3VuZGluZworICAgIDsvLyAgICAgICAgICAgICAoYSArIGIgKyBjICsgZCArIDIpIC8gNCA6IElmIHJvdW5kaW5nCisKKyAgICBNQUNSTworICAgIE1fQVZHNCAgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAorICAgICAgICBMQ0xTIE9QMQorICAgICAgICBMQ0xTIE9QMgorICAgICAgICBJRiAkcm5kVmFsID0gMCA7Ly8gcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIkFORCIKK09QMiBTRVRTICJPUlIiCisgICAgICAgIEVMU0UgICAgICAgICAgIDsvLyBOb3Qgcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIk9SUiIKK09QMiBTRVRTICJBTkQiCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMQ0xTIGxzYjIKKyAgICAgICAgTENMUyBzdW0yCisgICAgICAgIExDTFMgZGVzdAorICAgIAorbHNiMiAgU0VUUyAidG1wIgorc3VtMiAgU0VUUyAiJGxzYjAiCitkZXN0ICBTRVRTICIkc3VtMCIKKworICAgICAgICAkT1AxICAgICAgICAkbHNiMCwgJGxzYjAsICRsc2IxICAgICAgICAgIDsvLyBlMCA9IGUwICYgZTEKKyAgICAgICAgRU9SICAgICAgICAgJGxzYjIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gZTIgPSBzMCBeIHMxCisgICAgICAgICRPUDIgICAgICAgICRsc2IyLCAkbHNiMiwgJGxzYjAgICAgICAgICAgOy8vIGUyID0gZTIgfCBlMAorICAgICAgICBBTkQgICAgICAgICAkbHNiMiwgJGxzYjIsIHlNYXNrLCBMU1IgIyA0IDsvLyBlMiA9IGUyICYgbWFzaworICAgICAgICBVSEFERDggICAgICAkc3VtMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBzMiA9IChzMCArIHMxKS8yCisgICAgICAgIFVBREQ4ICAgICAgICRkZXN0LCAkc3VtMiwgJGxzYjIgICAgICAgICAgOy8vIGRlc3QgPSAgczIgKyBlMgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBJbXBsZW1lbnQgbW90aW9uIGNvbXBlbnNhdGlvbiByb3V0aW5lcyB1c2luZyB0aGUgbmFtZWQgcmVnaXN0ZXJzIGluIAorICAgIDsvLyBjYWxsZWUgZnVuY3Rpb24uIEVhY2ggb2YgdGhlIGZvbGxvd2luZyA0IGltcGxlbWVudCB0aGUgNCBwcmVkaWN0IHR5cGUKKyAgICA7Ly8gRWFjaCBoYW5kbGVzIDggY2FzZXMgZWFjaCBpZSBhbGwgdGhlIGNvbWJpbmF0aW9ucyBvZiA0IHR5cGVzIG9mIHNvdXJjZSAKKyAgICA7Ly8gYWxpZ25tZW50IG9mZnNldHMgYW5kIDIgdHlwZXMgb2Ygcm91bmRpbmcgZmxhZworICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRvZmZzZXQgICAgICRwU3JjIE1PRCA0IHZhbHVlLiBPZmZzZXQgZnJvbSA0IGJ5dGUgYWxpZ25lZCBsb2NhdGlvbi4KKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIE91dHB1dHMgY29tZSBpbiB0aGUgbmFtZWQgcmVnaXN0ZXJzIG9mIHRoZSBjYWxsZWUgZnVuY3Rpb25zCisgICAgOy8vIFRoZSBtYWNybyBsb2FkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciwgcHJvY2Vzc2VzIGl0IGFuZCAKKyAgICA7Ly8gc3RvcmVzIGluIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyLiBEb2VzIHRoZSB3aG9sZSBwcmVkaWN0aW9uIGN5Y2xlCisgICAgOy8vIG9mIE1vdGlvbiBDb21wZW5zYXRpb24gcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyIHByZWRpY3RUeXBlCisgICAgOy8vIEFmdGVyIHRoaXMgb25seSByZXNpZHVlIGFkZGl0aW9uIHRvIHRoZSBwcmVkaWN0ZWQgdmFsdWVzIHJlbWFpbgorCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEludGVnZXJQaXhlbCBwcmVkaWN0VHlwZS4gQm90aAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGJhc2UuIEl0IGlzIGp1c3QgYSBjb3B5CisgICAgOy8vIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiBUd28gbGluZXMgYXJlIGRvbmUgcGVyIGxvb3AgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIGFzIHdlbGwgZm9yIHRoYXQgcHVycG9zZS4KKyAgICA7Ly8gCisgICAgOy8vIE1fTE9BRF9YIGxvYWRzIGEgd2hvbGUgcm93IGluIHR3byByZWdpc3RlcnMgYW5kIHRoZW4gdGhleSBhcmUgc3RvcmVkCisgICAgCitDYXNlSW50ZWdlclBpeGVsUm5kME9mZnNldCRvZmZzZXQKK0Nhc2VJbnRlZ2VyUGl4ZWxSbmQxT2Zmc2V0JG9mZnNldAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CitZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMgorICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgQkdUICAgICAgICAgWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFggcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuCisgICAgOy8vIAorICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCBob3Jpem9udGFsIHBpeGVsLgorICAgIDsvLyBNX0xPQURfWElOVCBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZSA0IHJlZ2lzdGVycywgMiB3aXRoIAorICAgIDsvLyBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiBlYWNoIHJlZ2lzdGVyIGFuZCBhbm90aGVyIDIKKyAgICA7Ly8gcmVnaXN0ZXJzIHdpdGggcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gb25lIGhvcml6b250YWxseSBzaGlmdGVkIHBpeGVsCisgICAgOy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluaXRpYWwgcm93IHBpeGVscy4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgCisgICAgOy8vIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyA0IGxhbmUgU0lNRC4KKyAgICA7Ly8gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIG9mIHRoZSAKKyAgICA7Ly8gcm91bmRpbmcgYXMgcmVxdWlyZWQKKyAgICAKK0Nhc2VIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgSUYgJHJuZFZhbCA9IDAKKyAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCisgICAgRU5ESUYKKworICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKK1lsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMxCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgIE1fVUhBREQ4UiAgIHRtcDUsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCisgICAgTV9VSEFERDhSICAgdG1wNiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBTVFJEICAgICAgICB0bXA1LCB0bXA2LCBbcERzdF0sIGRzdFN0ZXAKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFkgcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAorICAgIDsvLyAKKyAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwgcGl4ZWwuCisgICAgOy8vIE1fTE9BRF9YIGdlbmVyYXRlcyAyIHJlZ2lzdGVycyB3aXRoIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIAorICAgIDsvLyBlYWNoIHJlZ2lzdGVyLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gCisgICAgOy8vIDQgbGFuZSBTSU1ELiBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgCisgICAgOy8vIG9mIHRoZSByb3VuZGluZyBhcyByZXF1aXJlZAorICAgIAorQ2FzZUhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBJRiAkcm5kVmFsID0gMAorICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKKyAgICBFTkRJRgorCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldCA7Ly8gUHJlLWxvYWQKK1lsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMyCisgICAgOy8vIFByb2Nlc3Npbmcgb25lIGxpbmUKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgTV9VSEFERDhSICAgdG1wMSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBNX1VIQUREOFIgICB0bXAyLCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzaworICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIDsvLyBQcm9jZXNzaW5nIGFub3RoZXIgbGluZQorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQKKyAgICBNX1VIQUREOFIgICB0bXAzLCB0bXAzLCB0bXAxLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIE1fVUhBREQ4UiAgIHRtcDQsIHRtcDQsIHRtcDIsICgxLSRybmRWYWwpLCBtYXNrCisgICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFhZIHByZWRpY3RUeXBlLiBUaGUgdHdvCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAorICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKKyAgICA7Ly8gCisgICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsLCBob3Jpem9udGFsIAorICAgIDsvLyBhbmQgcmlnaHQtZG93biBkaWFnb25hbCBwaXhlbHMuIEp1c3QgYXMgaW4gSGFsZlBpeGVsWCBjYXNlLCBNX0xPQURfWElOVAorICAgIDsvLyBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZXMgNCByZWdpc3RlcnMgd2l0aCBhIHJvdyBhbmQgaXRzCisgICAgOy8vIDEgcGl4ZWwgcmlnaHQgc2hpZnRlZCB2ZXJzaW9uLCB3aXRoIDQgcGl4ZWxzIGluIG9uZSByZWdpc3Rlci4gQW5vdGhlciAKKyAgICA7Ly8gY2FsbCBvZiB0aGF0IG1hY3JvLWNvbWJpbmF0aW9uIGdldHMgYW5vdGhlciByb3cuIFRoZW4gTV9IU1VNX1hPUiBpcyAKKyAgICA7Ly8gY2FsbGVkIHRvIGdldCBtdXR1YWwgaGFsZi1zdW0gYW5kIHhvciBjb21iaW5hdGlvbnMgb2YgYSByb3cgd2l0aCBpdHMKKyAgICA7Ly8gc2hpZnRlZCB2ZXJzaW9uIGFzIHRoZXkgYXJlIGlucHV0cyB0byB0aGUgTV9BVkc0IG1hY3JvIHdoaWNoIGNvbXB1dGVzCisgICAgOy8vIHRoZSA0IGVsZW1lbnQgYXZlcmFnZSB3aXRoIHJvdW5kaW5nLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGhhbGYtc3VtL3hvciAKKyAgICA7Ly8gdmFsdWVzIHRoYXQgYXJlIHByZXNlcnZlZCBmb3IgbmV4dCByb3cgYXMgdGhleSBjYW4gYmUgcmUtdXNlZCBpbiB0aGUgCisgICAgOy8vIG5leHQgY2FsbCB0byB0aGUgTV9BVkc0IGFuZCBzYXZlcyByZWNvbXB1dGF0aW9uLgorICAgIDsvLyBEdWUgdG8gbGFjayBvZiByZWdpc3RlciwgdGhlIHJvdyBjb3VudGVyIGFuZCBhIG1hc2tpbmcgdmFsdWUgcmVxdWlyZWQgCisgICAgOy8vIGluIE1fQVZHNCBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgcmVnaXN0ZXIgeU1hc2sgd2hlcmUgdGhlIGxhc3QgbmliYmxlCisgICAgOy8vIGhvbGRzIHRoZSByb3cgY291bnRlciB2YWx1ZXMgYW5kIHJlc3QgaG9sZHMgdGhlIG1hc2tpbmcgdmFyaWFibGUgbGVmdCAKKyAgICA7Ly8gc2hpZnRlZCBieSA0CisgICAgCitDYXNlSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBMRFIgICAgICAgICB5TWFzaywgPSgoMHgwMTAxMDEwMSA8PCA0KSArIDgpCisKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCwgbDAKKyAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMwJywgbDAnCisKK1lsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICA7Ly8gUHJvY2Vzc3Npbmcgb25lIGxpbmUKKyAgICA7Ly8gdDAwLCB0MDEsIHQxMCwgdDExIHJlcXVpcmVkIGZyb20gcHJldmlvdXMgbG9vcAorICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMSA7Ly8gTG9hZCBjLCBjJywgZCwgZCcKKyAgICBTVUIgICAgICAgICB5TWFzaywgeU1hc2ssICMyCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxCisgICAgTV9IU1VNX1hPUiAgdDIwLCB0MzAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMSwgbDEKKyAgICBNX0hTVU1fWE9SICB0MjEsIHQzMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMxJywgbDEnCisgICAgTV9BVkc0ICAgICAgdDAwLCB0MTAsIHQyMCwgdDMwLCAkcm5kVmFsIDsvLyBzMCwgbDAsIHMxLCBsMQorICAgIE1fQVZHNCAgICAgIHQwMSwgdDExLCB0MjEsIHQzMSwgJHJuZFZhbCA7Ly8gczAnLCBsMCcsIHMxJywgbDEnCisgICAgU1RSRCAgICAgICAgdDAwLCB0MDEsIFtwRHN0XSwgZHN0U3RlcCAgIDsvLyBzdG9yZSB0aGUgYXZlcmFnZQorICAgIAorICAgIDsvLyBQcm9jZXNzc2luZyBhbm90aGVyIGxpbmUKKyAgICA7Ly8gdDIwLCB0MjEsIHQzMCwgdDMxIHJlcXVpcmVkIGZyb20gYWJvdmUKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgVFNUICAgICAgICAgeU1hc2ssICM3CisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcAorICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAKKyAgICBNX0FWRzQgICAgICB0MjAsIHQzMCwgdDAwLCB0MTAsICRybmRWYWwKKyAgICBNX0FWRzQgICAgICB0MjEsIHQzMSwgdDAxLCB0MTEsICRybmRWYWwKKyAgICBTVFJEICAgICAgICB0MjAsIHQyMSwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBJRiAkb2Zmc2V0Lz0zIDpMT1I6ICRybmRWYWwvPTEKKyAgICAgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zIGVuZCBoZXJlCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDQga2luZHMgb2Ygb2Zmc2V0cyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGFuZCBybmRWYWwKKyAgICA7Ly8gY29tYmluYXRpb24gaW4gdGhlICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcm5kICAgICAgICAgICAgMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFInMgZm9yIHRoZSAiTV9TV0lUQ0giIG1hY3JvCisKKyAgICBNQUNSTworICAgIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQyCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQzCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCAyIGtpbmRzIG9mIHJvdW5kaW5nICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgaW4gdGhlIAorICAgIDsvLyAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcHJlZGljdFR5cGUKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0VfT0ZGU0VUIiBtYWNyb3MKKworICAgIE1BQ1JPCisgICAgTV9DQVNFX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX09GRlNFVCAgMCwgJHByZWRpY3RUeXBlIDsvLyAwIGZvciByb3VuZGluZworICAgICAgICBNX0NBU0VfT0ZGU0VUICAxLCAkcHJlZGljdFR5cGUgOy8vIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCA4IGtpbmRzIG9mIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb25zIGhhbmRsaW5nIG1hY3JvcyAKKyAgICA7Ly8gZm9yIHRoZSBzcGVjaWZpZWQgcHJlZGljdFR5cGUuIEluIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUsIAorICAgIDsvLyByb3VuZGluZyBpcyBub3QgcmVxdWlyZWQgc28gc2FtZSBjb2RlIHNlZ21lbnQgaGFuZGxlcyBib3RoIGNhc2VzCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0sgICAgJHByZWRpY3RUeXBlCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiIgbWFjcm9zIGZvciBzcGVjaWZpZWQgCisgICAgOy8vIHByZWRpY3RUeXBlLiBFYWNoIAorICAgIDsvLyAgICAgICAgICAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiAkcm5kLCAkb2Zmc2V0IAorICAgIDsvLyBpcyBhbiBjb2RlIHNlZ21lbnQgKHN0YXJ0aW5nIHdpdGggYSBsYWJlbCBpbmRpY2F0aW5nIHRoZSBwcmVkaWN0VHlwZSwgCisgICAgOy8vIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb24pCisgICAgOy8vIEZvdXIgY2FsbHMgb2YgdGhpcyBtYWNybyB3aXRoIHRoZSA0IHByZWRpY3Rpb24gbW9kZXMgcG9wdWxhdGUgYWxsIHRoZSAzMiAKKyAgICA7Ly8gaGFuZGxlcnMKKworICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAwCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAxCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAyCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAzCisgICAgSUYgIiRwcmVkaWN0VHlwZSIgLz0gIkludGVnZXJQaXhlbCIgOy8vIElmIG5vdCBJbnRlZ2VyUGl4ZWwgdGhlbiByb3VuZGluZyBtYWtlcyBhIGRpZmZlcmVuY2UKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDAKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDEKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDIKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDMKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKK2FyZ19wU3JjUmVzaWR1ZSAgICAgICBSTiAyCitwU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMTIKK3BEc3QgICAgICAgICAgICAgICAgICBSTiAzCitkc3RTdGVwICAgICAgICAgICAgICAgUk4gMgorcHJlZGljdFR5cGUgICAgICAgICAgIFJOIDEwCitybmRWYWwgICAgICAgICAgICAgICAgUk4gMTEKK21hc2sgICAgICAgICAgICAgICAgICBSTiAxMQorCis7Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3plcm8gICAgICAgICAgICAgICAgICBSTiAxMgoreSAgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3RtcDEgICAgICAgICAgICAgICAgICBSTiA0Cit0bXAyICAgICAgICAgICAgICAgICAgUk4gNQordG1wMyAgICAgICAgICAgICAgICAgIFJOIDYKK3RtcDQgICAgICAgICAgICAgICAgICBSTiA3Cit0bXA1ICAgICAgICAgICAgICAgICAgUk4gOAordG1wNiAgICAgICAgICAgICAgICAgIFJOIDkKK3RtcDcgICAgICAgICAgICAgICAgICBSTiAxMAordG1wOCAgICAgICAgICAgICAgICAgIFJOIDExCit0bXA5ICAgICAgICAgICAgICAgICAgUk4gMTIKKwordDAwICAgICAgICAgICAgICAgICAgIFJOIDQKK3QwMSAgICAgICAgICAgICAgICAgICBSTiA1Cit0MTAgICAgICAgICAgICAgICAgICAgUk4gNgordDExICAgICAgICAgICAgICAgICAgIFJOIDcKK3QyMCAgICAgICAgICAgICAgICAgICBSTiA4Cit0MjEgICAgICAgICAgICAgICAgICAgUk4gOQordDMwICAgICAgICAgICAgICAgICAgIFJOIDEwCit0MzEgICAgICAgICAgICAgICAgICAgUk4gMTEKK3RtcCAgICAgICAgICAgICAgICAgICBSTiAxMgorCit5TWFzayAgICAgICAgICAgICAgICAgUk4gMTQKKworZHN0ICAgICAgICAgICAgICAgICAgIFJOIDEKK3JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKKyAgICA7Ly8gQWxsb2NhdGUgbWVtb3J5IG9uIHN0YWNrCisgICAgTV9BTExPQzQgICAgU3RrX3BEc3QsICAgICAgICAgICA0CisgICAgTV9BTExPQzQgICAgU3RrX3BTcmNSZXNpZHVlLCAgICA0CisgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgIE1fU1RBUlQgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2ssIHIxMQorICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0CisgICAgOy8vIFNhdmUgb24gc3RhY2sKKyAgICBNX1NUUiAgICAgICBwRHN0LCBTdGtfcERzdAorICAgIE1fU1RSICAgICAgIGFyZ19wU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCisgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAorICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKKyAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKKyAgICAKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIAorICAgIEFORCAgICAgICAgIHRtcDEsIHBTcmMsICMzCisgICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHRtcDEsIHByZWRpY3RUeXBlLCBMU0wgIzMKKyAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgcHJlZGljdFR5cGUsIHJuZFZhbCwgTFNMICMyCisgICAgOy8vIFRydW5jYXRpbmcgc291cmNlIHBvaW50ZXIgdG8gYWxpZ24gdG8gNCBieXRlIGxvY2F0aW9uCisgICAgQklDICAgICAgICAgcFNyYywgcFNyYywgIzMKKworICAgIDsvLyBJbXBsZW1lbnRhdGlvbiB0YWtlcyBjYXJlIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgZGlmZmVyZW50IAorICAgIDsvLyBwcmVkaWN0VHlwZXMsIHJvdW5kaW5nIGNhc2VzIGFuZCBzb3VyY2UgcG9pbnRlciBvZmZzZXRzIHRvIGFsaWdubWVudCAKKyAgICA7Ly8gb2YgNCBieXRlcyBpbiBkaWZmZXJlbnQgY29kZSBiYXNlcyB1bmxlc3Mgb25lIG9mIHRoZXNlIHBhcmFtZXRlciB3YXNuJ3QgCisgICAgOy8vIG1ha2luZyBhbnkgZGlmZmVyZW5jZSB0byB0aGUgaW1wbGVtZW50YXRpb24uIEJlbG93IE1fQ0FTRV9NQ1JFQ09OQkxPQ0sKKyAgICA7Ly8gbWFjcm9zIGJyYW5jaCBpbnRvIDggTV9DQVNFIG1hY3JvcyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgMiAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYW5kIDQgb2Zmc2V0cyBvZiB0aGUgcFNyYyBwb2ludGVyIHRvIHRoZSA0IGJ5dGUgCisgICAgOy8vIGFsaWdubWVudC4gCisgICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCisgICAgTV9FTkRTV0lUQ0gKKworICAgIDsvLyBUaGUgTV9NQ1JFQ09OQkxPQ0sgbWFjcm9zIHBvcHVsYXRlIHRoZSBjb2RlIGJhc2VzIGJ5IGNhbGxpbmcgYWxsIDggCisgICAgOy8vIHBhcnRpY3VsYXIgbWFjcm9zICg0IGluIGNhc2Ugb2YgSW50ZWdlclBpeGVsIGFzIHJvdW5kaW5nIG1ha2VzIG5vIAorICAgIDsvLyBkaWZmZXJlbmNlIHRoZXJlKSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgYWxsIGNhc2VzIG9mIHJvdW5kaW5nIGFuZCAKKyAgICA7Ly8gb2Zmc2V0cy4gTFRPUkcgaXMgdXNlZCB0byBzZWdtZW50IHRoZSBjb2RlIGFzIGNvZGUgc2l6ZSBibG9hdGVkIGJleW9uZCAKKyAgICA7Ly8gNEtCLgorICAgIE1fTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAorICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKKyAgICBMVE9SRworICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKKyAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQorU3dpdGNoUHJlZGljdFR5cGVFbmQKKworICAgIDsvLyBSZXNpZHVlIEFkZGl0aW9uCisgICAgOy8vIFRoaXMgaXMgZG9uZSBpbiAyIGxhbmUgU0lNRCB0aG91Z2ggbG9hZHMgYXJlIGZ1cnRoZXIgb3B0aW1pemVkIGFuZAorICAgIDsvLyA0IGJ5dGVzIGFyZSBsb2FkZWQgaW4gY2FzZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIuIEFsZ29yaXRobWljIAorICAgIDsvLyBkZXRhaWxzIGFyZSBpbiBpbmxpbmVkIGNvbW1lbnRzCisgICAgTV9MRFIgICAgICAgcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQorICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAorICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCitwU3JjUmVzaWR1ZU5vdE51bGwgICAgCisgICAgTV9MRFIgICAgICAgcERzdCwgU3RrX3BEc3QKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIFNVQiAgICAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICM0CitZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMQorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdICAgICAgICAgICAgICAgIDsvLyBkc3QgPSBbZGNiYV0KKyAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfSA7Ly8gdG1wMT1bRENdIHRtcDI9W0JBXQorICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXQorICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdCAgICAgICAgICAgICAgICAgIDsvLyB0bXAxID0gWzBjMGFdCisgICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzggICAgICAgICAgOy8vIHRtcDIgPSBbMGQwYl0KKyAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAorICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCisgICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwgMjU1LCB0bXAyKQorICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOCAgIDsvLyB0bXAxID0gW2RjYmFdCisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCAjNAorICAgIAorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdCisgICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0KKyAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2CisgICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNgorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdAorICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4CisgICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMworICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKKyAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQorICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyCisgICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCBkc3RTdGVwCisgICAgCisgICAgQkdUICAgICAgICAgWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCitwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorCisgICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKQEAgLTAsMCArMSwyODMgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICogRGVzY3JpcHRpb246Cis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCis7ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKzsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCis7ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KKzsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCis7ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAorOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCis7ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCis7ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKzsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCis7ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCis7ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCis7ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCis7ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCis7ICogICA0LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqKioqKioqKioKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAKKworICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKworOy8vIElucHV0IEFyZ3VtZW50cworCitwU3JjRHN0ICAgICAgICAgIFJOIDAKK3BQcmVkQnVmUm93ICAgICAgUk4gMQorcFByZWRCdWZDb2wgICAgICBSTiAyCitjdXJRUCAgICAgICAgICAgIFJOIDMKK1FQICAgICAgICAgICAgICAgUk4gMworcHJlZFFQICAgICAgICAgICBSTiA0CitwcmVkRGlyICAgICAgICAgIFJOIDUKK0FDUHJlZEZsYWcgICAgICAgUk4gNgordmlkZW9Db21wICAgICAgICBSTiA3ICAKKworOy8vIExvY2FsIFZhcmlhYmxlcworCit0ZW1wMiAgICAgICAgICAgIFJOIDUKK25lZ0N1clFQICAgICAgICAgUk4gNworbmVnZGNTY2FsZXIgICAgICBSTiA3Cit0ZW1wUHJlZCAgICAgICAgIFJOIDgKKworZGNTY2FsZXIgICAgICAgICBSTiA0CitDb2VmZlRhYmxlICAgICAgIFJOIDkKK2Fic0NvZWZmREMgICAgICAgUk4gOQordGVtcDMgICAgICAgICAgICBSTiA2CithYnNDb2VmZkFDICAgICAgIFJOIDYKKworc2hvcnRWaWRlb0hlYWRlciBSTiA5CitwcmVkQ29lZmZUYWJsZSAgIFJOIDEwCitDb3VudCAgICAgICAgICAgIFJOIDEwCit0ZW1wMSAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgIFJOIDEyCitSZW0gICAgICAgICAgICAgIFJOIDE0Cit0ZW1wICAgICAgICAgICAgIFJOIDExCitSZXR1cm4gICAgICAgICAgIFJOIDAKKworICAgICAgIAorCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjEyCisgICAgICAgCisgICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKKyAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAorICAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0CisgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAorICAgICAgIAorICAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgCisgICAgICAgOy8vIGRjU2NhbGVyIENhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisgICAgICAgICAgIAorICAgIAorY2FsRENWYWwKKyAgICAgIAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAorICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAorCisgICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wIHByZWQgYnkgcGVyZm9ybWluZyBEaXZpc2lvbgorICAgICAgICAgICAgCisgICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgIAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wcmVkaWN0aW9uIGNvZWZmCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vYWJzQ29lZmZEQz1hYnModGVtcDEpCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtID0gcFByZWRCdWZSb3coQ29sKVswXS10ZW1wUHJlZCpkY1NjYWxlciAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbF0KKyAgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUmVtPj1yb3VuZChkY1NjYWxlci8yKTt0ZW1wUHJlZD10ZW1wUHJlZCsxCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvIGlmIHBQcmVkQnVmUm93KENvbClbMF08MDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCisKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCisgICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcDEsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wMSxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wMSB0byBwUHJlZEJ1ZkNvbAorIAorICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCisKKyAgICAgICAgICAgICAgCisgICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzQKKyAgICAgICBNVUwgICAgICAgICAgICAgdGVtcDEsY3VyUVAsdGVtcDEKKyAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgUlNCICAgICAgICAgICAgIG5lZ0N1clFQLGN1clFQLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBDb2VmZlRhYmxlLFtwcmVkQ29lZmZUYWJsZSx0ZW1wMV0gICAgICAgICAgICAgIDsvLyBDb2VmZlRhYmxlPTB4MWZmZmYvY3VyUVAKKyAgICAgICBBREQgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9Y3VyUVArMQorICAgICAgIExTUiAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1yb3VuZChjdXJRUC8yKSAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBMb29wIENvdW50CisgICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCisKKyAgICAgICAKKworbG9vcDEgICAgICAgCisgICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPXBQcmVkQnVmUm93W2ldLCAxPTxpPD03CisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKKyAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz0gYWJzKHBQcmVkQnVmUm93W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZSb3dbaV0qcHJlZFFQCisgICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93W2ldKnByZWRRUCoweDFmZmZmL2N1clFQCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMgICAgICAgICAgICAgICA7Ly8gUmVtPWFicyhwUHJlZEJ1ZlJvd1tpXSktdGVtcFByZWQqY3VyUVAKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldLDE8PWk8OAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgUmVtPj1yb3VuZChjdXJRUC8yKTsgdGVtcFByZWQ9dGVtcFByZWQrMQorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZlJvd1tpXTwwIDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9dGVtcFByZWQrcFNyY0RzdFtpXQorICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmUm93W2ldPXRlbXAKKyAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzEKKyAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpZiBpPTgKKyAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDEKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQKKworSG9yaXpvbnRhbAorCisgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyBpPTgKKworbG9vcDIgIAorICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDIsQ291bnQsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDI9aT4+MworICAgICAgIAorICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKKyAgICAgICAKKyAgICAgICBMRFJIICAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZkFDPXBQcmVkQnVmQ29sW2k+PjNdICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQworICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NworICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPWFicyhwUHJlZEJ1ZkNvbFtpPj4zXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUAorICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAvY3VyUVAKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgUmVtIHdpdGggcm91bmQoY3VyUVAvMikKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PXJvdW5kKGN1clFQLzIpCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmQ29sW2k+PjMgPDAgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgCisgICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKKyAgICAgICAKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXT0gY2xpcHBlZCB2YWx1ZQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZkNvbFtpPj4zXT10ZW1wCisgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSs4CisgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaSB3aXRoIDY0CisgICAgICAgQkxUICAgICAgICAgICAgIGxvb3AyCisKKyAgICAgICAgICAgICAKK0V4aXQKKyAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU5MWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCkBAIC0wLDAgKzEsMTQxIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludGVyX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gcFNyY0RzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSBRUCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQorOyAqIFtpbl0gdmlkZW9Db21wICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorOyAqICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKzsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAgCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICAgICAgICAgICAgIFJOIDAKK0NvdW50ICAgICAgICAgICAgICBSTiA0ICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gMgordGVtcFZhbDQzICAgICAgICAgIFJOIDMKK1FQMSAgICAgICAgICAgICAgICBSTiA1CitYMiAgICAgICAgICAgICAgICAgUk4gNgorWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiA3CisKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjkKKyAgICAgICAKKyAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgIFRTVCAgICAgIFFQLCMxCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCisgICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KKyAgICAgICAgTU9WTkUgICAgUVAxLFFQCisgICAgICAgIE1PViAgICAgIHR3bywjMgorICAgICAgICAKKyAgICAgICAgCisKK0xvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1swLTE1XQorICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIAorICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAorICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIEJHVCAgICAgIExvb3AKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjhlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKQEAgLTAsMCArMSwxODggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorIAorCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgCisgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgCisgICAKKyAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgCisgICAgICAgICAKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKK3ZpZGVvQ29tcCAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK1JldHVybiAgICAgICAgICAgICBSTiAwCitkY1NjYWxlciAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgICAgUk4gNgorICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gNAordGVtcFZhbDQzICAgICAgICAgIFJOIDUKK1FQMSAgICAgICAgICAgICAgICBSTiA2CitYMiAgICAgICAgICAgICAgICAgUk4gNworWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiAxMAorQ291bnQgICAgICAgICAgICAgIFJOIDExCisKKworCisgICAKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjExCisKKworICAgICAgICAKKyAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIERDIGNvZWZmaWNpZW50CisKKyAgICAgICAgVEVRICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICA7Ly8gVGVzdCBpZiBzaG9ydCBWaWRlbyBIZWFkZXIgZmxhZyA9MCAgICAgICAgICAgICAKKyAgICAgICAgTU9WTkUgICAgIGRjU2NhbGVyLCM4ICAgICAgICAgICAgICA7Ly8gaWYgc2hvcnRWaWRlb0hlYWRlciBpcyBub24gemVybyBkY1NjYWxlcj04CisgICAgICAgIEJORSAgICAgICBjYWxEQ1ZhbAorICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorCisKKyAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCisKK2NhbERDVmFsCisKKyAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KKyAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCisgICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCisgICAgICAgIAorCisgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICBUU1QgICAgICBRUCwjMQorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MworICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCisgICAgICAgIE1PVk5FICAgIFFQMSxRUAorICAgICAgICBNT1YgICAgICB0d28sIzIKKworCisgICAgICAgICAgICAgICAgCisgICAgICAgIAorCitMb29wCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgorICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgIAorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCisgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgTG9vcAorCisgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmluZyB0aGUgSW52ZXJzZSBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQKKworICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgorICAgICAgICAKKyAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MyZDcwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTQ+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKKyAgVjcgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKKyAgaW50ZXJuYWwgYWNjZXNzCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKK2JldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCisKK0JldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50CittdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKK3NvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQorY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCitCdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKK3RoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQorYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgordGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKK2F0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCityZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQorZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKK2RhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCitCeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAordG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCitkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAord2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQord2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAorbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KKworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwordHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KKworVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDE0LlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Citub3RlLgorCitUaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KKworVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KK01ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCisKK1RoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQorIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6CisKKyAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODMxMGY2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCkBAIC0wLDAgKzEsOTEgQEAKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAorZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKKzRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCis4YWM1ZmE4MGVhOThlMzkxZjU3MzBhMzc1MjgwYjViZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCiszYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKKzUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKKzMyMzAwOGI3MmU5ZjA0MDk5YThjYjQyZTk5YTFmYWNlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCitkNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKzg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCis1ZjcyMTNhNGYzNzYyN2IzYzU4ZjYyOTRiYTQ3N2UzMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworZDA2NmUzYzgxZDgyNjE2ZjM3ZWMxODEwZWE0OWU3YjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKK2ZlNjI5YTNlOWQ1NTM5NWE2MDk4YmRmMjQzMWI1ZjAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzViMTNmYjk1NGI3Njc5ZGUyMDA3NmJiNmE3ZjRlZTFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCiswMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitmYTEwNzJjZjFkMTdlOTY2NmM5ZjFlMjE1ZmEzMDJiMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworZGIzODdiOWU2NmQzMjc4N2Y0N2VmOWNmMDM0N2RhMmEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCitlYTUzN2U0ZTJhZDAzYTE5NDA5ODEwNTVmYTNhY2UwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworMjlhNDI4Mzg4NWI5NDczYTM1NTBhODFlZmYyNTU5ZDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCithMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworYzkyMWRmNzMzOTdhMzJjOTQ3ZGM5OTZiYTY4NTg1NTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCiszNzY5ZTE0ZjJmYzNmNTE0ZDAyNWZlNmFiNzNmZjY3YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworYzAyOWQxY2ViZWEwYTA5ZTFkMjM1YTM3ZTIxNTUwMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworMDc2YTAzM2Y4MTYxNzUwYTY4NTc1NmY5ZjUxZjA0YzkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCitjNWI1ZDIyODQyODIyZTZlNWUzMTA5NDg4MmNiZWI0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworZjZiZGY2ZDkxNGE0YTE0NzlmNTI0OTUxYTM0MDk4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworZWJlYjA3MTNhOWIyZWEyNTk4NjM2MGVmMjYyMTM4YzQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKzc4ZWQ5ZWEyMDBmYWE3YmU2NjU0NDVhNzEzODU5YWYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCitjMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzQwYmVkNjc5YTlmNmUwZDNlZmUyMTZiN2Q0YTljZjQ1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzI1MTNiNjA1NTliYTcxYWU0OTVjNjA1M2ZiNzc5ZmE5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisyZmIxZWUxN2MzNmUzYzE0NjljMTcwZjZkYWMxMWJmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCitjYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworYmVjNmRlMzQ4YjExMzQzODQ5ODg2N2I4NjkwMDE2MjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKK2RiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworZGZhN2U1YjU4MDI3YmUzNTQyZGRhMDU5M2I3N2IyZDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis0ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworMzk5OTE5NjExNzljYTAzYjYzODFiNmU2NTNiMWYxNGIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisxYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisxYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis0ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisyZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworNmNlMzYzYWFkYzlkNjVjMzA4YjQwY2NhODkwMmU0ZjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworYmYyMTJmNzg2NzcyYWVkMmJjNzA1ZDIyZmY0ZTc0ZjUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworMmJiNDdlZDljOWUyNWM1NzA5YzZkOWI0YWQzOWEzOGEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis0MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworYmM5Nzc4ODk4ZGQ0MTEwMWRjMGZiMDEzOWVhZjgzY2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKK2ZjMTkxZWVhZTQzZjhjZTczNWRiZDMxMWNjN2JjYjhkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis0NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCis2NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisxMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAorYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCisxZjgxMTg3YjQ4NDg3YThlYTZkYmMzMjc2NDhlM2U0ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKzkzNmQzZjIwMzhhNmY4NjEzZWMyNWU1MGNjNjAxZmU4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKzhmNjcwOGEyNDkxMzA5NjJlMGJjNWMwNDRhYzZkZDkzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKK2FhYjc3MTM0MTQ0MjhlOTVkZTBiYTc5OWEyNjc5YjM2ICBBUk1fREVMSVZFUllfOTc0MTQuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0YzE5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApAQCAtMCwwICsxLDc4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzczOGY3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCkBAIC0wLDAgKzEsNjcwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIAorOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCis7Ly8KKzsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCis7Ly8KKzsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCis7Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKKzsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKKzsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorOy8vCis7Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAorOy8vCis7Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKzsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQorOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQorOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKzsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKzsvLworOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKzsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCis7Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorOy8vCis7Ly8gVVNBR0U6Cis7Ly8KKzsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgorOy8vCis7Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAorOy8vCis7Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQorOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCis7Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKKzsvLyBjYWxsIE1fQkRfRklOSS4KKzsvLworOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Cis7Ly8KKzsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQorOy8vCis7Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKKzsvLworOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAorOy8vCis7Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KKzsvLworOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCis7Ly8gdmFyaWFibGVzOgorOy8vCisKKyAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQorICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKKyAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKKyAgIAorOy8vICAgICAgICAKKzsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQorOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCis7Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCis7Ly8KKzsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Cis7Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCis7Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Cis7Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKKzsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKKzsvLworOy8vCisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQorICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKKyAgICAgICAgOy8vIHNjaGVkdWxpbmcuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQorICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKKyAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKKworcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCitCaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKK0JpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkIGlucHV0cworICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCisgICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQorICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KKyAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMworICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAorICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgorICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQorICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQorICAgICAgICBJRiAoJE48PTgpCisgICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEVMU0UgICAgICAgIAorICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCisgICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQorICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gYnVmZmVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04CisgICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKKyAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKKyAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQorICAgICAgICAKKyAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0CisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCisgICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKKzAxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCisgICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5CisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKKyAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKKyAgICAgICAgQkNTICAgICAlRlQwMgorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKKyAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKKyAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1CisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAorICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAorICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5CiswMgorICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQorICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1CisgICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQorICAgICAgICAKKyAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAorICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKKworICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKKyAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKKyAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3CisgICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKKyAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4CisKKyAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKKyAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKKyAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCisgICAgICAgIAorICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCisKKyAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKKyAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4CisgICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNworICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICAKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKKyAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKKyAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAorICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCisgICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY5OTAzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjZmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAorICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KKyAqCisgKi8KKyAgCisjaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQorICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKKyAgICAgICogIHMoNik9Mi4wCisgICAgICAqICBzKDcpPTQuMAorICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQorICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCisJICAqLworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOworCisjZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCisKKworLyogRW5kIG9mIEZpbGUgKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiYWEwODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKQEAgLTAsMCArMSwxNDUxIEBACis7Ly8KKzsvLyBUaGlzIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgc29mdHdhcmUgbWF5IGJlIHVzZWQgb25seSBhcworOy8vIGF1dGhvcmlzZWQgYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQKKzsvLyAgIChDKSBDT1BZUklHSFQgMjAwNCBBUk0gTGltaXRlZAorOy8vICAgICAgIEFMTCBSSUdIVFMgUkVTRVJWRUQKKzsvLyBUaGUgZW50aXJlIG5vdGljZSBhYm92ZSBtdXN0IGJlIHJlcHJvZHVjZWQgb24gYWxsIGF1dGhvcmlzZWQKKzsvLyBjb3BpZXMgYW5kIGNvcGllcyBtYXkgb25seSBiZSBtYWRlIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkCis7Ly8gYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQuCis7Ly8KKzsvLyBJRENUX3MucworOy8vCis7Ly8gSW52ZXJzZSBEQ1QgbW9kdWxlCis7Ly8KKzsvLyAKKzsvLyBBTEdPUklUSE0gREVTQ1JJUFRJT04KKzsvLworOy8vIFRoZSA4eDggMkQgSURDVCBpcyBwZXJmb3JtZWQgYnkgY2FsY3VsYXRpbmcgYSAxRCBJRENUIGZvciBlYWNoCis7Ly8gY29sdW1uIGFuZCB0aGVuIGEgMUQgSURDVCBmb3IgZWFjaCByb3cuCis7Ly8KKzsvLyBUaGUgOC1wb2ludCAxRCBJRENUIGlzIGRlZmluZWQgYnkKKzsvLyAgIGYoeCkgPSAoQygwKSpUKDApKmMoMCx4KSArIC4uLiArIEMoNykqVCg3KSpjKDcseCkpLzIKKzsvLworOy8vICAgQyh1KSA9IDEvc3FydCgyKSBpZiB1PTAgb3IgMSBpZiB1IT0wCis7Ly8gICBjKHUseCkgPSBjb3MoICgyeCsxKSp1KnBpLzE2ICkKKzsvLworOy8vIFdlIGNvbXB1dGUgdGhlIDgtcG9pbnQgMUQgSURDVCB1c2luZyB0aGUgcmV2ZXJzZSBvZgorOy8vIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmxvdyBncmFwaCB3aGljaCB3ZSBzcGxpdCBpbnRvCis7Ly8gNSBzdGFnZXMgbmFtZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBpZGVudGlmeSB3aXRoIHRoZQorOy8vIGZvcndhcmQgRENULiBEaXJlY3QgaW52ZXJzaW9uIG9mIHRoZSBmb3J3YXJkIGZvcm11bGFlCis7Ly8gaW4gZmlsZSBGRENUX3MucyBnaXZlczoKKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkgIFsgQSh1KT00KkModSkqYyh1LDApIF0KKzsvLyAgICAgICAgICAgICBbIEEoMCkgPSAyKnNxcnQoMikKKzsvLyAgICAgICAgICAgICAgIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKSBdCis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IChqMitqNikvMiAgICAgIGkyID0gKGoyLWo2KS8yCis7Ly8gICAgICAgICAgICAgaTcgPSAoajUrajMpLzIgICAgICBpNCA9IChqNS1qMykvMgorOy8vICAgICAgICAgICAgIGk1ID0gKGoxK2o3KS8yICAgICAgaTYgPSAoajEtajcpLzIKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gKGkwK2kxKS8yICAgICAgaDEgPSAoaTAtaTEpLzIKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9ICBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBoNiA9IC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBbIFRoZSBhYm92ZSB0d28gbGluZXMgcm90YXRlIGJ5IC0ocGkvOCkgXQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KS9zcXJ0MiAgaDcgPSAoaTUraTcpLzIgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSAoaDAraDMpLzIgICAgICBnMyA9IChoMC1oMykvMgorOy8vICAgICAgICAgICAgIGcxID0gKGgxK2gyKS8yICAgICAgZzIgPSAoaDEtaDIpLzIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IChnMCtnNykvMiAgICAgIGY3ID0gKGcwLWc3KS8yCis7Ly8gICAgICAgICAgICAgZjEgPSAoZzErZzYpLzIgICAgICBmNiA9IChnMS1nNikvMgorOy8vICAgICAgICAgICAgIGYyID0gKGcyK2c1KS8yICAgICAgZjUgPSAoZzItZzUpLzIKKzsvLyAgICAgICAgICAgICBmMyA9IChnMytnNCkvMiAgICAgIGY0ID0gKGczLWc0KS8yCis7Ly8KKzsvLyBOb3RlIHRoYXQgbW9zdCBjb2VmZmljaWVudHMgYXJlIGhhbHZlZCAzIHRpbWVzIGR1cmluZyB0aGUKKzsvLyBhYm92ZSBjYWxjdWxhdGlvbi4gV2UgY2FuIHJlc2NhbGUgdGhlIGFsZ29yaXRobSBkaXZpZGluZworOy8vIHRoZSBpbnB1dCBieSA4IHRvIHJlbW92ZSB0aGUgaGFsdmluZ3MuCis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpLzgKKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gajIgKyBqNiAgICAgICAgaTIgPSBqMiAtIGo2Cis7Ly8gICAgICAgICAgICAgaTcgPSBqNSArIGozICAgICAgICBpNCA9IGo1IC0gajMKKzsvLyAgICAgICAgICAgICBpNSA9IGoxICsgajcgICAgICAgIGk2ID0gajEgLSBqNworOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSBpMCArIGkxICAgICAgICBoMSA9IGkwIC0gaTEKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9IDIqKCBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDYgPSAyKigtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KSpzcXJ0MiAgaDcgPSBpNSArIGk3IAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gaDAgKyBoMyAgICAgICAgZzMgPSBoMCAtIGgzCis7Ly8gICAgICAgICAgICAgZzEgPSBoMSArIGgyICAgICAgICBnMiA9IGgxIC0gaDIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IGcwICsgZzcgICAgICAgIGY3ID0gZzAgLSBnNworOy8vICAgICAgICAgICAgIGYxID0gZzEgKyBnNiAgICAgICAgZjYgPSBnMSAtIGc2Cis7Ly8gICAgICAgICAgICAgZjIgPSBnMiArIGc1ICAgICAgICBmNSA9IGcyIC0gZzUKKzsvLyAgICAgICAgICAgICBmMyA9IGczICsgZzQgICAgICAgIGY0ID0gZzMgLSBnNAorOy8vCis7Ly8gTm90ZToKKzsvLyAxLiBUaGUgc2NhbGluZyBieSBBKHUpLzggY2FuIG9mdGVuIGJlIGNvbWJpbmVkIHdpdGggaW52ZXJzZQorOy8vICAgIHF1YW50aXphdGlvbi4gVGhlIGNvbHVtbiBhbmQgcm93IHNjYWxpbmdzIGNhbiBiZSBjb21iaW5lZC4KKzsvLyAyLiBUaGUgZmxvd2dyYXBoIGluIHRoZSBBQU4gcGFwZXIgaGFzIGg0LGc2IG5lZ2F0ZWQgY29tcGFyZWQKKzsvLyAgICB0byB0aGUgYWJvdmUgY29kZSBidXQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbC4KKzsvLyAzLiBUaGUgcm90YXRpb24gYnkgLXBpLzggY2FuIGJlIHBlZm9ybWVkIHVzaW5nIHRocmVlIG11bHRpcGxpZXMKKzsvLyAgICBFZyAgYyppNCtzKmk2ID0gKGk2LWk0KSpzICsgKGMrcykqaTQKKzsvLyAgICAgICAtcyppNCtjKmk2ID0gKGk2LWk0KSpzICsgKGMtcykqaTYKKzsvLyA0LiBJZiB8VCh1KXw8PTEgdGhlbiBmcm9tIHRoZSBJRENUIGRlZmluaXRpb24sCis7Ly8gICAgfGYoeCl8IDw9ICgoMS9zcXJ0MikgKyB8YygxLHgpfCArIC4uICsgfGMoNyx4KXwpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIGNvcyhwaS8xNikgKyAuLi4gKyBjb3MoNypwaS8xNikpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIChjb3QocGkvMzIpLTEpLzIpLzIKKzsvLyAgICAgICAgICAgID0gKDEgKyBjb3MocGkvMTYpICsgY29zKDJwaS8xNikgKyBjb3MoM3BpLzE2KSkvc3FydCgyKQorOy8vICAgICAgICAgICAgPSAoYXBwcm94KTIuNjQKKzsvLyAgICBTbyB0aGUgbWF4IGdhaW4gb2YgdGhlIDJEIElEQ1QgaXMgfng3LjAgPSAzIGJpdHMuCis7Ly8gICAgVGhlIHRhYmxlIGJlbG93IHNob3dzIGlucHV0IHBhdHRlcm5zIGdlbmVyYXRpbmcgdGhlIG1heGltdW0KKzsvLyAgICB2YWx1ZSBvZiB8Zih1KXwgZm9yIGlucHV0IGluIHRoZSByYW5nZSB8VCh4KXw8PTEuIE09LTEsIFA9KzEKKzsvLyAgICBJbnB1dFBhdHRlcm4gICAgICBNYXggfGYoeCl8Cis7Ly8gICAgICBQUFBQUFBQUCAgICAgICAgfGYwfCA9ICAyLjY0Cis7Ly8gICAgICBQUFBNTU1NTSAgICAgICAgfGYxfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NTVBQUCAgICAgICAgfGYyfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NUFBNTSAgICAgICAgfGYzfCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QUE1NUCAgICAgICAgfGY0fCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QTU1QTSAgICAgICAgfGY1fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBQTVBNUCAgICAgICAgfGY2fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBNUE1QTSAgICAgICAgfGY3fCA9ICAyLjY0Cis7Ly8gICBOb3RlIHRoYXQgdGhpcyBpbnB1dCBwYXR0ZXJuIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlCis7Ly8gICBjb3JyZXNwb25kaW5nIG1heCBpbnB1dCBwYXR0ZXIgZm9yIHRoZSBGRENULgorCis7Ly8gQXJndW1lbnRzCisKK3BTcmMgICAgUk4gMCAgICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCitTdHJpZGUgIFJOIDEgICAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworcERlc3QgICBSTiAyICAgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgorcFNjYWxlICBSTiAzICAgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworCisgICAgICAgIDsvLyBEQ1QgSW52ZXJzZSBNYWNybworICAgICAgICA7Ly8gVGhlIERDVCBjb2RlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgYWNjb3JkaW5nCisgICAgICAgIDsvLyB0byB0aGUgZm9sbG93aW5nIGlucHV0czoKKyAgICAgICAgOy8vICRvdXRzaXplID0gInU4IiAgOiAgOC1iaXQgdW5zaWduZWQgZGF0YSBzYXR1cmF0ZWQgKDAgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInM5IiAgOiAxNi1iaXQgc2lnbmVkIGRhdGEgc2F0dXJhdGVkIHRvIDktYml0ICgtMjU2IHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzMTYiIDogMTYtYml0IHNpZ25lZCBkYXRhIG5vdCBzYXR1cmF0ZWQgKG1heCBzaXplIH4rLy0xNDI3MykKKyAgICAgICAgOy8vICRpbnNjYWxlID0gInMxNiIgOiBzaWduZWQgMTYtYml0IGFhbi1zY2FsZSB0YWJsZSwgUTE1IGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICJzMzIiIDogc2lnbmVkIDMyLWJpdCBhYW4tc2NhbGUgdGFibGUsIFEyMyBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0czoKKyAgICAgICAgOy8vIHBTcmMgICA9IHIwID0gUG9pbnRlciB0byBpbnB1dCBkYXRhCisgICAgICAgIDsvLyAgICAgICAgICAgICAgIFJhbmdlIGlzIC0yNTYgdG8gKzI1NSAoOS1iaXQpCisgICAgICAgIDsvLyBTdHJpZGUgPSByMSA9IFN0cmlkZSBiZXR3ZWVuIGlucHV0IGxpbmVzCisgICAgICAgIDsvLyBwRGVzdCAgPSByMiA9IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEKKyAgICAgICAgOy8vIHBTY2FsZSA9IHIzID0gUG9pbnRlciB0byBhYW4tc2NhbGUgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5ICRpbnNjYWxlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVCAgJG91dHNpemUsICRpbnNjYWxlLCAkc3RyaWRlCisgICAgICAgIExDTEEgICAgU0hJRlQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8gUkVHSVNURVIgQUxMT0NBVElPTgorOy8vIFRoaXMgaXMgaGFyZCBzaW5jZSB3ZSBoYXZlIDggdmFsdWVzLCA5IGZyZWUgcmVnaXN0ZXJzIGFuZCBlYWNoCis7Ly8gYnV0dGVyZmx5IHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiBXZSBhbHNvIHdhbnQgdG8gCis7Ly8gbWFpbnRhaW4gcmVnaXN0ZXIgb3JkZXIgc28gd2UgY2FuIHVzZSBMRE0vU1RNLiBUaGUgdGFibGUgYmVsb3cKKzsvLyBzdW1tYXJpc2VzIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHRoYXQgbWVldHMgYWxsIHRoZXNlIGNyaXRlcmlhLgorOy8vIGE9MXN0Y29sLCBiPTJuZGNvbCwgZixnLGgsaSBhcmUgZGF0YWZsb3cgcG9pbnRzIGRlc2NyaWJlZCBhYm92ZS4KKzsvLworOy8vIHIxICBhMDEgICAgIGcwICBoMAorOy8vIHI0ICBiMDEgZjAgIGcxICBoMSAgaTAKKzsvLyByNSAgYTIzIGYxICBnMiAgICAgIGkxCis7Ly8gcjYgIGIyMyBmMiAgZzMgIGgyICBpMgorOy8vIHI3ICBhNDUgZjMgICAgICBoMyAgaTMKKzsvLyByOCAgYjQ1IGY0ICBnNCAgaDQgIGk0Cis7Ly8gcjkgIGE2NyBmNSAgZzUgIGg1ICBpNQorOy8vIHIxMCBiNjcgZjYgIGc2ICBoNiAgaTYKKzsvLyByMTEgICAgIGY3ICBnNyAgaDcgIGk3Cis7Ly8KK3JhMDEgICAgUk4gMQorcmIwMSAgICBSTiA0CityYTIzICAgIFJOIDUKK3JiMjMgICAgUk4gNgorcmE0NSAgICBSTiA3CityYjQ1ICAgIFJOIDgKK3JhNjcgICAgUk4gOQorcmI2NyAgICBSTiAxMAorcnRtcCAgICBSTiAxMQorY3NQaUJ5OCBSTiAxMiAgIDsvLyBbIChTaW4ocGkvOClAUTE1KSwgKENvcyhwaS84KUBRMTUpIF0KK0xvb3BSUjIgUk4gMTQgICA7Ly8gWyBMb29wTnVtYmVyPDwxMyAsICgxL1NxcnQoMikpQFExNSBdCis7Ly8gVHJhbnNwb3NlIGFsbG9jYXRpb24KK3hmdCAgICAgUk4gcmEwMQoreGYwICAgICBSTiByYjAxCit4ZjEgICAgIFJOIHJhMjMKK3hmMiAgICAgUk4gcmIyMworeGYzICAgICBSTiByYTQ1Cit4ZjQgICAgIFJOIHJiNDUKK3hmNSAgICAgUk4gcmE2NworeGY2ICAgICBSTiByYjY3Cit4ZjcgICAgIFJOIHJ0bXAKKzsvLyBJU3RhZ2UgMSBhbGxvY2F0aW9uCit4ZzAgICAgIFJOIHhmdAoreGcxICAgICBSTiB4ZjAKK3hnMiAgICAgUk4geGYxCit4ZzMgICAgIFJOIHhmMgoreGd0ICAgICBSTiB4ZjMKK3hnNCAgICAgUk4geGY0Cit4ZzUgICAgIFJOIHhmNQoreGc2ICAgICBSTiB4ZjYKK3hnNyAgICAgUk4geGY3Cis7Ly8gSVN0YWdlIDIgYWxsb2NhdGlvbgoreGgwICAgICBSTiB4ZzAKK3hoMSAgICAgUk4geGcxCit4aHQgICAgIFJOIHhnMgoreGgyICAgICBSTiB4ZzMKK3hoMyAgICAgUk4geGd0Cit4aDQgICAgIFJOIHhnNAoreGg1ICAgICBSTiB4ZzUKK3hoNiAgICAgUk4geGc2Cit4aDcgICAgIFJOIHhnNworOy8vIElTdGFnZSAzLDQgYWxsb2NhdGlvbgoreGl0ICAgICBSTiB4aDAKK3hpMCAgICAgUk4geGgxCit4aTEgICAgIFJOIHhodAoreGkyICAgICBSTiB4aDIKK3hpMyAgICAgUk4geGgzCit4aTQgICAgIFJOIHhoNAoreGk1ICAgICBSTiB4aDUKK3hpNiAgICAgUk4geGg2Cit4aTcgICAgIFJOIHhoNworICAgICAgICAKKyAgICAgICAgTV9TVFIgICBwRGVzdCwgIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX1NUUiAgIFN0cmlkZSwgcFN0cmlkZQorICAgICAgICBFTkRJRgorICAgICAgICBNX0FEUiAgIHBEZXN0LCAgcEJsaworICAgICAgICBMRFIgICAgIGNzUGlCeTgsID0weDMwZmM3NjQyCisgICAgICAgIExEUiAgICAgTG9vcFJSMiwgPTB4MDAwMDVhODIKKyAgCit2Nl9pZGN0X2NvbCRfRgorICAgICAgICA7Ly8gTG9hZCBldmVuIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpNCwgW3BTcmNdLCAjNCAgOy8vIGowCisgICAgICAgIExEUiAgICAgeGk1LCBbcFNyYywgIzQqMTYtNF0gIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpNiwgW3BTcmMsICMyKjE2LTRdICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTcsIFtwU3JjLCAjNioxNi00XSAgOy8vIGo2CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgRXZlbiBWYWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiA7Ly8gMTZ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgIDEyCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM0CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzQqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICMyKjE2LTRdCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgU01MQUJCICB4aTMsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk0LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpMCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTUsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTMsIHhpNCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGkxLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkyLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTEsIHhpMSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMSwgeGk2LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAoMTIrOC0xNikKKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM4CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzAqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM0KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzQqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk1LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGUsICMyKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzIqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM2KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk3LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBvZGQgdmFsdWVzCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTYtNF0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNi00XSAgICAgIDsvLyBqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2LTRdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTYtNF0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIElGICB7VFJVRX0KKyAgICAgICAgICAgIDsvLyBzaG9ydGN1dCBpZiBvZGQgdmFsdWVzIDAKKyAgICAgICAgICAgIFRFUSAgICAgeGkwLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTEsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMiwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkzLCAjMAorICAgICAgICAgICAgQkVRICAgICB2Nk9kZFplcm8kX0YKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBzY2FsZWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgU1RNSUEgICBwRGVzdCwge3hpNCwgeGk1LCB4aTYsIHhpN30KKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBvZGQgdmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIKKyAgICAgICAgICAgIDsvLyBQZXJmb3JtIEFBTiBTY2FsZQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjE2LTRdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzcqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM1KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGk0LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTcsIHhpNywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNywgeGkwLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTUsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkyLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk0LCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTYsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkzLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNSwgeGk1LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk1LCB4aTIsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjMSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzcqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjNyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTEsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzUqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzMqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTMsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBTQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTSEFERDE2IHhpNSwgeGk1LCB4aXQKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNIQUREMTYgeGk3LCB4aTcsIHhpdAorICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdF0gICAgICAgICAgICA7Ly8gajAsIGo0IHNjYWxlZAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMQorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNBREQxNiAgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTU1VCMTYgIHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0FERDE2ICB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNTVUIxNiAgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTQUREMTYgIHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNBREQxNiAgeGYwLCB4ZzAsIHhnNworICAgICAgICBTU1VCMTYgIHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgIEIgICAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgCit2Nk9kZFplcm8kX0YKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICBTSEFERDE2IHhpMywgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTQsIHhpNQorICAgICAgICBTSFNVQjE2IHhoMSwgeGk0LCB4aTUgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBNT1YgIHhmMywgeGczCisgICAgICAgIE1PViAgeGY0LCB4ZzMKKyAgICAgICAgTU9WICB4ZjIsIHhnMgorICAgICAgICBNT1YgIHhmNSwgeGcyCisgICAgICAgIE1PViAgeGYxLCB4ZzEKKyAgICAgICAgTU9WICB4ZjYsIHhnMQorICAgICAgICBNT1YgIHhmMCwgeGcwCisgICAgICAgIE1PViAgeGY3LCB4ZzAKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgIAorICAgICAgICAKK3Y2X2lkY3Rfcm93JF9GCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzNHRvNyB4MS80CisgICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTZdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTZdICAgICAgOy8vIDQqajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNl0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNl0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIDIqajcKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajcgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKKyAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgorICAgICAgICAKKyAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQorICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCisgICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCisgICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgorICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80CisgICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKKyAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMyKjE2XSAgICAgIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM2KjE2XSAgICAgIDsvLyAyKmo2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1CisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNgorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzQqMTZdICAgICAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyY10sICM0ICAgICAgICAgOy8vIGowCisKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBBREQgICAgIHhpMCwgeGkwLCB4aXQsIExTTCAjMiAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0hBREQxNiB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNIU1VCMTYgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTSEFERDE2IHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU0hTVUIxNiB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNIQUREMTYgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTSFNVQjE2IHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0hBREQxNiB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNIU1VCMTYgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFNhdHVyYXRlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBVU0FUMTYgIHhmMCwgIzgsIHhmMAorICAgICAgICAgICAgVVNBVDE2ICB4ZjEsICM4LCB4ZjEKKyAgICAgICAgICAgIFVTQVQxNiAgeGYyLCAjOCwgeGYyCisgICAgICAgICAgICBVU0FUMTYgIHhmMywgIzgsIHhmMworICAgICAgICAgICAgVVNBVDE2ICB4ZjQsICM4LCB4ZjQKKyAgICAgICAgICAgIFVTQVQxNiAgeGY1LCAjOCwgeGY1CisgICAgICAgICAgICBVU0FUMTYgIHhmNiwgIzgsIHhmNgorICAgICAgICAgICAgVVNBVDE2ICB4ZjcsICM4LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgU1NBVDE2ICB4ZjAsICM5LCB4ZjAKKyAgICAgICAgICAgIFNTQVQxNiAgeGYxLCAjOSwgeGYxCisgICAgICAgICAgICBTU0FUMTYgIHhmMiwgIzksIHhmMgorICAgICAgICAgICAgU1NBVDE2ICB4ZjMsICM5LCB4ZjMKKyAgICAgICAgICAgIFNTQVQxNiAgeGY0LCAjOSwgeGY0CisgICAgICAgICAgICBTU0FUMTYgIHhmNSwgIzksIHhmNQorICAgICAgICAgICAgU1NBVDE2ICB4ZjYsICM5LCB4ZjYKKyAgICAgICAgICAgIFNTQVQxNiAgeGY3LCAjOSwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdG8gUm93LCBQYWNrIGFuZCBzdG9yZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgT1JSICAgICB4ZjAsIHhmMCwgeGYxLCBMU0wgIzggOy8vIFsgYjEgYjAgYTEgYTAgXQorICAgICAgICAgICAgT1JSICAgICB4ZjIsIHhmMiwgeGYzLCBMU0wgIzggOy8vIFsgYjMgYjIgYTMgYTIgXQorICAgICAgICAgICAgT1JSICAgICB4ZjQsIHhmNCwgeGY1LCBMU0wgIzggOy8vIFsgYjUgYjQgYTUgYTQgXQorICAgICAgICAgICAgT1JSICAgICB4ZjYsIHhmNiwgeGY3LCBMU0wgIzggOy8vIFsgYjcgYjYgYTcgYTYgXQorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjIsIHhmMCwgQVNSICMxNgorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjQsIHhmNiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjYsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjN9CisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5Iik6TE9SOigiJG91dHNpemUiPSJzMTYiKSAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCitTcmMwICAgICAgICAgICAgRVFVICA3ICAgICAgICAgICAgICAKK1NyYzEgICAgICAgICAgICBFUVUgIDggICAgICAgICAgICAgIAorU3JjMiAgICAgICAgICAgIEVRVSAgOSAgICAgICAgICAgICAgCitTcmMzICAgICAgICAgICAgRVFVICAxMCAgICAgICAgICAgICAgCitTcmM0ICAgICAgICAgICAgRVFVICAxMSAgICAgICAgICAgICAgCitTcmM1ICAgICAgICAgICAgRVFVICAxMiAgICAgICAgICAgICAgCitTcmM2ICAgICAgICAgICAgRVFVICAxMworU3JjNyAgICAgICAgICAgIEVRVSAgMTQKK1RtcCAgICAgICAgICAgICBFUVUgIDE1CisKK3FYajAgICAgICAgICAgICBRTiBTcmMwLlMxNiAKK3FYajEgICAgICAgICAgICBRTiBTcmMxLlMxNgorcVhqMiAgICAgICAgICAgIFFOIFNyYzIuUzE2CitxWGozICAgICAgICAgICAgUU4gU3JjMy5TMTYKK3FYajQgICAgICAgICAgICBRTiBTcmM0LlMxNgorcVhqNSAgICAgICAgICAgIFFOIFNyYzUuUzE2CitxWGo2ICAgICAgICAgICAgUU4gU3JjNi5TMTYKK3FYajcgICAgICAgICAgICBRTiBTcmM3LlMxNgorcVhqdCAgICAgICAgICAgIFFOIFRtcC5TMTYKKworZFhqMGxvICAgICAgICAgIEROIChTcmMwKjIpLlMxNgorZFhqMGhpICAgICAgICAgIEROIChTcmMwKjIrMSkuUzE2CitkWGoxbG8gICAgICAgICAgRE4gKFNyYzEqMikuUzE2CitkWGoxaGkgICAgICAgICAgRE4gKFNyYzEqMisxKS5TMTYKK2RYajJsbyAgICAgICAgICBETiAoU3JjMioyKS5TMTYKK2RYajJoaSAgICAgICAgICBETiAoU3JjMioyKzEpLlMxNgorZFhqM2xvICAgICAgICAgIEROIChTcmMzKjIpLlMxNgorZFhqM2hpICAgICAgICAgIEROIChTcmMzKjIrMSkuUzE2CitkWGo0bG8gICAgICAgICAgRE4gKFNyYzQqMikuUzE2CitkWGo0aGkgICAgICAgICAgRE4gKFNyYzQqMisxKS5TMTYKK2RYajVsbyAgICAgICAgICBETiAoU3JjNSoyKS5TMTYKK2RYajVoaSAgICAgICAgICBETiAoU3JjNSoyKzEpLlMxNgorZFhqNmxvICAgICAgICAgIEROIChTcmM2KjIpLlMxNgorZFhqNmhpICAgICAgICAgIEROIChTcmM2KjIrMSkuUzE2CitkWGo3bG8gICAgICAgICAgRE4gKFNyYzcqMikuUzE2CitkWGo3aGkgICAgICAgICAgRE4gKFNyYzcqMisxKS5TMTYKK2RYanRsbyAgICAgICAgICBETiAoVG1wKjIpLlMxNgorZFhqdGhpICAgICAgICAgIEROIChUbXAqMisxKS5TMTYKKworcVhpMCAgICAgICAgICAgIFFOIHFYajAKK3FYaTEgICAgICAgICAgICBRTiBxWGo0CitxWGkyICAgICAgICAgICAgUU4gcVhqMgorcVhpMyAgICAgICAgICAgIFFOIHFYajcKK3FYaTQgICAgICAgICAgICBRTiBxWGo1CitxWGk1ICAgICAgICAgICAgUU4gcVhqdAorcVhpNiAgICAgICAgICAgIFFOIHFYajEKK3FYaTcgICAgICAgICAgICBRTiBxWGo2CitxWGl0ICAgICAgICAgICAgUU4gcVhqMworCitkWGkwbG8gICAgICAgICAgRE4gZFhqMGxvCitkWGkwaGkgICAgICAgICAgRE4gZFhqMGhpCitkWGkxbG8gICAgICAgICAgRE4gZFhqNGxvCitkWGkxaGkgICAgICAgICAgRE4gZFhqNGhpCitkWGkybG8gICAgICAgICAgRE4gZFhqMmxvCitkWGkyaGkgICAgICAgICAgRE4gZFhqMmhpCitkWGkzbG8gICAgICAgICAgRE4gZFhqN2xvCitkWGkzaGkgICAgICAgICAgRE4gZFhqN2hpCitkWGk0bG8gICAgICAgICAgRE4gZFhqNWxvCitkWGk0aGkgICAgICAgICAgRE4gZFhqNWhpCitkWGk1bG8gICAgICAgICAgRE4gZFhqdGxvCitkWGk1aGkgICAgICAgICAgRE4gZFhqdGhpCitkWGk2bG8gICAgICAgICAgRE4gZFhqMWxvCitkWGk2aGkgICAgICAgICAgRE4gZFhqMWhpCitkWGk3bG8gICAgICAgICAgRE4gZFhqNmxvCitkWGk3aGkgICAgICAgICAgRE4gZFhqNmhpCitkWGl0bG8gICAgICAgICAgRE4gZFhqM2xvCitkWGl0aGkgICAgICAgICAgRE4gZFhqM2hpCisKK3FYaDAgICAgICAgICAgICBRTiBxWGl0CitxWGgxICAgICAgICAgICAgUU4gcVhpMAorcVhoMiAgICAgICAgICAgIFFOIHFYaTIKK3FYaDMgICAgICAgICAgICBRTiBxWGkzCitxWGg0ICAgICAgICAgICAgUU4gcVhpNworcVhoNSAgICAgICAgICAgIFFOIHFYaTUKK3FYaDYgICAgICAgICAgICBRTiBxWGk0CitxWGg3ICAgICAgICAgICAgUU4gcVhpMQorcVhodCAgICAgICAgICAgIFFOIHFYaTYKKworZFhoMGxvICAgICAgICAgIEROIGRYaXRsbworZFhoMGhpICAgICAgICAgIEROIGRYaXRoaQorZFhoMWxvICAgICAgICAgIEROIGRYaTBsbworZFhoMWhpICAgICAgICAgIEROIGRYaTBoaQorZFhoMmxvICAgICAgICAgIEROIGRYaTJsbworZFhoMmhpICAgICAgICAgIEROIGRYaTJoaQorZFhoM2xvICAgICAgICAgIEROIGRYaTNsbworZFhoM2hpICAgICAgICAgIEROIGRYaTNoaQorZFhoNGxvICAgICAgICAgIEROIGRYaTdsbworZFhoNGhpICAgICAgICAgIEROIGRYaTdoaQorZFhoNWxvICAgICAgICAgIEROIGRYaTVsbworZFhoNWhpICAgICAgICAgIEROIGRYaTVoaQorZFhoNmxvICAgICAgICAgIEROIGRYaTRsbworZFhoNmhpICAgICAgICAgIEROIGRYaTRoaQorZFhoN2xvICAgICAgICAgIEROIGRYaTFsbworZFhoN2hpICAgICAgICAgIEROIGRYaTFoaQorZFhodGxvICAgICAgICAgIEROIGRYaTZsbworZFhodGhpICAgICAgICAgIEROIGRYaTZoaQorCitxWGcwICAgICAgICAgICAgUU4gcVhoMgorcVhnMSAgICAgICAgICAgIFFOIHFYaHQKK3FYZzIgICAgICAgICAgICBRTiBxWGgxCitxWGczICAgICAgICAgICAgUU4gcVhoMAorcVhnNCAgICAgICAgICAgIFFOIHFYaDQKK3FYZzUgICAgICAgICAgICBRTiBxWGg1CitxWGc2ICAgICAgICAgICAgUU4gcVhoNgorcVhnNyAgICAgICAgICAgIFFOIHFYaDcKK3FYZ3QgICAgICAgICAgICBRTiBxWGgzCisKK3FYZjAgICAgICAgICAgICBRTiBxWGc2CitxWGYxICAgICAgICAgICAgUU4gcVhnNQorcVhmMiAgICAgICAgICAgIFFOIHFYZzQKK3FYZjMgICAgICAgICAgICBRTiBxWGd0CitxWGY0ICAgICAgICAgICAgUU4gcVhnMworcVhmNSAgICAgICAgICAgIFFOIHFYZzIKK3FYZjYgICAgICAgICAgICBRTiBxWGcxCitxWGY3ICAgICAgICAgICAgUU4gcVhnMAorcVhmdCAgICAgICAgICAgIFFOIHFYZzcKKworCitxWHQwICAgICAgICAgICAgUU4gMS5TMzIKK3FYdDEgICAgICAgICAgICBRTiAyLlMzMgorcVQwbG8gICAgICAgICAgIFFOIDEuUzMyICAgICAgICAgCitxVDBoaSAgICAgICAgICAgUU4gMi5TMzIgICAgICAgICAKK3FUMWxvICAgICAgICAgICBRTiAzLlMzMiAgICAgICAgIAorcVQxaGkgICAgICAgICAgIFFOIDQuUzMyICAgICAgICAgCitxU2NhbGVsbyAgICAgICAgUU4gNS5TMzIgICAgICAgIDsvLyB1c2VkIHRvIHJlYWQgcG9zdCBzY2FsZSB2YWx1ZXMKK3FTY2FsZWhpICAgICAgICBRTiA2LlMzMgorcVRlbXAwICAgICAgICAgIFFOIDUuUzMyICAgICAgICAgCitxVGVtcDEgICAgICAgICAgUU4gNi5TMzIgICAgCisKKworU2NhbGUxICAgICAgICAgIEVRVSA2CitTY2FsZTIgICAgICAgICAgRVFVIDE1CitxU2NhbGUxICAgICAgICAgUU4gU2NhbGUxLlMxNiAgICAgCitxU2NhbGUyICAgICAgICAgUU4gU2NhbGUyLlMxNiAgICAgCitkU2NhbGUxbG8gICAgICAgRE4gKFNjYWxlMSoyKS5TMTYgICAgIAorZFNjYWxlMWhpICAgICAgIEROIChTY2FsZTEqMisxKS5TMTYKK2RTY2FsZTJsbyAgICAgICBETiAoU2NhbGUyKjIpLlMxNiAgICAgCitkU2NhbGUyaGkgICAgICAgRE4gKFNjYWxlMioyKzEpLlMxNgorCitkQ29lZnMgICAgICAgICAgRE4gMC5TMTYgICAgICAgIDsvLyBTY2FsZSBjb2VmZmljaWVudHMgaW4gZm9ybWF0IHtbMF0gW0NdIFtTXSBbSW52U3FydDJdfQorSW52U3FydDIgICAgICAgIEROIGRDb2Vmc1swXSAgICA7Ly8gMS9zcXJ0KDIpIGluIFExNQorUyAgICAgICAgICAgICAgIEROIGRDb2Vmc1sxXSAgICA7Ly8gU2luKFBJLzgpIGluIFExNQorQyAgICAgICAgICAgICAgIEROIGRDb2Vmc1syXSAgICA7Ly8gQ29zKFBJLzgpIGluIFExNQorCitwVGVtcCAgICAgICAgICAgUk4gMTIKKworICAgICAgICAgICAgICAgIAorICAgICAgICBJTVBPUlQgIGFybUNPTU1fSURDVENvZWYKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtxWGowLHFYajF9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqMixxWGozfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajQscVhqNX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo2LHFYajd9LCBbcFNyYyBANjRdIQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgUHJlU2NhbGUgYW5kIG11bHRpcGx5IHdpdGggU3JjCisgICAgICAgIDsvLyBJU3RhZ2UgNAorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTZYMTYgTXVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzJYMzIgLHVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorICAgICAgICBFTkRJRgorCisgICAgICAgIDsvLyBJU3RhZ2UgMworICAgICAgICBWUURNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWUURNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCisgICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMworCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMgorICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3CisgICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQorICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3CisgICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKKworICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorWFRSMCAgICAgICAgICAgIEVRVSBTcmM1CitYVFIxICAgICAgICAgICAgRVFVIFRtcAorWFRSMiAgICAgICAgICAgIEVRVSBTcmM2CitYVFIzICAgICAgICAgICAgRVFVIFNyYzcKK1hUUjQgICAgICAgICAgICBFUVUgU3JjMworWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCitYVFI2ICAgICAgICAgICAgRVFVIFNyYzEKK1hUUjcgICAgICAgICAgICBFUVUgU3JjMgorWFRSdCAgICAgICAgICAgIEVRVSBTcmM0CisgICAgICAgICAgICAgICAgCitxQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKK3FBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKK3FBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKK3FBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKK3FBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKK3FBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKK3FBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKK3FBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKKworZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQorZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQorZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQorZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKK2RCNSAgICAgICAgICAgICBETiAgWFRSNSoyCitkQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgorZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKKworICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCisgICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQorICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3CisgICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCisgICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCisgICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2CisgICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKKyAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKKyAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKKyAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKKyAgICAgICAgCisKK3FZajAgICAgICAgICAgICBRTiBxWGYwCitxWWoxICAgICAgICAgICAgUU4gcVhmMQorcVlqMiAgICAgICAgICAgIFFOIHFYZjIKK3FZajMgICAgICAgICAgICBRTiBxWGYzCitxWWo0ICAgICAgICAgICAgUU4gcVhmNAorcVlqNSAgICAgICAgICAgIFFOIHFYZjUKK3FZajYgICAgICAgICAgICBRTiBxWGY2CitxWWo3ICAgICAgICAgICAgUU4gcVhmNworcVlqdCAgICAgICAgICAgIFFOIHFYZnQKKworZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgorZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2CitkWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2CitkWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKK2RZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKK2RZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgorZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgorZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2CitkWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2CitkWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKK2RZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKK2RZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgorZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgorZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2CitkWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2CitkWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKK2RZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKK2RZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgorCitxWWkwICAgICAgICAgICAgUU4gcVlqMAorcVlpMSAgICAgICAgICAgIFFOIHFZajQKK3FZaTIgICAgICAgICAgICBRTiBxWWoyCitxWWkzICAgICAgICAgICAgUU4gcVlqNworcVlpNCAgICAgICAgICAgIFFOIHFZajUKK3FZaTUgICAgICAgICAgICBRTiBxWWp0CitxWWk2ICAgICAgICAgICAgUU4gcVlqMQorcVlpNyAgICAgICAgICAgIFFOIHFZajYKK3FZaXQgICAgICAgICAgICBRTiBxWWozCisKK2RZaTBsbyAgICAgICAgICBETiBkWWowbG8KK2RZaTBoaSAgICAgICAgICBETiBkWWowaGkKK2RZaTFsbyAgICAgICAgICBETiBkWWo0bG8KK2RZaTFoaSAgICAgICAgICBETiBkWWo0aGkKK2RZaTJsbyAgICAgICAgICBETiBkWWoybG8KK2RZaTJoaSAgICAgICAgICBETiBkWWoyaGkKK2RZaTNsbyAgICAgICAgICBETiBkWWo3bG8KK2RZaTNoaSAgICAgICAgICBETiBkWWo3aGkKK2RZaTRsbyAgICAgICAgICBETiBkWWo1bG8KK2RZaTRoaSAgICAgICAgICBETiBkWWo1aGkKK2RZaTVsbyAgICAgICAgICBETiBkWWp0bG8KK2RZaTVoaSAgICAgICAgICBETiBkWWp0aGkKK2RZaTZsbyAgICAgICAgICBETiBkWWoxbG8KK2RZaTZoaSAgICAgICAgICBETiBkWWoxaGkKK2RZaTdsbyAgICAgICAgICBETiBkWWo2bG8KK2RZaTdoaSAgICAgICAgICBETiBkWWo2aGkKK2RZaXRsbyAgICAgICAgICBETiBkWWozbG8KK2RZaXRoaSAgICAgICAgICBETiBkWWozaGkKKworcVloMCAgICAgICAgICAgIFFOIHFZaXQKK3FZaDEgICAgICAgICAgICBRTiBxWWkwCitxWWgyICAgICAgICAgICAgUU4gcVlpMgorcVloMyAgICAgICAgICAgIFFOIHFZaTMKK3FZaDQgICAgICAgICAgICBRTiBxWWk3CitxWWg1ICAgICAgICAgICAgUU4gcVlpNQorcVloNiAgICAgICAgICAgIFFOIHFZaTQKK3FZaDcgICAgICAgICAgICBRTiBxWWkxCitxWWh0ICAgICAgICAgICAgUU4gcVlpNgorCitkWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCitkWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCitkWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCitkWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCitkWWgybG8gICAgICAgICAgRE4gZFlpMmxvCitkWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCitkWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCitkWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCitkWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCitkWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCitkWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCitkWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCitkWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCitkWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCitkWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCitkWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCitkWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCitkWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCisKK3FZZzAgICAgICAgICAgICBRTiBxWWgyCitxWWcxICAgICAgICAgICAgUU4gcVlodAorcVlnMiAgICAgICAgICAgIFFOIHFZaDEKK3FZZzMgICAgICAgICAgICBRTiBxWWgwCitxWWc0ICAgICAgICAgICAgUU4gcVloNAorcVlnNSAgICAgICAgICAgIFFOIHFZaDUKK3FZZzYgICAgICAgICAgICBRTiBxWWg2CitxWWc3ICAgICAgICAgICAgUU4gcVloNworcVlndCAgICAgICAgICAgIFFOIHFZaDMKKworcVlmMCAgICAgICAgICAgIFFOIHFZZzYKK3FZZjEgICAgICAgICAgICBRTiBxWWc1CitxWWYyICAgICAgICAgICAgUU4gcVlnNAorcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKK3FZZjQgICAgICAgICAgICBRTiBxWWczCitxWWY1ICAgICAgICAgICAgUU4gcVlnMgorcVlmNiAgICAgICAgICAgIFFOIHFZZzEKK3FZZjcgICAgICAgICAgICBRTiBxWWcwCitxWWZ0ICAgICAgICAgICAgUU4gcVlnNworCisgICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCisgICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKKyAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2CisgICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMworCisgICAgICAgIFZRRE1VTEggICAgIHFZaTIsIHFZaTIsIEludlNxcnQyICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFRlbXAsICMweDQgICAgICAgICAgICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFZEVVAgICAgICAgIHFTY2FsZTEsIHBUZW1wICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFZBREQgICAgICAgIHFZaTAsIHFZaTAsIHFTY2FsZTEKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFZaDAsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAraTEpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVloMSwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMC1pMSkvMgorCisgICAgICAgIFZIQUREICAgICAgIHFZaDcsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVloNSwgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWU1VCICAgICAgICBxWWgyLCBxWWkyLCBxWWkzICAgICAgICA7Ly8gaDIsIGgzCisgICAgICAgIFZRRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNworICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2CisgICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgorICAgICAgICAKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgorICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3CisgICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCisKK1lUUjAgICAgICAgICAgICBFUVUgU3JjMAorWVRSMSAgICAgICAgICAgIEVRVSBTcmM0CitZVFIyICAgICAgICAgICAgRVFVIFNyYzEKK1lUUjMgICAgICAgICAgICBFUVUgU3JjMgorWVRSNCAgICAgICAgICAgIEVRVSBTcmM3CitZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKK1lUUjYgICAgICAgICAgICBFUVUgVG1wCitZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKK1lUUnQgICAgICAgICAgICBFUVUgU3JjMworCitxQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQorcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgorcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgorcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgorcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgorcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgorcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgorcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgorCitkRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQorZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQorZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQorZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKK2RENSAgICAgICAgICAgICBETiAgWVRSNSoyCitkRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgorZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQorICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCisgICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNworICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgorICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMworICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgorICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0CisgICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1CisgICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2CisgICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3CisKKyAgICAgICAgCitkWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4CitkWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4CitkWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4CitkWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4CitkWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4CitkWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4CitkWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4CitkWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4CisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgorICAgICAgICA7Ly8KKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMworICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorCisKKworICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93CisgICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAorICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IEZsYWcKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdworICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93CisgICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCisgICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCisgICAgICAgIElGICIkTGFzdFJvdyI9IjAiCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgorICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKK3FTY2FsZTBsbyAgICAgICBRTiAwLlMzMgorcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCitxU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKK3FTY2FsZTFoaSAgICAgICBRTiAzLlMzMgorcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQorCitxU3JjMGxvICAgICAgICAgUU4gNC5TMzIKK3FTcmMwaGkgICAgICAgICBRTiA1LlMzMgorcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCitxU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKK3FTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKKworcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQorCisgICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAwCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAxICYgNworICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAyICYgNgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCisgICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIDsvLyBSb3cgNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMTE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKKyAqLworIAorCisKKyNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCisjZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXworCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKyAgCisvKiBNYXNrIHRhYmxlICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYjNlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCisjaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KKyNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLworI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKKyNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQorCisvKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLworI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQorCisKKy8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCisjZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KKy8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCisKKy8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCisjZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMXAwLTAwYmV0MCIKKworLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY3IHdpdGggTkVPTiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk1NmJkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCis7Ly8KKworOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KKyBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICisgR0JMTCBBUk1DT01NX1NfSAorCisgICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgCisgICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKK0FSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KKworOy8vIEdsb2JhbHMKKworICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKKyAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50CisgICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCisgICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCisgICAgICAgIAorICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZworICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCisgICAgICAgIAorICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKKyAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCisgICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50CisgICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQorICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKKyAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAorICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCisgICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAorICAgICAgICAKK19JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KK19TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKK19GICAgICAgICAgICAgICBTRVRBICAgIDAKK19Td051bSAgICAgICAgICBTRVRBICAgIDAKK18zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgorXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQorOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQorOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCitfQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCisgICAgICAgRUxTRQorX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAorICAgICAgIEVORElGCisKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCisgICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cworICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQorICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAorICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCisgICAgICAgIEdCTEwgJHZhcgorICAgICAgICBHQkxMIF9vayR2YXIKKyR2YXIgICAgU0VUTCB7RkFMU0V9CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKworICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0CisgICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAgICAgICAgOy8vIGNvcmUuCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX1ZBUklBTlQgJHYwCisgICAgICAgIF9NX1ZBUklBTlQgJHYxCisgICAgICAgIF9NX1ZBUklBTlQgJHYyCisgICAgICAgIF9NX1ZBUklBTlQgJHYzCisgICAgICAgIF9NX1ZBUklBTlQgJHY0CisgICAgICAgIF9NX1ZBUklBTlQgJHY1CisgICAgICAgIF9NX1ZBUklBTlQgJHY2CisgICAgICAgIF9NX1ZBUklBTlQgJHY3CisgICAgICAgIAorICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKKyAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKK19WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCisgICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUworICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIGZhbGNvbi12ZnAsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgZmFsY29uLWZ1bGwtbmVvbiwgQ29ydGV4QTgKKyAgICAgICAgX01fVFJZIENvcnRleC1BOE5vTmVvbiwgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhNjhkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgorICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAorICoKKyAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQorICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKKyAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldworICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAorICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKKyAqICAgYXQgcnVudGltZS4KKyAqCisgKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAorICogCisgKi8KKworICAKKyNpZm5kZWYgX2FybU9NWF9IXworI2RlZmluZSBfYXJtT01YX0hfCisKKworLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLworI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKKyNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKKworLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KKyNkZWZpbmUgQkFSRV9TVUZGSVggCisKKworCisvKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLworI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKKyNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKKworCisKKworLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLworI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisKKworI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCisKKyNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCisKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisKKworI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjI5NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIEZpbGU6IG9teHR5cGVzLmgKKyAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworICAKKyNpZm5kZWYgX09NWFRZUEVTX0hfCisjZGVmaW5lIF9PTVhUWVBFU19IXworCisjaW5jbHVkZSA8bGltaXRzLmg+IAorCisjZGVmaW5lIE9NWF9JTgorI2RlZmluZSBPTVhfT1VUCisjZGVmaW5lIE9NWF9JTk9VVAorCisKK3R5cGVkZWYgZW51bSB7CisgICAgCisgICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KKyAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAorICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAorICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KKyAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCisgICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCisgICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCisJT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLworCisgICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCisgICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLworCisgICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCisKKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLworCisgICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCisKKyAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCisgICAgCisgfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLworCisgCisvKiBPTVhfVTggKi8KKyNpZiBVQ0hBUl9NQVggPT0gMHhmZgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKyNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKKyNlbHNlCisjZXJyb3IgT01YX1U4IHVuZGVmaW5lZAorI2VuZGlmIAorCisgCisvKiBPTVhfUzggKi8KKyNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzggdW5kZWZpbmVkCisjZW5kaWYKKyAKKyAKKy8qIE9NWF9VMTYgKi8KKyNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OworI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMTYgKi8KKyNpZiBTSFJUX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKKyNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1UzMiAqLworI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7CisjZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MzMiAqLworI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7CisjZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCisjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCisgICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCisjZWxzZQorICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQorI2VuZGlmCisKKworLyogT01YX1NDOCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMTYgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MzMiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzY0ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX0YzMiAqLwordHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9GNjQgKi8KK3R5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0lOVCAqLwordHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLworCisKKyNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKKyNkZWZpbmUgT01YX01JTl9VOCAgCQkwCisjZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCisjZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAorI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKKworI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKKyNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCisjZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQorI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCisjZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCisjZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCisKK3R5cGVkZWYgdm9pZCBPTVhWb2lkOworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCisgICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKKyAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAorICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KKwlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCit9T01YUmVjdDsKKworCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KKyBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KKwkKK30gT01YUG9pbnQ7CisKKworLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KKyBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KKwkKK30gT01YU2l6ZTsKKworI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODcwM2QxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKQEAgLTAsMCArMSw3NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCitPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAorT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKK09NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAorT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCitPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCitPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCitPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAorT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAorCis7Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgorT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAorCitPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAorT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAorT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAorT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCisKK09NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAorT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAorCitPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKKworT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKKworCisKK09NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKK09NWF9NSU5fVTggIAlFUVUgICAgIAkwCitPTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCitPTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAorCisKK09NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCitPTVhfTUlOX1UzMgkJRVFVCTAKKworT01YX01BWF9TOAkJRVFVCSgxMjcpCitPTVhfTUFYX1U4CQlFUVUJKDI1NSkKK09NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQorT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQorT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKK09NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCisKK09NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAorT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAorT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCisKK05VTEwgICAgRVFVIDAKKworOy8vIFN0cnVjdHVyZXMKKworICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCisKKyAgICBNX1NUUlVDVCAgICBPTVhQb2ludAorICAgIE1fRklFTEQgICAgIHgsIDQKKyAgICBNX0ZJRUxEICAgICB5LCA0CisgICAgTV9FTkRTVFJVQ1QKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDllNzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCkBAIC0wLDAgKzEsMTEzIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgCisjIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCisjIE9wZW5NQVggREw6IHYxLjAuMgorIyBSZXZpc2lvbjogICAxMjI5MAorIyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTggLWMnOworJEFTICAgICAgID0gJ2FybWFzbSc7CiskQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCc7CisjICRMSUIgICAgICA9ICdhcm1saW5rJzsKKyMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7CisjICRMSUJfVFlQRSA9ICcubyc7CiskTElCICAgICAgPSAnYXJtYXInOworJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKKyRMSUJfVFlQRSA9ICcuYSc7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KK0BoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KK29wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOworQGZpbGVsaXN0ID0gPEZJTEVTPjsKK2Nsb3NlKEZJTEVTKTsKKworIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCitmb3JlYWNoICRoIChAaGVhZGVybGlzdCkKK3sKKyAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOworfQorCisjIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7CisKKyMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKK21rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKK21rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKKworJG9iamxpc3QgPSAnJzsKKworIyBDb21waWxlIGVhY2ggZmlsZQorZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQoreworCW15ICRmOworCW15ICRiYXNlOworCW15ICRleHQ7CisJbXkgJG9iamZpbGU7CisKKwljaG9tcCgkZmlsZSk7CisJJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOworCisJKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKKyAgICAkZj1+cy9bXG5cZlxyXS8vZzsgIyBSZW1vdmUgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKKworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkYjhlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzUgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKy4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU3MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCkBAIC0wLDAgKzEsOTM2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKKyAqCisgKi8KKworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorCitPTVhfSU5UIGFybVNpZ25DaGVjayAoCisgICAgT01YX1MxNiB2YXIKKykKKworeworICAgIE9NWF9JTlQgU2lnbjsKKyAgICAKKyAgICBpZiAodmFyIDwgMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHZhciA+IDApCisgICAgeworICAgICAgICBTaWduID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU2lnbiA9IDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBTaWduOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICBPTVhfSU5UIG1pbiwKKyAgICBPTVhfSU5UIG1heCwgCisgICAgT01YX1MzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgIE9NWF9GMzIgbWluLAorICAgIE9NWF9GMzIgbWF4LCAKKyAgICBPTVhfRjMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCit7CisgICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKKyAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKKyAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7CisgICAgT01YX1UzMiB2SW50OworICAgIE9NWF9VMzIgdkludFNhdDsKKyAgICAKKyAgICBpZih2IDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OworICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKKyAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7CisgICAgdkludFNhdCA9IHZJbnQ7CisgICAgaWYodkludFNhdCA+IG1heFYpIAorICAgICAgICB2SW50U2F0ID0gbWF4VjsKKyAgICByZXR1cm4gdkludFNhdDsKK30KKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKAorICAgICAgICBPTVhfVTggKnBCdWYxLAorICAgICAgICBPTVhfVTggKnBCdWYyLAorICAgICAgICBPTVhfSU5UIGVsZW1TaXplCisgICAgICAgKQoreworICAgIE9NWF9JTlQgaTsKKyAgICBPTVhfVTggdGVtcDsKKyAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7CisgICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKKyAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorKQoreworICAgIE9NWF9TMzIgYSwgYiwgYzsKKyAgICAKKyAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7CisgICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOworICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7CisgICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCisgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorKQoreworICAgIE9NWF9VOCBpOyAgICAKKyAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAorICAgIHsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCit7CisgICAgT01YX1M2NCBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKKyAgICB7CisgICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKKyAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKKworICAgIHJldHVybiBSZXN1bHQ7ICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCit7CisgICAgCisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKKworICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7CisgICAgfQorICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7CisgICAgfQorCisgICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKKyAgICAKKyAgICByZXR1cm4gbWFjOworfQorCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQoreworICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7CisKKyAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKKyAgICB9CisKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqICAgICAKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkyLGxvMTsKKyAgICBPTVhfVTE2IGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOworICAgIE9NWF9TMzIgcmVzdWx0OworICAgIAorICAgIGxvMSAgPSBpbnB1dDE7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gaGkyICogbG8xOworICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTEsaGkyOworICAgIE9NWF9VMTYgbG8xLGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOworICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOworICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKKyAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKKyAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKK3sKKyAgICBPTVhfRjY0IHJlc3VsdDsKKyAgICAKKyAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7CisgICAgCisgICAgaWYgKHJlc3VsdCA+PSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IDAuNTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0IC09IDAuNTsKKyAgICB9CisKKyAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Cit9CisKKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWY5MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgCisgICAgaWYoTiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCit7CisgICAgaWYoKnBPZmZzZXQgPiAwKQorICAgIHsKKyAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7CisgICAgICAgICpwT2Zmc2V0ID0gMDsKKyAgICB9ICAgIAorfQorCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCit7CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKnBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgorICoqLworI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispCit7ICAgIAorICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgT01YX0lOVCBJbmRleDsKKyAgICAgICAgCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKKyAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47CisgICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7CisgICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSW5kZXg7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwQ29kZUJvb2srKzsKKyAgICB9CisKKyAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCisgICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispCit7CisgICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgICAgIAorICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLworICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKKyAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKKworICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLworICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7CisgICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKKyAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOworICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OworICAgIH0KKworICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KKyAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOworICAgIAorICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispCit7CisgICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmNWUyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDlmODhjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKworY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCit9OworCitjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzViNTEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApAQCAtMCwwICsxLDExNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybVZpZGVvLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgorICoKKyAqLworCisKKyNpZm5kZWYgX2FybVZpZGVvX0hfCisjZGVmaW5lIF9hcm1WaWRlb19IXworCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RydWN0IG00cDJfTUVTcGVjCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOworfTsKKworc3RydWN0IG00cDEwX01FU3BlYworeworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Cit0eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECisgKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0CisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECisgKi8KKworT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKKyAgICBPTVhfUzE2IG12WCwKKyAgICBPTVhfUzE2IG12WSwKKyAgICBPTVhfSU5UIGNhbmRTQUQsCisgICAgT01YX1MxNiBiZXN0TVZYLAorICAgIE9NWF9TMTYgYmVzdE1WWSwKKyAgICBPTVhfSU5UIGJlc3RTQUQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KKyAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKyAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KKyAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCisgKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKKyAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaworICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKKyAgICAgT01YX0lOVCBjdXJRUCwKKyAgICAgT01YX0lOVCBwcmVkUVAsCisgICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAorICAgICBPTVhfVTggIHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIGluZGV4LAorICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispOworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKKyAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAorICAgICBPTVhfVTggKiBwVHJhbnNwCispOworCisvKiAKKyAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKKyAqLworLyogRGVmaW5lcyAqLworI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKKworCisvKiBEZXF1YW50IHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKK2V4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCisgKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgorICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCisgKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYworICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAorICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQorICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAorICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCisgKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKKyAqIAorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCisgICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCisgICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCisgICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCisgICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KKyAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLworICAgIGludCBDaHJvbWFGbGFnCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAorCQlPTVhfVTMyIAlpU3JjU3RlcCwgCisJCU9NWF9VOCogCXBEc3QsIAorCQlPTVhfVTMyIAlpRHN0U3RlcCwgCisJCU9NWF9VMzIgCWlXaWR0aCwgCisJCU9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQorCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKKwkgT01YX1UzMiAJaVNyY1N0ZXAsIAorIAkgT01YX1U4KiAJcERzdCwKKyAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKKyAJIE9NWF9VMzIgCWlXaWR0aCwgCisgCSBPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKKyAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCisgKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgorICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKKyAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCisgKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKKyAgICAgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYgKnBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9TMTYqIHBEQywKKyAgICAgaW50IEFDCispOworCisjZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMmEwMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCkBAIC0wLDAgKzEsNzIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDQ09NTV9zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODlmMzA0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgYSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIGIgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSBjICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgZCAqLworO30KKworO2VudW0geworT01YX1VQUEVSICAJCQkJRVFVIDE7CQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX0xFRlQgICAJCQkJRVFVIDI7CQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJLyoqIEFscGhhIGNvbXBvbmVudCAqLworO30KKworO2VudW0geworT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCitPTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCitPTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KKzt9CisKKztlbnVtIHsKK09NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7dHlwZWRlZglzdHJ1Y3QgewkKK3gJRVFVCTA7Cit5CUVRVQk0OworO31PTVhDb29yZGluYXRlOworCis7dHlwZWRlZiBzdHJ1Y3QgeworZHgJRVFVCTA7CitkeQlFUVUJMjsKKzt9T01YTW90aW9uVmVjdG9yOworCis7dHlwZWRlZiBzdHJ1Y3QgeworeHgJCUVRVQkwOworeXkJCUVRVQk0Oword2lkdGgJRVFVCTg7CitoZWlnaHQJRVFVCTEyOworO31PTVhpUmVjdDsKKworO3R5cGVkZWYgZW51bSB7CitPTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKztlbnVtIHsKK09NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCitPTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQorT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCis7fTsKKworCisJRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTZkNTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCkBAIC0wLDAgKzEsOTUgQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKyA7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmMgICAgUk4gMCAgICAgICAgCitwRHN0ICAgIFJOIDEgICAgICAgIAorc3RlcCAgICBSTiAyCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzggCitYMiAgICAgIEROIEQyLlM4CitYMyAgICAgIEROIEQzLlM4CitYNCAgICAgIEROIEQ0LlM4CitYNSAgICAgIEROIEQ1LlM4CitYNiAgICAgIEROIEQ2LlM4CitYNyAgICAgIEROIEQ3LlM4IAorIAorICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYKKyAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAgICAgICAgOy8vIExvYWQgMTYgYnl0ZXMgZnJvbSAxNiBieXRlIGFsaWduZWQgcFNyYyBhbmQgcFNyYz1wU3JjICsgc3RlcCBhZnRlciBsb2FkaW5nCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICA7Ly8gU3RvcmUgMzIgYnl0ZXMgdG8gMTYgYnl0ZSBhbGlnbmVkIHBEc3QgICAKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCisgICAgICAgICAKKyAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgICAgICAgICAgCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKKworICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisKKyAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI5ZTVlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MCBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCisgOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzgKK1gyICAgICAgRE4gRDIuUzgKK1gzICAgICAgRE4gRDMuUzgKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcCAgICAgICAgICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSA4IGJ5dGUgYWxpZ25lZCBwU3JjLCBwU3JjPXBTcmMrc3RlcCBhZnRlciBsb2FkCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICA7Ly8gU3RvcmUgMTYgYnl0ZXMgdG8gOCBieXRlIGFsaWduZWQgcERzdCAgCisgICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICAgIAorICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjNWI3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMjM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKworICAgIAorICAgIElGIENvcnRleEE4CisgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCisKKzsvL0lucHV0IHJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCitpUGxhbmVTdGVwICAgICAgUk4gIDQKK3BUb3AgICAgICAgICAgICBSTiAgNQorcEJvdCAgICAgICAgICAgIFJOICA2CitwRHN0VG9wICAgICAgICAgUk4gIDcKK3BEc3RCb3QgICAgICAgICBSTiAgOAorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BEc3RMZWZ0ICAgICAgICBSTiAgOQorcERzdFJpZ2h0ICAgICAgIFJOICAxMAorT2Zmc2V0ICAgICAgICAgIFJOICAxMQorVGVtcCAgICAgICAgICAgIFJOICAxNAorQ291bnRlciAgICAgICAgIFJOICAxMgorVG1wICAgICAgICAgICAgIFJOICA3Cis7Ly9PdXRwdXQgcmVnaXN0ZXJzCisKK3Jlc3VsdCAgICAgICAgICBSTiAgMAorOy8vIE5lb24gcmVnaXN0ZXJzCitxRGF0YTAgICAgICAgICAgUU4gIDAuVTgKK3FEYXRhMSAgICAgICAgICBRTiAgMS5VOAorZERhdGEwICAgICAgICAgIEROICAwLlU4CitkRGF0YTEgICAgICAgICAgRE4gIDEuVTgKK2REYXRhMiAgICAgICAgICBETiAgMi5VOAorZERhdGEzICAgICAgICAgIEROICAzLlU4CisKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgICAgcFBsYW5lU3RlcCwgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgICAgaVBsYW5lU3RlcCwgcFBsYW5lU3RlcAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFRvcCwgcFNyY0RzdFBsYW5lLCAjMCAgICAgICAgICAgICAgOy8vIFRvcCByb3cgcG9pbnRlciBvZiB0aGUgZnJhbWUKKyAgICAgICAgTVVMICAgICAgICAgT2Zmc2V0LCBpRXhwYW5kUGVscywgaVBsYW5lU3RlcCAgICAgOy8vIEUqU3RlcCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFRlbXAsIGlGcmFtZUhlaWdodCwgIzEgICAgICAgICAgICAgIDsvLyBILTEKKyAgICAgICAgTVVMICAgICAgICAgVGVtcCwgaVBsYW5lU3RlcCwgVGVtcCAgICAgICAgICAgICAgOy8vIChILTEpKlN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcEJvdCwgVGVtcCwgcFNyY0RzdFBsYW5lICAgICAgICAgICAgOy8vIEJQdHIgPSBUUHRyICsgKEgtMSkqU3RlcAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRnJhbWVXaWR0aCAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgbG9vcCBjb3VudGVyCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgaWYgcFNyY0RzdFBsYW5lIGFuZCBpUGxhbmVTdGVwIGFyZSAxNiBieXRlIGFsaWduZWQKKyAgICAgICAgVFNUICAgICAgICAgcFNyY0RzdFBsYW5lLCAjMHhmCisgICAgICAgIFRTVEVRICAgICAgIGlQbGFuZVN0ZXAsICMweGYgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICBIb3I4TG9vcDAwCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgdG9wIGFuZCBib3R0b20gcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AgcmVnaW9uID0gdG9wIHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tIHJlZ2lvbiA9IGxhc3Qgcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworCisgICAgICAgIDsvLyBDYXNlIGZvciAxNiBieXRlIGFsaWdubWVudAorSG9yMTZMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDEyOF0hCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKKyAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEAxMjhdIQorVmVyMTZMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyMTZMb29wMAorCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgorICAgICAgICBCR1QgICAgICAgICBIb3IxNkxvb3AwMAorICAgICAgICBCICAgICAgICAgICBFbmRBbGlnbmVkTG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIENhc2UgZm9yIDggYnl0ZSBhbGlnbm1lbnQKK0hvcjhMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDY0XSEKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgorICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDY0XSEKK1ZlcjhMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXI4TG9vcDAKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKKyAgICAgICAgQkdUICAgICAgICAgSG9yOExvb3AwMAorCitFbmRBbGlnbmVkTG9vcAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjRHN0UGxhbmUsIGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RSaWdodCwgVGVtcCwgT2Zmc2V0CisgICAgICAgIFNVQiAgICAgICAgIHBSaWdodCwgVGVtcCwgIzEKKyAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBTcmNEc3RQbGFuZSwgT2Zmc2V0ICAgIAorICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIGlFeHBhbmRQZWxzICAgIAorICAgICAgICBBREQgICAgICAgICBwTGVmdCwgcFNyY0RzdFBsYW5lLCAjMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAgICAgICAgIDsvLyBUb3AtTGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMAorICAgICAgICBTVUIgICAgICAgICBPZmZzZXQsIGlQbGFuZVN0ZXAsIGlFeHBhbmRQZWxzCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcCAgICAgICA7Ly8gVG9wLVJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGExCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AtbGVmdCByZWdpb24gPSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIHRvcC1yaWdodCByZWdpb24gPSB0b3AtcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworSG9yTG9vcDExCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCitWZXJMb29wMQorICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDEKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJQTCAgICAgICAgIEhvckxvb3AxMQorCisgICAgICAgIFNVQiAgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgbGVmdCBhbmQgcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyBMZWZ0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIGxlZnQgc3RhcnQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIFJpZ2h0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIHJpZ2h0IGVuZCBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KK0hvckxvb3AyMgorICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscworICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAKK1Zlckxvb3AyCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMgorCisgICAgICAgIFNVQlMgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AyMgorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIGJvdHRvbS1sZWZ0IHJlZ2lvbiA9IGJvdHRvbS1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tLXJpZ2h0IHJlZ2lvbiA9IGJvdHRvbS1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCitIb3JMb29wMzMKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKK1Zlckxvb3AzCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMworCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0CisgICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKKyAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDMzCitFbmQKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX0VORCAgICAKKyAgICAKKyAgICBFTkRJRgorCisKKworICAgICAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQ3YTJkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCisgKiAKKyAqLworIAorI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisgIAorLyogQ0FWTEMgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMDg5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjIyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCis7Ly8gRnVuY3Rpb25zOgorOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKKzsvLworOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KKzsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcworOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByNCxyNSxyNixyOCxyOSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgorOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFByZWQwICAgICAgICAgIFJOIDAKK2lQcmVkU3RlcDAgICAgICBSTiAxCitwUHJlZDEgICAgICAgICAgUk4gMgoraVByZWRTdGVwMSAgICAgIFJOIDMKK3BEc3RQcmVkICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpUHJlZEEwICAgICAgICAgUk4gMTAKK2lQcmVkQTEgICAgICAgICBSTiAxMQoraVByZWRCMCAgICAgICAgIFJOIDEyCitpUHJlZEIxICAgICAgICAgUk4gMTQKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorUmVzdWx0QSAgICAgICAgIFJOIDUKK1Jlc3VsdEIgICAgICAgICBSTiA0CityMHg4MDgwODA4MCAgICAgUk4gNworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDAKKyAgICAgICAgTV9FTkQKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKKworICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMgorICAgICAgICBNX0VORAorCisKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQzCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM3NDk1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzNhNzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE5OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMzIxMCAgICAgRE4gRDE4LlU4ICAgCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKK2RNYXNrXzQgICAgIEROIEQyNi5VMTYKKworZFRlbXAgICAgICAgRE4gRDI4LlU4CitkRHVtbXkgICAgICBETiBEMTcuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKKworOy8vIGJTR0U0CisKK2RIU3AwcTEgICAgIEROIEQxMy5VOAorZEhTcTBwMSAgICAgRE4gRDMxLlU4ICAgCisKK2RCUzMyMTAgICAgIEROIEQyOC5VMTYKKworZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTggICA7VGVtcDIgICAgICAgIAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKKzsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgCisgICAgICAgIDtkVEMzMjEwIC0xOAorICAgICAgICA7ZFRlbXAtMjgKKworICAgICAgICBWTEQxICAgICAgICBkMTguVTMyWzBdLCBbcFRocmVzaG9sZHNdISA7aGVyZQorCisgICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQorCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZFRlbXAsIGRUQzMyMTAKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAorICAgICAgICBWWklQLjggICAgICBkVEMzMjEwLCBkVGVtcAorICAgIAorICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorCisgICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCisKKyAgICAgICAgOy8vIGRUQzMyMTAtMTgKKyAgICAgICAgOy8vIGRUZW1wLTI4CisgICAgICAgIDsvLyBkVEMtMzEKKyAgICAgICAgVkJJRiAgICAgICAgZFRDMzIxMCwgZE1hc2tfMCwgZEZpbHQKKyAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMzIxMCwgZE1hc2tfMQorICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQorICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgOzEKKyAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKworICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorCisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOworCisgICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBxUF8wbiAtIDE0CisgICAgICAgIDsvLyBxUV8wbiAtIDEyCisgICAgICAgIAorICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAorICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAorCisgICAgICAgIDsxCisgICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCisgICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCisgICAgICAgIAorICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KKyAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCisKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIAorICAgICAgICA7ZEhTcTBwMSAtIDMxCisgICAgICAgIDtkSFNwMHExIC0gMTMKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKKworICAgICAgICA7Ly8gUHJlcGFyZSB0aGUgYlMgbWFzaworCisgICAgICAgIDsvLyBkSFNwMHExLTEzCisgICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTEzCisgICAgICAgIDsvLyBkSFNxMHAxLTMxCisgICAgICAgIDsvLyBkUV8wdC1UZW1wMS0zMQorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorCisgICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAorICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGICAKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFmZTRmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwVGhyZXNob2xkcyBSTiA1CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitkUnAwcTAgICAgICBETiBEMjQuVTgKKworZE1heFAgICAgICAgRE4gRDIzLlU4CitkTWluUCAgICAgICBETiBEMjIuVTgKKworZE1heFEgICAgICAgRE4gRDE5LlU4CitkTWluUSAgICAgICBETiBEMjEuVTgKKworZERlbHRhUCAgICAgRE4gRDI2LlU4CitkRGVsdGFRICAgICBETiBEMjcuVTgKKworcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RRXzFuICAgICAgIEROIEQyNS5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKKworOy8vIGJTR0U0CisKK3FTcDBxMCAgICAgIFFOIFExMC5VMTYKKworcVNwMnExICAgICAgUU4gUTExLlUxNgorcVNwMHEwcDEgICAgUU4gUTEyLlUxNgorcVNwM3AyICAgICAgUU4gUTEzLlUxNgorZEhTcDBxMSAgICAgRE4gRDI4LlU4CisKK3FTcTJwMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHExICAgIFFOIFExMi5VMTYKK3FTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQorZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCisKK3FUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCitxVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAorCitkUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorZFBfMm4gICAgICAgRE4gRDMxLlU4CisKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Cis7Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICAKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RUQzBbXX0sIFtwVGhyZXNob2xkc10hCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkVEMxW119LCBbcFRocmVzaG9sZHNdIQorCisgICAgICAgIDsvLyBkUnAwcTAtMjQKKyAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCisgICAgCisgICAgICAgIDsvLyBkVEMwMSA9IChkVEMxIDw8IDQpIHwgZFRDMAorICAgICAgICA7Ly8gZFRDMDEtMTgKKyAgICAgICAgVkVYVCAgICAgICAgZFRDMDEsIGRUQzAsIGRUQzEsICM0CisgICAgICAgIDsvLyBkVGVtcC0xOQorICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFwZmxnLCBkTWFza18xCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkVEMwMSwgZE1hc2tfMCwgZEZpbHQKKyAgICAKKworICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKKworICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKKyAgICAgICAgVlJIQUREICAgICAgZFJwMHEwLCBkUF8wLCBkUV8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMDEsIGRUZW1wCisKKyAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKKyAgICAgICAgCisgICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXFmbGcsIGRNYXNrXzEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFAsIGRQXzEsIGRUQzAxICAgICAgCisgICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDLCBkVGVtcAorCisgICAgICAgIDsvLyBkTWF4UCA9IFFBREQoZFBfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUCA9IFFTVUIoZFBfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4UC1kMjMKKyAgICAgICAgOy8vIGRNaW5QLWQyMgorICAgICAgICBWUVNVQiAgICAgICBkTWluUCwgZFBfMSwgZFRDMDEgICAgICAKKworICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkTWF4USA9IFFBREQoZFFfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUSA9IFFTVUIoZFFfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4US0xOQorICAgICAgICA7Ly8gZE1pblEtMjEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFEsIGRRXzEsIGRUQzAxCisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVAsIGRScDBxMCwgZFBfMiAgIAorICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICAKKyAgICAgICAgVlFTVUIgICAgICAgZE1pblEsIGRRXzEsIGRUQzAxCisKKyAgICAgICAgOy8vIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFQID0gKGRQXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKGRQXzEgLSBkVEMwMSwgZFBfMSArIGRUQzAxLCBkRGVsdGFQKTsKKyAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChNaW5QLCBNYXhQLCBkRGVsdGFQKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKGRRXzEgLSBkVEMwMSwgZFFfMSArIGRUQzAxLCBkRGVsdGFRKTsKKyAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChNaW5RLCBNYXhRLCBkRGVsdGFRKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkRGVsdGFQLTI2CisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVEsIGRScDBxMCwgZFFfMiAgIAorCisgICAgICAgIDsvLyBkRGVsdGFRLTI3CisgICAgICAgIAorICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFBfMW4gLSAzMAorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorICAgICAgICA7Ly8gZFFfMW4gLSAyNQorICAgICAgICAKKyAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7CisKKyAgICAgICAgVk1BWCAgICAgICAgZFBfMW4sIGREZWx0YVAsIGRNaW5QICAgCisgICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7CisKKyAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICAKKyAgICAgICAgOy8vIHFQXzBuIC0gMTQKKyAgICAgICAgOy8vIHFRXzBuIC0gMTIKKyAgICAgICAgCisgICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCisgICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCisKKyAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKKyAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKKyAgICAgICAgCisgICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgorICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KKyAgICAgICAgCisgICAgICAgIFZNQVggICAgICAgIGRRXzFuLCBkRGVsdGFRLCBkTWluUQorCisgICAgICAgIFZNSU4gICAgICAgIGRQXzFuLCBkUF8xbiwgZE1heFAKKyAgICAgICAgVk1JTiAgICAgICAgZFFfMW4sIGRRXzFuLCBkTWF4UQorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKworICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcKKworICAgICAgICBNX0VORAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIAorCisgICAgICAgIDsvLyBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAorICAgICAgICA7Ly8gYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKKworICAgICAgICA7Ly8gKCBkQXBmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCisgICAgICAgIDsvLyAoIGRBcWZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKKworICAgICAgICA7Ly8gKCBkQXBmbGcgPSBkQXBmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorICAgICAgICA7Ly8gKCBkQXFmbGcgPSBkQXFmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorCisgICAgICAgIDsvLyBQIEZpbHRlcgorCisgICAgICAgIFZTSFIgICAgICAgIGRUZW1wLCBkQWxwaGEsICMyCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AwcTAtMTAKKyAgICAgICAgVkFEREwgICAgICAgcVNwMHEwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AycTEtMTEKKyAgICAgICAgOy8vIHFTcDBxMHAxLTEyCisgICAgICAgIFZBRERMICAgICAgIHFTcDJxMSwgZFBfMiwgZFFfMSAgICAgIAorICAgICAgICBWQUREVyAgICAgICBxU3AwcTBwMSwgcVNwMHEwLCBkUF8xICAKKworICAgICAgICBWQ0dUICAgICAgICBkVGVtcCwgZFRlbXAsIGRBcDBxMAorICAgICAgICBWU0hSICAgICAgICBxU3AycTEsICMxICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoICggKHAwICsgcTAgKyBwMSkgKyAocDIgKyBxMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFBfMG4gPSAoICggKHFTcDBxMCArIGRQXzEpICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUF8wbiA9ICggKCBxU3AwcTBwMSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFBfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKGRQXzIgKyBxU3AwcTBwMSArIDIpPj4yKTsKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoIChwMyArIHAyKSArIChwMSArIHAwICsgcTAgKyBwMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIChkUF8yICsgcVNwMHEwcDEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBwMSwgcVNwMnExCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcDEsIGRQXzIgIAorICAgICAgICAKKyAgICAgICAgOy8vIHFTcDNwMi0xMworICAgICAgICBWQURETCAgICAgICBxU3AzcDIsIGRQXzMsIGRQXzIgICAgICAKKworICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRBcGZsZywgZFRlbXAKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZTUkEgICAgICAgIHFTcDNwMiwgcVRlbXAyLCAjMSAgICAgIAorICAgICAgICA7Ly8gZEhTcDBxMS0yOAorICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRBcWZsZywgZFRlbXAKKworICAgICAgICA7Ly8gZFBfMG4tMjkKKyAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMjgKKyAgICAgICAgVlFSU0hSTiAgICAgZFBfMG4sIHFUZW1wMSwgIzEKKyAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCisKKyAgICAgICAgOy8vIGRQXzFuLTMwCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzFuLCBxVGVtcDIsICMyCisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3EycDEsIGRRXzIsIGRQXzEgICAgICAgICAgCisgICAgICAgIFZBRERXICAgICAgIHFTcDBxMHExLCBxU3AwcTAsIGRRXzEgICAgICAKKyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wdCwgZEFwZmxnICAgIAorCisgICAgICAgIDsvLyBRIEZpbHRlcgorCisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoICggKHAwICsgcTAgKyBxMSkgKyAocTIgKyBwMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFFfMG4gPSAoICggKHFTcDBxMCArIGRRXzEpICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUV8wbiA9ICggKCBxU3AwcTBxMSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFFfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHEwICsgcTAgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgoZFFfMiArIHFTcDBxMHExICsgMik+PjIpOworICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoIChxMyArIHEyKSArIChxMSArIHAwICsgcTAgKyBxMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIChkUV8yICsgcVNwMHEwcTEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFTcTJwMS0xMQorICAgICAgICA7Ly8gcVNwMHEwcTEtMTIKKworCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFUZW1wMS1xU3EycDEtMTEKKyAgICAgICAgOy8vIHFTcTNxMi0xMworICAgICAgICA7Ly8gZFBfMm4tMzEKKyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzJuLCBxU3AzcDIsICMyCisgICAgICAgIFZBRERMICAgICAgIHFTcTNxMiwgZFFfMywgZFFfMiAgICAgICAgICAKKworICAgICAgICBWU0hSICAgICAgICBxU3EycDEsICMxICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBxMSwgcVNxMnAxCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcTEsIGRRXzIgICAgICAKKworICAgICAgICA7Ly8gZEhTcTBwMS0yOAorICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCisKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0CisgICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKKworICAgICAgICBWU1JBICAgICAgICBxU3EzcTIsIHFUZW1wMiwgIzEgICAgICAgICAgCisKKyAgICAgICAgOy8vIGRRXzEtVGVtcDItMjUKKyAgICAgICAgOy8vIGRRXzAtVGVtcDItMjQKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMW4sIHFUZW1wMiwgIzIKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMG4sIHFUZW1wMSwgIzEKKworICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMjIKKyAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZyAgICAgICAgIAorCisgICAgICAgIFZCSUYgICAgICAgIGRQXzJuLCBkUF8yLCBkQXBmbGcgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMHQsIGRBcWZsZyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRRXzJuLCBxU3EzcTIsICMyCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdAorICAgICAgICBWQklGICAgICAgICBkUV8ybiwgZFFfMiwgZEFxZmxnICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAKKworCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMGE4OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKQEAgLTAsMCArMSwzMjUgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzYxNjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorCisgICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAgICAKKyAgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU5MTJkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBBUk0xMTM2SlMgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gOAoraUhlaWdodCAgICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK3ggICAgICAgICAgICAgICBSTiA3Cit4MCAgICAgICAgICAgICAgUk4gNworeDEgICAgICAgICAgICAgIFJOIDEwCit4MiAgICAgICAgICAgICAgUk4gMTEKK1NjcmF0Y2ggICAgICAgICBSTiAxMgorCis7Ly8gRnVuY3Rpb246IAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIyLHIzLHI0LHI1LHI2Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAorICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKKworU3RhcnRBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMworICAgICAgICAKKyAgICAgICAgTV9TV0lUQ0ggeAorICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5MHRvQWxpZ25lZCAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisgICAgICAKK0NvcHkxdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorCitDb3B5MnRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTN0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAorCitDb3B5RW5kICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgorCisgICAgICAgIE1fRU5ECisgICAgCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCitTdGFydFZBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorQ29weTB0b1ZBbGlnbmVkICAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKyAgICAgIAorQ29weTF0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkydG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKworQ29weTN0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKKworQ29weVZFbmQgIAorCisgICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4CisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKworICAgICAgICBNX0VORAorCisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNzU4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE0OSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMSxyMyxyNCxyNSxyNixyNyxyMTAscjExLHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHIwLHIyLHI4LHI5LHIxMgorCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCit4MCAgICAgICAgICAgICAgUk4gNAoreDEgICAgICAgICAgICAgIFJOIDUKK3gyICAgICAgICAgICAgICBSTiA4Cit4MyAgICAgICAgICAgICAgUk4gOQorVGVtcCAgICAgICAgICAgIFJOIDEyCisKKyAgICBJRiBBUk0xMTM2SlMKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlLCByNgorCitDb3B5NHg0U3RhcnQKKyAgICAgICAgOy8vIERvIENvcHkgYW5kIGJyYW5jaCB0byBFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgQU5EICAgICBUZW1wLCBwU3JjLCAjMworICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgTV9TV0lUQ0ggVGVtcAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjAKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24xCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMgorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjMKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ29weTR4NEFsaWduMAorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9MRFIgICB4MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDMsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9TVFIgICB4MywgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjEKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0CisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisgICAgICAKK0NvcHk0eDRBbGlnbjIKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0QWxpZ24zIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0RW5kCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlNWEzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNzggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKworOy8vIEZ1bmN0aW9uczogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSBhbmQKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlIAorOy8vCis7Ly8gSW1wbGVtZW50cyByZS1hcnJhbmdlbWVudCBvZiBkYXRhIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciB0byBhIGJ1ZmZlciBwb2ludGVkIGJ5IHBCdWYuCis7Ly8gVGhpcyB3aWxsIGRvIHRoZSBjb252ZXJ0aW9uIG9mIGRhdGEgZnJvbSAxNiBiaXQgdG8gOCBiaXQgYW5kIGl0IGFsc28KKzsvLyByZW1vdmUgb2Zmc2V0IGFuZCBjaGVjayBmb3Igc2F0dXJhdGlvbi4KKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjcgd2hlcmUgcjAgaXMgaW5wdXQgcG9pbnRlciBhbmQgcjIgaXRzIHN0ZXAgc2l6ZSwgcjcgaXMgb3V0cHV0IHBvaW50ZXIKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgorOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgZGVzdGluYXRpb24gbG9jYXRpb24KKworCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgCitNQVNLICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAgIDsvLyBNYXNrIGlzIHVzZWQgdG8gaW1wbGVtZW50IChhK2IrMSkvMgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyYzAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAwICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorVGVtcDMgICAgICAgICAgIFJOIDEwCitUZW1wNCAgICAgICAgICAgUk4gMTEKK3BCdWYgICAgICAgICAgICBSTiA3CityMHgwZmUwMGZlMCAgICAgUk4gNgorcjB4MDBmZjAwZmYgICAgIFJOIDEyCitDb3VudCAgICAgICAgICAgUk4gMTQKK1ZhbHVlQTAgICAgICAgICBSTiAxMAorVmFsdWVBMSAgICAgICAgIFJOIDExCisKKyAgICBJRiBBUk0xMTM2SlMKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgIAorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzQgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgCitMb29wU3RhcnQxCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMCAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFJEICAgICAgICBWYWx1ZUEwLCBbcEJ1Zl0sICM4IAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQxCitFbmQxCisgICAgICAgIFNVQiAgICAgICAgcFNyYzAsIHBCdWYsICMzMgorICAgICAgICBNT1YgICAgICAgIHNyY1N0ZXAwLCAjOAorCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjMgorCitMb29wU3RhcnQgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjLTQgIAorCisgICAgICAgIExEUiAgICAgICAgIFRlbXA0LCBbcFNyYzAsICMxMl0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDMsIFtwU3JjMCwgIzhdICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwU3JjMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAxLCBbcFNyYzBdLCBzcmNTdGVwMAorICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wNCwgIzEzLCBUZW1wNAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMywgIzEzLCBUZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAyLCAjMTMsIFRlbXAyCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAxLCAjMTMsIFRlbXAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgOy8vIFtkMiBjMiBkMCBjMF0gICAgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTAsIFRlbXAxLCBUZW1wMiwgTFNMICM4ICAgICAgICA7Ly8gW2IyIGEyIGIwIGEwXSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDEsIFZhbHVlQTAsIFZhbHVlQTEsIExTTCAjMTYgICAgIDsvLyBbZDAgYzAgYjAgYTBdCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDEsIFtwQnVmXSwgIzggCisgICAgICAgIFBLSFRCICAgICAgIFRlbXAyLCBWYWx1ZUExLCBWYWx1ZUEwLCBBU1IgIzE2ICAgICA7Ly8gW2QyIGMyIGIyIGEyXQorICAgICAgICBTVFIgICAgICAgICBUZW1wMiwgW3BCdWZdLCAjNCAgCisgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBMb29wU3RhcnQKK0VuZDIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYzAsIHBCdWYsICMzMi04CisgICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAwLCAjNAorCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTY4NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzEzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorcUNvZWZmNSAgICAgICAgIFFOIDE0LlMzMgorcUNvZWZmMjAgICAgICAgIFFOIDE1LlMzMgorICAgICAgICAKK3FTcmMwMSAgICAgICAgICBRTiAwLlU4CitkU3JjMCAgICAgICAgICAgRE4gMC5VOAorZFNyYzEgICAgICAgICAgIEROIDEuVTggICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCitkU3JjYiAgICAgICAgICAgRE4gNC5VOAorZFNyY2MgICAgICAgICAgIEROIDIuVTgKK2RTcmNkICAgICAgICAgICBETiAzLlU4CitkU3JjZSAgICAgICAgICAgRE4gNS5VOAorZFNyY2YgICAgICAgICAgIEROIDEuVTgKKworcVNyY2IgICAgICAgICAgIFFOIDIuUzE2CitxU3JjYyAgICAgICAgICAgUU4gMS5TMTYKK2RTcmNCICAgICAgICAgICBETiA0LlMxNgorZFNyY0MgICAgICAgICAgIEROIDIuUzE2CisKK3FSZXMwICAgICAgICAgICBRTiA1LlMxNgorcVJlczEgICAgICAgICAgIFFOIDYuUzE2CitxUmVzMiAgICAgICAgICAgUU4gNy5TMTYKK3FSZXMzICAgICAgICAgICBRTiA4LlMxNgorcVJlczQgICAgICAgICAgIFFOIDkuUzE2CitxUmVzNSAgICAgICAgICAgUU4gMTAuUzE2CitxUmVzNiAgICAgICAgICAgUU4gMTEuUzE2CitxUmVzNyAgICAgICAgICAgUU4gMTIuUzE2CitxUmVzOCAgICAgICAgICAgUU4gMTMuUzE2CisgICAgCitkUmVzMCAgICAgICAgICAgRE4gMTAuUzE2CitkUmVzMSAgICAgICAgICAgRE4gMTIuUzE2CitkUmVzMiAgICAgICAgICAgRE4gMTQuUzE2CitkUmVzMyAgICAgICAgICAgRE4gMTYuUzE2CitkUmVzNCAgICAgICAgICAgRE4gMTguUzE2CitkUmVzNSAgICAgICAgICAgRE4gMjAuUzE2CitkUmVzNiAgICAgICAgICAgRE4gMjIuUzE2CitkUmVzNyAgICAgICAgICAgRE4gMjQuUzE2CitkUmVzOCAgICAgICAgICAgRE4gMjYuUzE2CisgICAgCitxQWNjMDEgICAgICAgICAgUU4gNS5TMzIKK3FBY2MyMyAgICAgICAgICBRTiA2LlMzMgorcUFjYzQ1ICAgICAgICAgIFFOIDIuUzMyCitxQWNjNjcgICAgICAgICAgUU4gMy5TMzIKK3FTdW1CRSAgICAgICAgICBRTiAwLlMzMgorcVN1bUNEICAgICAgICAgIFFOIDEuUzMyCisKK2RUZW1wQWNjMCAgICAgICBETiAwLlUxNgorZFRlbXBBY2MxICAgICAgIEROIDIuVTE2CitkVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKK2RUZW1wQWNjMyAgICAgICBETiA2LlUxNgorCitxVEFjYzAgICAgICAgICAgUU4gMC5VMTYKK3FUQWNjMSAgICAgICAgICBRTiAxLlUxNgorcVRBY2MyICAgICAgICAgIFFOIDIuVTE2CitxVEFjYzMgICAgICAgICAgUU4gMy5VMTYKKworZEFjYzAgICAgICAgICAgIEROIDAuVTgKK2RBY2MxICAgICAgICAgICBETiAyLlU4CitkQWNjMiAgICAgICAgICAgRE4gNC5VOAorZEFjYzMgICAgICAgICAgIEROIDYuVTgKKworZFRtcDAgICAgICAgICAgIEROIDguUzE2CitkVG1wMSAgICAgICAgICAgRE4gOS5TMTYKK3FUbXAwICAgICAgICAgICBRTiA0LlMzMgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1CisKKyAgICAgICAgOy8vIFJvdzAKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cxCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczEsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVG1wMCA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3cyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczIsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93MworICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMzLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczMsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczQsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczQsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzUKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM1LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNSwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NgorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM2LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzNSwgZFJlczUsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c3CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczcsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM2LCBkUmVzNiwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczcsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzgKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzOCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKworICAgICAgICBWU1VCICAgICAgICBkUmVzNywgZFJlczcsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczgsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM4LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIFZNT1YgICAgICAgIHFDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgcUNvZWZmNSwgIzUKKworICAgICAgICA7Ly8gQ29sMAorICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRSZXMwLCBkUmVzNSAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMyLCBkUmVzMyAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMxLCBkUmVzNCAgICAgICAgOy8vIGIrZQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM4LCBkUmVzOCwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBxQWNjMDEsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzAxLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKworICAgICAgICA7Ly8gQ29sMQorICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRSZXMxLCBkUmVzNiAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMzLCBkUmVzNCAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMyLCBkUmVzNSAgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBxQWNjMjMsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorCisgICAgICAgIFZTVUIgICAgICAgIHFBY2MwMSwgcUFjYzAxLCBxVG1wMAorCis7ICAgICAgICBWTUxTICAgICAgICBxQWNjMjMsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIDsvLyBDb2wyCisgICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFJlczIsIGRSZXM3ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczQsIGRSZXM1ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczMsIGRSZXM2ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2M0NSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzIzLCBxQWNjMjMsIHFUbXAwCisKKzsgICAgICAgIFZNTFMgICAgICAgIHFBY2M0NSwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29sMworICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRSZXMzLCBkUmVzOCAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXM1LCBkUmVzNiAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXM0LCBkUmVzNyAgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBxQWNjNjcsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorCisgICAgICAgIFZTVUIgICAgICAgIHFBY2M0NSwgcUFjYzQ1LCBxVG1wMAorCisgICAgICAgIFZNTFMgICAgICAgIHFBY2M2NywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKworICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwMSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzIzLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjNDUsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2M2NywgIzEwCisgICAgICAgIAorICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgorICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JjMDkxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDI2NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgIElGIENvcnRleEE4CisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZFRDb2VmZjUgICAgICAgIEROIDMwLlU4CitkVENvZWZmMjAgICAgICAgRE4gMzEuVTgKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworcVNyY0EwMSAgICAgICAgIFFOIDAuVTgKK3FTcmNCMjMgICAgICAgICBRTiAxLlU4CitxU3JjQzQ1ICAgICAgICAgUU4gMi5VOAorcVNyY0Q2NyAgICAgICAgIFFOIDMuVTgKK3FTcmNFODkgICAgICAgICBRTiA0LlU4CitxU3JjRjEwMTEgICAgICAgUU4gNS5VOAorcVNyY0cxMjEzICAgICAgIFFOIDYuVTgKK3FTcmNIMTQxNSAgICAgICBRTiA3LlU4CitxU3JjSTE2MTcgICAgICAgUU4gOC5VOAorCitkU3JjQTAgICAgICAgICAgRE4gMC5VOAorZFNyY0IyICAgICAgICAgIEROIDIuVTgKK2RTcmNDNCAgICAgICAgICBETiA0LlU4CitkU3JjRDYgICAgICAgICAgRE4gNi5VOAorZFNyY0U4ICAgICAgICAgIEROIDguVTgKK2RTcmNGMTAgICAgICAgICBETiAxMC5VOAorZFNyY0cxMiAgICAgICAgIEROIDEyLlU4CitkU3JjSDE0ICAgICAgICAgRE4gMTQuVTgKK2RTcmNJMTYgICAgICAgICBETiAxNi5VOAorCitkU3JjQTEgICAgICAgICAgRE4gMS5VOAorZFNyY0IzICAgICAgICAgIEROIDMuVTgKK2RTcmNDNSAgICAgICAgICBETiA1LlU4CitkU3JjRDcgICAgICAgICAgRE4gNy5VOAorZFNyY0U5ICAgICAgICAgIEROIDkuVTgKK2RTcmNGMTEgICAgICAgICBETiAxMS5VOAorZFNyY0cxMyAgICAgICAgIEROIDEzLlU4CitkU3JjSDE1ICAgICAgICAgRE4gMTUuVTgKK2RTcmNJMTcgICAgICAgICBETiAxNy5VOAorCitxVGVtcFAwMSAgICAgICAgUU4gOS5TMTYKK3FUZW1wUTAxICAgICAgICBRTiAxMC5TMTYKK3FUZW1wUjAxICAgICAgICBRTiAxMS5TMTYKK3FUZW1wUzAxICAgICAgICBRTiAxMi5TMTYKKworcVRlbXBQMjMgICAgICAgIFFOIDAuUzE2CitxVGVtcFEyMyAgICAgICAgUU4gMS5TMTYKK3FUZW1wUjIzICAgICAgICBRTiAyLlMxNgorcVRlbXBTMjMgICAgICAgIFFOIDMuUzE2CisKK2RUZW1wUDAgICAgICAgICBETiAxOC5TMTYKK2RUZW1wUDEgICAgICAgICBETiAxOS5TMTYKK2RUZW1wUDIgICAgICAgICBETiAwLlMxNgorCitkVGVtcFEwICAgICAgICAgRE4gMjAuUzE2CitkVGVtcFExICAgICAgICAgRE4gMjEuUzE2CitkVGVtcFEyICAgICAgICAgRE4gMi5TMTYKKworZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgorZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgorZFRlbXBSMiAgICAgICAgIEROIDQuUzE2CisKK2RUZW1wUzAgICAgICAgICBETiAyNC5TMTYKK2RUZW1wUzEgICAgICAgICBETiAyNS5TMTYKK2RUZW1wUzIgICAgICAgICBETiA2LlMxNgorIAorZFRlbXBCMCAgICAgICAgIEROIDI2LlMxNgorZFRlbXBDMCAgICAgICAgIEROIDI3LlMxNgorZFRlbXBEMCAgICAgICAgIEROIDI4LlMxNgorZFRlbXBGMCAgICAgICAgIEROIDI5LlMxNgorCitkVGVtcEFjYzAgICAgICAgRE4gMC5VMTYKK2RUZW1wQWNjMSAgICAgICBETiAyLlUxNgorZFRlbXBBY2MyICAgICAgIEROIDQuVTE2CitkVGVtcEFjYzMgICAgICAgRE4gNi5VMTYKKworZEFjYzAgICAgICAgICAgIEROIDAuVTgKK2RBY2MxICAgICAgICAgICBETiAyLlU4CitkQWNjMiAgICAgICAgICAgRE4gNC5VOAorZEFjYzMgICAgICAgICAgIEROIDYuVTgKKworcUFjYzAgICAgICAgICAgIFFOIDAuUzMyCitxQWNjMSAgICAgICAgICAgUU4gMS5TMzIKK3FBY2MyICAgICAgICAgICBRTiAyLlMzMgorcUFjYzMgICAgICAgICAgIFFOIDMuUzMyCisKK3FUQWNjMCAgICAgICAgICBRTiAwLlUxNgorcVRBY2MxICAgICAgICAgIFFOIDEuVTE2CitxVEFjYzIgICAgICAgICAgUU4gMi5VMTYKK3FUQWNjMyAgICAgICAgICBRTiAzLlUxNiAgICAgICAgICAgICAgICAKKworcVRtcCAgICAgICAgICAgIFFOIDQuUzE2CitkVG1wICAgICAgICAgICAgRE4gOC5TMTYKKworICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gYTE1XSAgIAorICAgICAgICBBREQgICAgICAgICByMTIsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorICAgICAgICBWTU9WICAgICAgICBkVENvZWZmNSwgIzUKKyAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjIwLCAjMjAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0YxMDExLCBbcjEyXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBxU3JjQjIzLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gYjE1XQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0cxMjEzLCBbcjEyXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxVGVtcFAwMSwgZFNyY0EwLCBkU3JjRjEwICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0M0NSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIGMxNV0KKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMjMsIGRTcmNBMSwgZFNyY0YxMSAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRDY3LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMDEsIGRTcmNCMiwgZFNyY0cxMiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0U4OSwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly90MAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0M0LCBkVENvZWZmMjAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNIMTQxNSwgW3IxMl0sIHNyY1N0ZXAKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0M1LCBkVENvZWZmMjAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNJMTYxNywgW3IxMl0sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXQorICAgICAgICAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNENiwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRDYsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0IzLCBkVENvZWZmNQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMDEsIGRTcmNDNCwgZFNyY0gxNCAgIAorICAgICAgICAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNCMiwgZFRDb2VmZjUKKworICAgICAgICBWQURETCAgICAgICBxVGVtcFEyMywgZFNyY0IzLCBkU3JjRzEzICAgCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNENywgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTAxLCBkU3JjRTgsIGRUQ29lZmYyMAorCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjRTgsIGRUQ29lZmY1CisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRDcsIGRUQ29lZmYyMAorCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjRTksIGRUQ29lZmY1CisKKyAgICAgICAgOy8vdDEKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0U4LCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNDNCwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNDNSwgZFRDb2VmZjUKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBSMjMsIGRTcmNDNSwgZFNyY0gxNSAgIAorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRjEwLCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMDEsIGRTcmNGMTAsIGRUQ29lZmY1CisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUTIzLCBkU3JjRTksIGRUQ29lZmYyMAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0U5LCBkVENvZWZmMjAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMDEsIGRTcmNENiwgZFNyY0kxNiAgIAorCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNENiwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBRMjMsIGRTcmNGMTEsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRDcsIGRUQ29lZmY1CisKKyAgICAgICAgOy8vdDIKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBTMjMsIGRTcmNENywgZFNyY0kxNyAgIAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRzEyLCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0cxMywgZFRDb2VmZjUKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0YxMSwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRzEyLCBkVENvZWZmMjAKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzEKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAorCisKKyAgICAgICAgOy8vdDMKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNHMTMsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0U4LCBkVENvZWZmNQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgorICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjRTksIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjSDE0LCBkVENvZWZmNQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFAxLCBkVGVtcFAyLCAjMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0gxNSwgZFRDb2VmZjUKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFBY2MwLCBkVGVtcFAwLCBkVGVtcEYwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgOy8vaCAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKyAgICAgICAgCisgICAgICAgIDsvLyByZXMwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUDEKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzAsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUTEsIGRUZW1wUTIsICMxCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MwLCBkVGVtcEIwLCBkQ29lZmY1CisKKyAgICAgICAgOy8vIHJlczEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzEsIGRUZW1wUTAsIGRUZW1wRjAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFExCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCisgICAgICAgIFZNTEFMICAgICAgIHFBY2MxLCBkVGVtcEMwLCBkQ29lZmYyMAorICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFIxLCBkVGVtcFIyLCAjMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMiwgZFRlbXBSMCwgZFRlbXBGMAorICAgICAgICBWTUxTTCAgICAgICBxQWNjMSwgZFRlbXBCMCwgZENvZWZmNQorOyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBCMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICAKKyAgICAgICAgOy8vIHJlczIKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRtcCwgZFRlbXBSMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMworICAgICAgICBWTUxBTCAgICAgICBxQWNjMiwgZFRlbXBDMCwgZENvZWZmMjAKKzsgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUjEKKyAgICAgICAgCisgICAgICAgIDsvLyByZXMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUzEsIGRUZW1wUzIsICMxCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBTMCwgZFRlbXBTMSwgIzEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzMsIGRUZW1wUzAsIGRUZW1wRjAKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzIsIGRUZW1wQjAsIGRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzMsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZBREQgICAgICAgIGRUbXAsIGRUbXAsIGRUZW1wUzEKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzMsIGRUbXAsIGRDb2VmZjUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MwLCBxQWNjMCwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzEsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2MyLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MzLCBxQWNjMywgIzEwCisKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzAsIHFUQWNjMAorICAgICAgICBWUU1PVk4gICAgICBkQWNjMSwgcVRBY2MxCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MyLCBxVEFjYzIKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzMsIHFUQWNjMworICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhYmU4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDIyOCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworcVNyY0EwMSAgICAgICAgIFFOIDExLlU4CitxU3JjQjAxICAgICAgICAgUU4gMTIuVTgKK3FTcmNDMDEgICAgICAgICBRTiAxMy5VOAorcVNyY0QwMSAgICAgICAgIFFOIDE0LlU4CisKK2RTcmNBMCAgICAgICAgICBETiAyMi5VOAorZFNyY0ExICAgICAgICAgIEROIDIzLlU4CitkU3JjQjAgICAgICAgICAgRE4gMjQuVTgKK2RTcmNCMSAgICAgICAgICBETiAyNS5VOAorZFNyY0MwICAgICAgICAgIEROIDI2LlU4CitkU3JjQzEgICAgICAgICAgRE4gMjcuVTgKK2RTcmNEMCAgICAgICAgICBETiAyOC5VOAorZFNyY0QxICAgICAgICAgIEROIDI5LlU4CisKK2RTcmNiICAgICAgICAgICBETiAxMi5VOAorZFNyY2UgICAgICAgICAgIEROIDEzLlU4CitkU3JjZiAgICAgICAgICAgRE4gMTAuVTgKKworZFNyYzBjICAgICAgICAgIEROIDE0LlU4CitkU3JjMWMgICAgICAgICAgRE4gMTYuVTgKK2RTcmMyYyAgICAgICAgICBETiAxOC5VOAorZFNyYzNjICAgICAgICAgIEROIDIwLlU4CisgICAgICAgICAgICAgICAgICAgCitkU3JjMGQgICAgICAgICAgRE4gMTUuVTgKK2RTcmMxZCAgICAgICAgICBETiAxNy5VOAorZFNyYzJkICAgICAgICAgIEROIDE5LlU4CitkU3JjM2QgICAgICAgICAgRE4gMjEuVTgKKworcVRlbXAwMSAgICAgICAgIFFOIDQuUzE2CitxVGVtcDIzICAgICAgICAgUU4gNi5TMTYKK2RUZW1wMCAgICAgICAgICBETiA4LlMxNgorZFRlbXAyICAgICAgICAgIEROIDEyLlMxNgorCitxUmVzMDEgICAgICAgICAgUU4gMTEuUzE2CitxUmVzMjMgICAgICAgICAgUU4gMTIuUzE2CitxUmVzNDUgICAgICAgICAgUU4gMTMuUzE2CitxUmVzNjcgICAgICAgICAgUU4gMTQuUzE2CisKK2RSZXMwICAgICAgICAgICBETiAyMi5TMTYKK2RSZXMyICAgICAgICAgICBETiAyNC5TMTYKK2RSZXM0ICAgICAgICAgICBETiAyNi5TMTYKK2RSZXM2ICAgICAgICAgICBETiAyOC5TMTYKKworZEFjYzAgICAgICAgICAgIEROIDIyLlU4CitkQWNjMiAgICAgICAgICAgRE4gMjQuVTgKK2RBY2M0ICAgICAgICAgICBETiAyNi5VOAorZEFjYzYgICAgICAgICAgIEROIDI4LlU4CisKK2RSZXN1bHQwICAgICAgICBETiAyMi5VMzIKK2RSZXN1bHQyICAgICAgICBETiAyNC5VMzIKK2RSZXN1bHQ0ICAgICAgICBETiAyNi5VMzIKK2RSZXN1bHQ2ICAgICAgICBETiAyOC5VMzIKKworICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQSByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNBMCwgZFNyY0ExLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQTAsIGRTcmNBMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjMGMsIGRTcmNBMCwgZFNyY0ExLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjMGQsIGRTcmNBMCwgZFNyY0ExLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0EwLCBkU3JjQTEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXMwMSwgZFNyY0EwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMGMsIGRTcmMwZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KKzsgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNCMCwgZFNyY0IxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQjAsIGRTcmNCMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjMWMsIGRTcmNCMCwgZFNyY0IxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjMWQsIGRTcmNCMCwgZFNyY0IxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0IwLCBkU3JjQjEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXMyMywgZFNyY0IwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRlbXAwICAgIDsvLyBUZVJpCisKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzFjLCBkU3JjMWQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKKzsgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAorICAgICAgICAKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKKworICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0MwLCBkU3JjQzEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNDMCwgZFNyY0MxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMyYywgZFNyY0MwLCBkU3JjQzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMyZCwgZFNyY0MwLCBkU3JjQzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQzAsIGRTcmNDMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczQ1LCBkU3JjQzAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUZW1wMCAgOy8vIFRlUmkKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMyYywgZFNyYzJkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpIFRlUmkKKyAgICAgICAgCisKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNEMCwgZFNyY0QxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjRDAsIGRTcmNEMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjM2MsIGRTcmNEMCwgZFNyY0QxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjM2QsIGRTcmNEMCwgZFNyY0QxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0QwLCBkU3JjRDEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXM2NywgZFNyY0QwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRlbXAwIDsvLyBUZVJpCisKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzNjLCBkU3JjM2QgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcVJlczAxLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcVJlczIzLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjNCwgcVJlczQ1LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICBWUVJTSFJVTiAgICBkQWNjNiwgcVJlczY3LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisKKyAgICBFTkQKKyAgICAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OWM5MGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxMzQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworVGVtcCAgICAgICAgICAgIFJOIDEyCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CisKK2RTcmMwICAgICAgICAgICBETiA3LlU4CitkU3JjMSAgICAgICAgICAgRE4gOC5VOAorZFNyYzIgICAgICAgICAgIEROIDkuVTgKK2RTcmMzICAgICAgICAgICBETiAxMC5VOAorZFNyYzQgICAgICAgICAgIEROIDExLlU4CitkU3JjNSAgICAgICAgICAgRE4gMTIuVTgKK2RTcmM2ICAgICAgICAgICBETiAxMy5VOAorZFNyYzcgICAgICAgICAgIEROIDE0LlU4CitkU3JjOCAgICAgICAgICAgRE4gMTUuVTgKKworcVN1bUJFMDEgICAgICAgIFFOIDguUzE2CitxU3VtQ0QwMSAgICAgICAgUU4gOS5TMTYKK2RTdW1CRTAgICAgICAgICBETiAxNi5TMTYKK2RTdW1DRDAgICAgICAgICBETiAxOC5TMTYKKworcUFjYzAxICAgICAgICAgIFFOIDAuUzE2CitxQWNjMjMgICAgICAgICAgUU4gMS5TMTYKK3FBY2M0NSAgICAgICAgICBRTiAyLlMxNgorcUFjYzY3ICAgICAgICAgIFFOIDMuUzE2CisKK2RSZXMwICAgICAgICAgICBETiAwLlMxNgorZFJlczEgICAgICAgICAgIEROIDIuUzE2CitkUmVzMiAgICAgICAgICAgRE4gNC5TMTYKK2RSZXMzICAgICAgICAgICBETiA2LlMxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOCAgICAgICAgCisgICAgICAgIAorCitkVG1wMCAgICAgICAgICAgRE4gMjAuUzE2CitkVG1wMSAgICAgICAgICAgRE4gMjEuUzE2CitkVG1wMiAgICAgICAgICAgRE4gMjIuUzE2CitkVG1wMyAgICAgICAgICAgRE4gMjMuUzE2CisKKworICAgICAgICBWTEQxICAgICAgICBkU3JjMCwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIF0gCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIF0KKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjNSwgW1RlbXBdLCBzcmNTdGVwICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIF0KKyAgICAgICAgVkFEREwgICAgICAgcUFjYzAxLCBkU3JjMCwgZFNyYzUgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWTEQxICAgICAgICBkU3JjMywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzYsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzQsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMSwgZFNyYzQgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMyLCBkU3JjMyAgICAgOy8vIGMrZCAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCis7ICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgCis7ICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMiwgZFNyYzUgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMzLCBkU3JjNCAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRTcmMxLCBkU3JjNiAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkKKzsgICAgICAgIFZNTEEgICAgICAgIGRSZXMxLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorCis7ICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMywgZFNyYzYgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmM0LCBkU3JjNSAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxQWNjNDUsIGRTcmMyLCBkU3JjNyAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorOyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjNCwgZFNyYzcgICAgIDsvLyBiK2UKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzY3LCBkU3JjMywgZFNyYzggICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzUsIGRTcmM2ICAgICA7Ly8gYytkCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwCisgICAgICAgIFZBREQgICAgICAgIGRSZXMxLCBkUmVzMSwgZFRtcDEKKyAgICAgICAgVkFERCAgICAgICAgZFJlczIsIGRSZXMyLCBkVG1wMgorICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTVVMICAgICAgICBkVG1wMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWQUREICAgICAgICBkUmVzMywgZFJlczMsIGRUbXAzCisKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzAsIHFBY2MwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMSwgcUFjYzIzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxQWNjNDUsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzMsIHFBY2M2NywgIzUgICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworICAgIAorICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjBlYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKQEAgLTAsMCArMSwzMTggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorCisgICAgSUYgQ29ydGV4QTgKKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8gICAgICAKKyAgICAKKyAgICBEQ0QgICBXaWR0aElzMk1WSXNOb3RaZXJvLCBXaWR0aElzMk1WSXNOb3RaZXJvCisgICAgRENEICAgV2lkdGhJczRNVklzTm90WmVybywgV2lkdGhJczRNVklzTm90WmVybworICAgIERDRCAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICAKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvICAgICAgCisgICAgCisgICAgRENEICAgV2lkdGhJczJNVklzWmVybywgV2lkdGhJczJNVklzWmVybworICAgIERDRCAgIFdpZHRoSXM0TVZJc1plcm8sIFdpZHRoSXM0TVZJc1plcm8KKyAgICBEQ0QgICBXaWR0aElzOE1WSXNaZXJvCisgICAgCisgICAgCis7Ly8gaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmMgICAgICAgICAgICAgICAgIFJOIDAKK2lTcmNTdGVwICAgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICAgICAgIFJOIDMKK2lXaWR0aCAgICAgICAgICAgICAgIFJOIDQKK2lIZWlnaHQgICAgICAgICAgICAgIFJOIDUKK2R4ICAgICAgICAgICAgICAgICAgIFJOIDYKK2R5ICAgICAgICAgICAgICAgICAgIFJOIDcKKworOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycworcGMgICAgICAgICAgICAgICAgICAgUk4gMTUKK3JldHVybiAgICAgICAgICAgICAgIFJOIDAKK0VpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCitFaWdodE1pbnVzZHkgICAgICAgICBSTiA5CisKK0FDb2VmZiAgICAgICAgICAgICAgIFJOIDEyCitCQ29lZmYgICAgICAgICAgICAgICBSTiA5CitDQ29lZmYgICAgICAgICAgICAgICBSTiA4CitEQ29lZmYgICAgICAgICAgICAgICBSTiA2CisKK3BUYWJsZSAgICAgICAgICAgICAgIFJOIDExCisKK1N0ZXAxICAgICAgICAgICAgICAgIFJOIDEwCitTcmNTdGVwTWludXMxICAgICAgICBSTiAxNAorCitkQUNvZWZmICAgICAgICAgICAgICBETiBEMTIuVTgKK2RCQ29lZmYgICAgICAgICAgICAgIEROIEQxMy5VOAorZENDb2VmZiAgICAgICAgICAgICAgRE4gRDE0LlU4CitkRENvZWZmICAgICAgICAgICAgICBETiBEMTUuVTgKKworZFJvdzBhICAgICAgICAgICAgICAgRE4gRDAuVTgKK2RSb3cwYiAgICAgICAgICAgICAgIEROIEQxLlU4CitkUm93MWEgICAgICAgICAgICAgICBETiBEMi5VOAorZFJvdzFiICAgICAgICAgICAgICAgRE4gRDMuVTgKKworcVJvdzBhICAgICAgICAgICAgICAgUU4gUTIuUzE2CitxUm93MGIgICAgICAgICAgICAgICBRTiBRMy5TMTYKKworOy8vZEluZGV4ICAgICAgICAgICAgICAgRE4gICAgRDE2LlU4ICAgICAgICAgICAgICAgICAKK3FSb3cxYSAgICAgICAgICAgICAgIFFOIFExMS5TMTYKK3FSb3cxYiAgICAgICAgICAgICAgIFFOIFExMi5TMTYKKworZFJvdzJhICAgICAgICAgICAgICAgRE4gRDE2LlU4CitkUm93MmIgICAgICAgICAgICAgICBETiBEMTcuVTgKK2RSb3czYSAgICAgICAgICAgICAgIEROIEQxOC5VOAorZFJvdzNiICAgICAgICAgICAgICAgRE4gRDE5LlU4CisKK3FPdXRSb3cyICAgICAgICAgICAgIFFOIFExMS5VMTYKK3FPdXRSb3czICAgICAgICAgICAgIFFOIFExMi5VMTYKK2RPdXRSb3cyICAgICAgICAgICAgIEROIEQyMC5VOAorZE91dFJvdzMgICAgICAgICAgICAgRE4gRDIxLlU4CitkT3V0Um93MlU2NCAgICAgICAgICBETiBEMjAuVTY0CitkT3V0Um93M1U2NCAgICAgICAgICBETiBEMjEuVTY0CisKK3FPdXRSb3cwICAgICAgICAgICAgIFFOIFEyLlUxNgorcU91dFJvdzEgICAgICAgICAgICAgUU4gUTMuVTE2CitkT3V0Um93MCAgICAgICAgICAgICBETiBEOC5VOAorZE91dFJvdzEgICAgICAgICAgICAgRE4gRDkuVTgKKworZE91dFJvdzBVNjQgICAgICAgICAgRE4gRDguVTY0CitkT3V0Um93MVU2NCAgICAgICAgICBETiBEOS5VNjQKKworZE91dFJvdzBVMzIgICAgICAgICAgRE4gRDguVTMyCitkT3V0Um93MVUzMiAgICAgICAgICBETiBEOS5VMzIKKworZE91dFJvdzBVMTYgICAgICAgICAgRE4gRDguVTE2CitkT3V0Um93MVUxNiAgICAgICAgICBETiBEOS5VMTYKKworCitkT3V0MFU2NCAgICAgICAgICAgICBETiBEMC5VNjQKK2RPdXQxVTY0ICAgICAgICAgICAgIEROIEQxLlU2NAorCitkT3V0MDBVMzIgICAgICAgICAgICBETiBEMC5VMzIKK2RPdXQwMVUzMiAgICAgICAgICAgIEROIEQxLlUzMgorZE91dDEwVTMyICAgICAgICAgICAgRE4gRDIuVTMyCitkT3V0MTFVMzIgICAgICAgICAgICBETiBEMy5VMzIKKworZE91dDBVMTYgICAgICAgICAgICAgRE4gRDAuVTE2CitkT3V0MVUxNiAgICAgICAgICAgICBETiBEMS5VMTYKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0CisgICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAorICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFJEICAgZHgsIGR5LCBEeAorICAgICAgICBNX0xEUkQgICBpV2lkdGgsIGlIZWlnaHQsIFdpZHRoCisgICAgICAgIAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R4ID0gOCAtIGR4CisgICAgICAgIDsvLyBFaWdodE1pbnVzZHkgPSA4IC0gZHkKKyAgICAgICAgCisgICAgICAgIDsvLyBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHkKKyAgICAgICAgOy8vIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeQorICAgICAgICA7Ly8gRENvZWZmID0gZHggKiBkeQorICAgICAgICAKKyAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHgsIGR4LCAjOCAKKyAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHksIGR5LCAjOAorICAgICAgICBDTU4gICAgIGR4LGR5CisgICAgICAgIE1PViAgICAgU3RlcDEsICMxCisgICAgICAgIExEUkVRICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KKyAgICAgICAgU1VCICAgICBTcmNTdGVwTWludXMxLCBpU3JjU3RlcCwgU3RlcDEKKyAgICAgICAgTERSTkUgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybworICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICAgICAgICAgOy8vIDBhCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIEFDb2VmZiwgRWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHkKKyAgICAgICAgU01VTEJCICBCQ29lZmYsIGR4LCBFaWdodE1pbnVzZHkKKyAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICAgICAgICAgOy8vIDBiCisgICAgICAgIFNNVUxCQiAgQ0NvZWZmLCBFaWdodE1pbnVzZHgsIGR5CisgICAgICAgIFNNVUxCQiAgRENvZWZmLCBkeCwgZHkKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZEFDb2VmZiwgQUNvZWZmCisgICAgICAgIFZEVVAgICAgZEJDb2VmZiwgQkNvZWZmCisgICAgICAgIFZEVVAgICAgZENDb2VmZiwgQ0NvZWZmCisgICAgICAgIFZEVVAgICAgZERDb2VmZiwgRENvZWZmCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBjLCBbcFRhYmxlLCBpV2lkdGgsIExTTCAjMV0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGlXaWR0aAorICAgICAgICAKKzsvLyBQaXhlbCBsYXlvdXQ6Cis7Ly8KKzsvLyAgIHgwMCB4MDEgeDAyCis7Ly8gICB4MTAgeDExIHgxMgorOy8vICAgeDIwIHgyMSB4MjIKKworOy8vIElmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApCitXaWR0aElzOE1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDFhCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAxYgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMmEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDJiCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYSwgZFJvdzJhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAzYQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3cyYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWIsIGRSb3czYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2IsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gM2IKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDBhCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzNiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAwYgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3cwYiwgZERDb2VmZgorCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MiwgcU91dFJvdzIsICM2CisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MywgcU91dFJvdzMsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzJVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzNVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAorICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorCitXaWR0aElzNE1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorCitXaWR0aElzMk1WSXNOb3RaZXJvCisKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYSwgZFJvdzBhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzFiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFNVQlMgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cwYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcCAgCisKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc05vdFplcm8gCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCitXaWR0aElzOE1WSXNaZXJvCisgICAgICAgICAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBpU3JjU3RlcAorCitXaWR0aElzOExvb3BNVklzWmVybworICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TG9vcE1WSXNaZXJvCisKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXM0TVZJc1plcm8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzNE1WSXNaZXJvIAorICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKyAgICAgICAgICAgICAgICAKK1dpZHRoSXMyTVZJc1plcm8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MFUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVUxNlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzWmVybyAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBNX0VORAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFTkQKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2UyNjQyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKQEAgLTAsMCArMSw3NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIERlc2NyaXB0aW9uOgorOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisgICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIAorICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgorICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisgICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBFTkQKKyAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlOWMzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCkBAIC0wLDAgKzEsMTg2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworOy8vIAorOy8vIAorCisgICAgICAgIAorOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorICAgIAorCisKKworCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKworOy8vIEFSTSBSZWdpc3RlcnMKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERzdCAgICAgICAgICAgICAgICBSTiAgMAorcFNyYyAgICAgICAgICAgICAgICBSTiAgMQorCisKKzsvLyBOZW9uIFJlZ2lzdGVycworICAgICAgCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAorZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICAgICAgIAorZFplcm8gICAgICAgICAgICAgICBETiAgRDQuUzE2CitkZTAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RlMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGUyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZTMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RJbjFSUyAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZEluM1JTICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RmMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGYyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkZjMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FmMDEgICAgICAgICAgICAgICAgUU4gIFEwLjMyCitxZjIzICAgICAgICAgICAgICAgIFFOICBRMS4zMgorZGcwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZzEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RnMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGczICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjFSUyAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RmM1JTICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorCis7Ly8gT3V0cHV0IHBpeGVscworZGgwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkaDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RoMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGgzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LCAsZDgKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscyBpbiB0cmFuc3Bvc2VkIGZvcm0KKyAgICAgICAgCisgICAgICAgIFZMRDQgICAge2RJbjAsZEluMSxkSW4yLGRJbjN9LFtwU3JjXQorICAgICAgICAKKyAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRlMCxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZTEsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRJbjFSUyxkSW4xLGRaZXJvICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkSW4zUlMsZEluMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZTIsZEluMVJTLGRJbjMgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZTMsZEluMSxkSW4zUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkZjAsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkZjEsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkZjIsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkZjMsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZGYwLGRmMQorICAgICAgICBWVFJOICAgIGRmMixkZjMKKyAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgICAgZGgwLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMSwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDIsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgzLCM2CisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlNUMSAgIHtkaDAsZGgxLGRoMixkaDN9LFtwRHN0XQorICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKK0VuZCAgICAgICAgICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NvcnRleEE4ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzUyZTIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpAQCAtMCwwICsxLDkyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICAgICAgUk4gMCAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorcERzdCAgICAgICAgICAgIFJOIDEgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBWYXJpYWJsZXMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyYyAgICAgICAgICAgIFJOIDIgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGVzCitGbGFnICAgICAgICAgICAgUk4gMyAgICAKK1ZhbHVlICAgICAgICAgICBSTiA0ICAgIAorVmFsdWUyICAgICAgICAgIFJOIDUgICAgCitzdHJPZmZzZXQgICAgICAgUk4gNiAgICAKK2NzdE9mZnNldCAgICAgICBSTiA3ICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQsIHI3CisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsgRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIE1PViAgICAgIFZhbHVlMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorICAgICAgICAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzhdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNF0gID0gcERzdFs1XSAgPSBwRHN0WzZdICA9IHBEc3RbN10gID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMxNl0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzhdICA9IHBEc3RbOV0gID0gcERzdFsxMF0gPSBwRHN0WzExXSA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMjRdICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMl0gPSBwRHN0WzEzXSA9IHBEc3RbMTRdID0gcERzdFsxNV0gPSAwCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBUaGUgbG9vcCBiZWxvdyBwYXJzZXMgYW5kIHVucGFja3MgdGhlIGlucHV0IHN0cmVhbS4gVGhlIEMtbW9kZWwgaGFzIAorICAgICAgICA7Ly8gYSBzb21ld2hhdCBjb21wbGljYXRlZCBsb2dpYyBmb3Igc2lnbiBleHRlbnNpb24uICBCdXQgaW4gdGhlIHY2IHZlcnNpb24sCisgICAgICAgIDsvLyB0aGF0IGNhbiBiZSBlYXNpbHkgdGFrZW4gY2FyZSBieSBsb2FkaW5nIHRoZSBkYXRhIGZyb20gPHBTcmM+IHN0cmVhbSBhcyAKKyAgICAgICAgOy8vIFNJR05FRCBieXRlL2hhbGZ3b3JkLiBTbywgYmFzZWQgb24gdGhlIGZpcnN0IFRTVCBpbnN0cnVjdGlvbiwgOC1iaXRzIG9yIAorICAgICAgICA7Ly8gMTYtYml0cyBhcmUgcmVhZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBOZXh0LCB0byBjb21wdXRlIHRoZSBvZmZzZXQsIHdoZXJlIHRoZSB1bnBhY2tlZCB2YWx1ZSBuZWVkcyB0byBiZSBzdG9yZWQsCisgICAgICAgIDsvLyB3ZSBtb2RpZnkgdGhlIGNvbXB1dGF0aW9uIHRvIHBlcmZvcm0gWyhGbGFnICYgMTUpIDwgMV0gYXMgWyhGbGFnIDwgMSkgJiAzMV0KKyAgICAgICAgOy8vIFRoaXMgcmVzdWx0cyBpbiBhIHNhdmluZyBvZiBvbmUgY3ljbGUuCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyAgIAorICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKKyAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKKyAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQorICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+CisgICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCisgICAgICAgIAorICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwZDRkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKQEAgLTAsMCArMSw4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jaworICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KKyAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTkzNjVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDkxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sKKyAqKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgaW1hZ2Ugd2lkdGgKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCBob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IHZhbHVlcyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMgb3IgcEJTIGlzIE5VTEwuCisgKiAgICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCisuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKKwljb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlODcxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyByYXN0ZXIgc2NhbiBvcmRlciwgbmFtZWx5IHBvc2l0aW9uIG9yZGVyLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtCisgKgkJCQkJCQkJYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICoJCQkJCQkJCXBvaW50ZWQgdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzCisgKgkJCQkJCQkJaW4gdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAorICkKKworeworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDE3LCA0KTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjllNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAorICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAorICogb2YgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sKKyAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybworICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKKyAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCisgKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg1YTQ4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKQEAgLTAsMCArMSwzOTYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworICAgICAgICAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorCisKKworCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorICAgIAorOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIENvcnRleEE4CisgICAgCisKKzsvLyBBUk0gUmVnaXN0ZXJzCisKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgUk4gIDAKK3BQcmVkICAgICAgIFJOICAxCitwREMgICAgICAgICBSTiAgMgorcERzdCAgICAgICAgUk4gIDMKKyAgIAorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly9SZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKK3BRUGRpdiAgICAgIFJOICAxMAorcFFQbW9kICAgICAgUk4gIDExCitwVlJvdyAgICAgICBSTiAgMgorUVBtb2QgICAgICAgUk4gIDEyCitzaGlmdCAgICAgICBSTiAgMTQKK2luZGV4MCAgICAgIFJOICAxIAoraW5kZXgxICAgICAgUk4gIDEwIAorCis7Ly9SZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorcERlbHRhICAgICAgUk4gIDQKK3BEZWx0YVRtcCAgIFJOICA2CitBQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK3BQcmVkVGVtcCAgIFJOICA3CitwRENUZW1wICAgICBSTiAgOAorcERzdFRlbXAgICAgUk4gIDkKK3BEZWx0YUFyZzEgIFJOICAxCitwRGVsdGFBcmcwICBSTiAgMAorUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitEQ3ZhbCAgICAgICBSTiAgMTAgIAorcHJlZHN0ZXAgICAgUk4gIDEKK2RzdFN0ZXAgICAgIFJOICAxMAorUHJlZFZhbDEgICAgUk4gIDMKK1ByZWRWYWwyICAgIFJOICA1CisKKworCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCis7Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisKK2RWbWF0cml4ICAgICAgICAgICAgRE4gIEQ2LjggIAorZGluZGV4Um93MCAgICAgICAgICBETiAgRDcuMzIgCitkaW5kZXhSb3cxICAgICAgICAgIEROICBEOS4zMiAKK2RCeXRlSW5kZXhSb3cwICAgICAgRE4gIEQ3LjgKK2RCeXRlSW5kZXhSb3cxICAgICAgRE4gIEQ5LjgKK2RWUm93MCAgICAgICAgICAgICAgRE4gIEQ4LjggIAorZFZSb3cxICAgICAgICAgICAgICBETiAgRDQuOAorZFZSb3cwVTE2ICAgICAgICAgICBETiAgRDguVTE2CitkVlJvdzFVMTYgICAgICAgICAgIEROICBENC5VMTYKK2RWUm93MlUxNiAgICAgICAgICAgRE4gIEQ4LlUxNgorZFZSb3czVTE2ICAgICAgICAgICBETiAgRDQuVTE2CisKK2RTaGlmdCAgICAgICAgICAgICAgRE4gIEQ1LlUxNgorZFNyY1JvdzAgICAgICAgICAgICBETiAgRDAuSTE2CitkU3JjUm93MSAgICAgICAgICAgIEROICBEMS5JMTYKK2RTcmNSb3cyICAgICAgICAgICAgRE4gIEQyLkkxNiAgICAKK2RTcmNSb3czICAgICAgICAgICAgRE4gIEQzLkkxNgorZERxbnRSb3cwICAgICAgICAgICBETiAgRDAuSTE2ICAKK2REcW50Um93MSAgICAgICAgICAgRE4gIEQxLkkxNiAKK2REcW50Um93MiAgICAgICAgICAgRE4gIEQyLkkxNiAKK2REcW50Um93MyAgICAgICAgICAgRE4gIEQzLkkxNiAgCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBUcmFuc2Zvcm1SZXNpZHVhbDR4NAorCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAorZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxSW4wMSAgICAgICAgICAgICAgIFFOICBRMC4zMgorcUluMjMgICAgICAgICAgICAgICBRTiAgUTEuMzIKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCitkWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKK2RlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2CitkSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKK3FmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCitkZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2CisKKzsvLyBPdXRwdXQgcGl4ZWxzCitkaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYgCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorCitkRGVsdGFSb3cwICAgICAgICAgIEROICBEMC5TMTYKK2REZWx0YVJvdzEgICAgICAgICAgRE4gIEQxLlMxNgorZERlbHRhUm93MiAgICAgICAgICBETiAgRDIuUzE2CitkRGVsdGFSb3czICAgICAgICAgIEROICBEMy5TMTYKK3FEZWx0YVJvdzAxICAgICAgICAgUU4gIFEwLlMxNgorcURlbHRhUm93MjMgICAgICAgICBRTiAgUTEuUzE2CisKK2RQcmVkVmFsUm93MDEgICAgICAgRE4gIEQ0LlU4CitkUHJlZFZhbFJvdzIzICAgICAgIEROICBENS5VOAorCitxU3VtUm93MDEgICAgICAgICAgIFFOICBRMy5TMTYKK3FTdW1Sb3cyMyAgICAgICAgICAgUU4gIFE0LlMxNgorZERzdFJvdzAxICAgICAgICAgICBETiAgRDAuVTgKK2REc3RSb3cyMyAgICAgICAgICAgRE4gIEQxLlU4CitkRHN0Um93MCAgICAgICAgICAgIEROICBEMC4zMlswXQorZERzdFJvdzEgICAgICAgICAgICBETiAgRDAuMzJbMV0KK2REc3RSb3cyICAgICAgICAgICAgRE4gIEQxLjMyWzBdCitkRHN0Um93MyAgICAgICAgICAgIEROICBEMS4zMlsxXQorICAgIAorICAgICAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgorICAgICAgICAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEsZDkKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAorICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAorICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0CisgIAorICAgICAgICAKKyAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKKyAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKKyAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKKyAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQworICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgQUMsIzAKKyAgICAgICAgQkVRICAgICBEQ2Nhc2UKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQgOiBzdGF0aWMgZnVuY3Rpb24gaW5saW5lZAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKKyAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2CisgICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICBpbmRleDEsPTB4MDMwMjA1MDQgCisgICAgICAgIExEUiAgICBpbmRleDAsPTB4MDUwNDAxMDAgICAgICAgICAgICAgICAgICAgOy8vIEluZGV4ZXMgaW50byBkVm1hdHJpeAorICAgICAgICBBREQgICAgcFZSb3cscFZSb3csUVBtb2QKKyAgICAgICAgVkRVUCAgIGRpbmRleFJvdzAsaW5kZXgwIAorICAgICAgICBWRFVQICAgZGluZGV4Um93MSxpbmRleDEKKyAgICAgICAgVkRVUCAgIGRTaGlmdCxzaGlmdCAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFsbCA0eDQgcFZSb3dbXSB2YWx1ZXMKKyAgICAgICAgVkxEMSAgIGRWbWF0cml4LFtwVlJvd10gICAgICAgICAgICAgICAgICAgICA7Ly8gZFZtYXRyaXggPSBbMGR8MGN8MGJ8MGFdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlRCTCAgIGRWUm93MCxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MCAgICAgICA7Ly8gcm93MCA9IHJvdzIgPSBbcFZSb3dbMl0gfCBwVlJvd1swXSB8IHBWUm93WzJdIHwgcFZSb3dbMF1dCisgICAgICAgIFZUQkwgICBkVlJvdzEsZFZtYXRyaXgsZEJ5dGVJbmRleFJvdzEgICAgICAgOy8vIHJvdzEgPSByb3czID0gW3BWUm93WzFdIHwgcFZSb3dbMl0gfCBwVlJvd1sxXSB8IHBWUm93WzJdXQorICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgJ3NyYycgdmFsdWVzICAKKyAgICAgICAgVkxEMSAgIHsgZFNyY1JvdzAsZFNyY1JvdzEsZFNyY1JvdzIsZFNyY1JvdzMgfSxbcERlbHRhXSAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICBkVlJvdzBVMTYsZFZSb3cwVTE2LGRTaGlmdCAKKyAgICAgICAgVlNITCAgIGRWUm93MVUxNixkVlJvdzFVMTYsZFNoaWZ0IAorICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBseSBzcmNbXSB3aXRoIHBWUm93W10KKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzAsZFNyY1JvdzAsZFZSb3cwVTE2CisgICAgICAgIFZNVUwgICAgZERxbnRSb3cxLGRTcmNSb3cxLGRWUm93MVUxNgorICAgICAgICBWTVVMICAgIGREcW50Um93MixkU3JjUm93MixkVlJvdzJVMTYKKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzMsZFNyY1JvdzMsZFZSb3czVTE2CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRyYW5zZm9ybVJlc2lkdWFsNHg0IDogSW5saW5lZCB0byBhdm9pZCBMb2FkL1N0b3JlcworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIDsvL1NUUkhORSAgREN2YWwsW3BEZWx0YV0KKyAgICAgICAgVk1PVk5FICAgIGRJbjBbMF0sREN2YWwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgaW5wdXQgcGl4ZWxzIDogcGVyZm9ybSBSb3cgb3BzIGFzIENvbCBvcHMKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZEluMCxkSW4xCisgICAgICAgIFZUUk4gICAgZEluMixkSW4zCisgICAgICAgIFZUUk4gICAgcUluMDEscUluMjMgCisgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZGYwLGRmMQorICAgICAgICBWVFJOICAgIGRmMixkZjMKKyAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCisgICAgICAgIAorCitEQ2Nhc2UKKyAgICAgICAgOy8vIENhbGN1bGF0ZSB0aGUgVHJhbnNmb3JtZWQgREN2YWx1ZSA6IChEQ3ZhbCszMik+PjYKKyAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCisgICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAorICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2CisgICAgICAgIAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzAsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKKyAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cxLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzIsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs4XSAgPSBwRGVsdGFbOV0gID0gcERlbHRhWzEwXSA9IHBEZWx0YVsxMV0gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzMsIERDdmFsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKK091dERDY2FzZSAgICAgIAorICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjaworICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MDEsUHJlZFZhbDEsUHJlZFZhbDIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXQorICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MjMsUHJlZFZhbDEsUHJlZFZhbDIKKyAKKyAgICAgICAgCisgICAgICAgIFZBRERXICAgcVN1bVJvdzAxLHFEZWx0YVJvdzAxLGRQcmVkVmFsUm93MDEKKyAgICAgICAgVkFERFcgICBxU3VtUm93MjMscURlbHRhUm93MjMsZFByZWRWYWxSb3cyMworICAgICAgICBWUU1PVlVOIGREc3RSb3cwMSxxU3VtUm93MDEKKyAgICAgICAgVlFNT1ZVTiBkRHN0Um93MjMscVN1bVJvdzIzCisgICAgICAgIAorIAorICAgICAgICBWU1QxICAgIGREc3RSb3cwLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3cxLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3cyLFtwRHN0VGVtcF0sZHN0U3RlcAorICAgICAgICBWU1QxICAgIGREc3RSb3czLFtwRHN0VGVtcF0KKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKKyAgICAKKyAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDIwMiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElGIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICAgICAgCitMT09QX0NPVU5UICBFUVUgMHg0MDAwMDAwMAorTUFTS18zICAgICAgRVFVIDB4MDMwMzAzMDMKK01BU0tfNCAgICAgIEVRVSAweDA0MDQwNDA0CisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzMyMTAgICAgICBSTiA2CisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA3CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCitxQlMzMjEwICAgICBRTiBRMTMuVTE2CitkQlMzMjEwICAgICBETiBEMjYKK2RNYXNrX2JzICAgIEROIEQyNworZEZpbHRfYnMgICAgRE4gRDI2LlUxNgorCis7Ly8gYlNMVDQKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorZE1hc2tfNCAgICAgRE4gRDEuVTE2CisKK01hc2tfNCAgICAgIFJOIDgKK01hc2tfMyAgICAgIFJOIDkKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBSZXN1bHQKK2RQXzB0ICAgICAgIEROIEQxMy5VOCAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFFfMG4gICAgICAgRE4gRDI0LlU4CisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByOSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEgOz8KKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTERSICAgICAgICAgTWFza18zLCA9TUFTS18zCisgICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAorICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKworICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKyAgICAgICAgVk1PVi5VMzIgICAgZEJTMzIxMFswXSwgYlMzMjEwCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKyAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAgCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4CisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgICAgIAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfNCAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZUU1QgICAgICAgIGRGaWx0X2JzLCBkRmlsdF9icywgZE1hc2tfNAorCisgICAgICAgIDsvLyBiUyA9PSA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKKyAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icworICAgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorTm9GaWx0ZXJCUzAKKworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNmMxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwyODIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgICAgICAKK0xPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCitNQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMworTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKK3BTcmNEc3RfUCAgIFJOIDEwCitwU3JjRHN0X1EgICBSTiAxMgorCitwVG1wICAgICAgICBSTiAxMAorcFRtcDIgICAgICAgUk4gMTIKK3N0ZXAgICAgICAgIFJOIDE0CisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA3CisKKzsvLyBSb3dzIGlucHV0CitkUm93MCAgICAgICBETiBENy5VOAorZFJvdzEgICAgICAgRE4gRDguVTggIAorZFJvdzIgICAgICAgRE4gRDUuVTggIAorZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKK2RSb3c0ICAgICAgIEROIEQ2LlU4ICAKK2RSb3c1ICAgICAgIEROIEQ5LlU4ICAKK2RSb3c2ICAgICAgIEROIEQ0LlU4IAorZFJvdzcgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCitxQlMzMjEwICAgICBRTiBRMTMuVTE2CitkQlMzMjEwICAgICBETiBEMjYKK2RNYXNrX2JzICAgIEROIEQyNworZEZpbHRfYnMgICAgRE4gRDI2LlUxNgorCis7Ly8gYlNMVDQKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorZE1hc2tfNCAgICAgRE4gRDEuVTE2CisKK01hc2tfNCAgICAgIFJOIDgKK01hc2tfMyAgICAgIFJOIDkKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBSZXN1bHQKK2RQXzB0ICAgICAgIEROIEQxMy5VOCAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFFfMG4gICAgICAgRE4gRDI0LlU4CisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTIsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAorICAgICAgICBNX0FSRyAgIHBwQlMsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBkMC1kQWxwaGFfMAorICAgICAgICA7Ly8gZDItZEJldGFfMAorCisgICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAorICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKKworICAgICAgICA7ZE1hc2tfMC0xNAorICAgICAgICA7ZE1hc2tfMS0xNQorICAgICAgICA7ZE1hc2tfNC0xOQorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKKworCitMb29wWSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4CisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBzdGVwCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KKyAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KKyAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KKyAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KKyAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KKyAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KKyAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KKyAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KKworICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQorICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQorICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKKworICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgorICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKKworICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NworICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKKworCisgICAgICAgIDtSZWFsaWduIHRoZSBwb2ludGVycworCisgICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKworICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKyAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorCisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180CisKKyAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKKyAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icworCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1AsIHBTcmNEc3QsICMzCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFRtcDIsIHBTcmNEc3RfUCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzBdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzFdfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMl19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bM119LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls0XX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls1XX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzZdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzddfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9RLCBwU3JjRHN0LCAjNAorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0X1EsIHNyY2RzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblswXX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsxXX0sIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMl19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bM119LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzRdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzVdfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls2XX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls3XX0sIFtwVG1wXSwgc3RlcAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKworICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK05vRmlsdGVyQlMwCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYKKworCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjM2Y0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDI4OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIElGIENvcnRleEE4CisKK0xPT1BfQ09VTlQgIEVRVSAweDU1MDAwMDAwCisKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMTAgICAgICAgIFJOIDEyCisKK3BBbHBoYV8wICAgIFJOIDIKK3BCZXRhXzAgICAgIFJOIDMKKworcEFscGhhXzEgICAgUk4gNworcEJldGFfMSAgICAgUk4gOAorCisKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDkKKworcFRtcCAgICAgICAgUk4gNgorc3RlcCAgICAgICAgUk4gMTAKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworOy8vIGJTTFQ0CitkVEMwICAgICAgICBETiBEMTguVTggICAKK2RUQzEgICAgICAgIEROIEQxOS5VOCAgIAorZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCisKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorCitNYXNrXzAgICAgICBSTiAxMQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK2RScDBxMCAgICAgIEROIEQyNC5VOAorCitkTWF4UCAgICAgICBETiBEMjMuVTgKK2RNaW5QICAgICAgIEROIEQyMi5VOAorCitkTWF4USAgICAgICBETiBEMTkuVTgKK2RNaW5RICAgICAgIEROIEQyMS5VOAorCitkRGVsdGFQICAgICBETiBEMjYuVTgKK2REZWx0YVEgICAgIEROIEQyNy5VOAorCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFFfMW4gICAgICAgRE4gRDI1LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorCis7Ly8gYlNHRTQKKworcVNwMHEwICAgICAgUU4gUTEwLlUxNgorCitxU3AycTEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBwMSAgICBRTiBRMTIuVTE2CitxU3AzcDIgICAgICBRTiBRMTMuVTE2CitkSFNwMHExICAgICBETiBEMjguVTgKKworcVNxMnAxICAgICAgUU4gUTExLlUxNgorcVNwMHEwcTEgICAgUU4gUTEyLlUxNgorcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCitkSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKKworcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKK3FUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCisKK2RQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CitkUF8ybiAgICAgICBETiBEMzEuVTgKKworZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQorICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKKworICAgICAgICA7ZE1hc2tfMC0xNAorICAgICAgICA7ZE1hc2tfMS0xNQorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorCisgICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCisKKyAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKKyAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCitMb29wWSAgICAgICAgCitMb29wWCAgICAgICAgCisgICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjMgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMywgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzAsIGRQXzEKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BUbXBdCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFFfMCwgZFBfMAorICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWTEQxICAgICAgICBkUV8zLCBbcFNyY0RzdF0KKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorICAgIAorICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCitiU0xUNAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAorCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCisKK05vRmlsdGVyQlMwCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM4CisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBCQ0MgICAgICAgICBMb29wWAorICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIFZTVDEgICAgICAgIGRQXzJuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCisgICAgICAgIFZTVDEgICAgICAgIGRRXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBWU1QxICAgICAgICBkUV8ybiwgW3BTcmNEc3RdCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAorICAgICAgICBCQ0MgICAgICAgICBMb29wWAorCitFeGl0TG9vcFkgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMiAKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRgorICAgIAorCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2ZmJiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDQzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKworTE9PUF9DT1VOVCAgRVFVIDB4MTEwMDAwMDAKKworCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMxMCAgICAgICAgUk4gMTIKKworcEFscGhhXzAgICAgUk4gMgorcEJldGFfMCAgICAgUk4gMworCitwQWxwaGFfMSAgICBSTiA3CitwQmV0YV8xICAgICBSTiA4CisKK3BUbXAgICAgICAgIFJOIDEwCitwVG1wU3RlcCAgICBSTiAxMQorCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gOQorCis7Ly8gUm93cyBpbnB1dAorZFJvdzAgICAgICAgRE4gRDcuVTgKK2RSb3cxICAgICAgIEROIEQ4LlU4ICAKK2RSb3cyICAgICAgIEROIEQ1LlU4ICAKK2RSb3czICAgICAgIEROIEQxMC5VOCAgCitkUm93NCAgICAgICBETiBENi5VOCAgCitkUm93NSAgICAgICBETiBEOS5VOCAgCitkUm93NiAgICAgICBETiBENC5VOCAKK2RSb3c3ICAgICAgIEROIEQxMS5VOCAKKworOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgorOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMworCis7Ly8gUm93cyBvdXRwdXQKK2RSb3duMCAgICAgIEROIEQ3LlU4CitkUm93bjEgICAgICBETiBEMjQuVTgKK2RSb3duMiAgICAgIEROIEQzMC5VOAorZFJvd24zICAgICAgRE4gRDEwLlU4CitkUm93bjQgICAgICBETiBENi5VOAorZFJvd241ICAgICAgRE4gRDI1LlU4CitkUm93bjYgICAgICBETiBEMjkuVTgKK2RSb3duNyAgICAgIEROIEQxMS5VOAorCis7Ly8gZFBfMG4gICAgICAgRE4gRDI5LlU4Cis7Ly8gZFBfMW4gICAgICAgRE4gRDMwLlU4Cis7Ly8gZFBfMm4gICAgICAgRE4gRDMxLlU4Cis7Ly8gCis7Ly8gZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKKzsvLyBkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorOy8vIGRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCis7Ly8gCis7Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCis7Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKKzsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KKzsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMworCitkUm93MG4gICAgICBETiBENy5VOAorZFJvdzFuICAgICAgRE4gRDI0LlU4CitkUm93Mm4gICAgICBETiBEMzAuVTgKK2RSb3czbiAgICAgIEROIEQyOC5VOAorZFJvdzRuICAgICAgRE4gRDMxLlU4CitkUm93NW4gICAgICBETiBEMjUuVTgKK2RSb3c2biAgICAgIEROIEQyOS5VOAorZFJvdzduICAgICAgRE4gRDExLlU4CisKKzsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCis7Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworTWFza18wICAgICAgUk4gNgorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK2RScDBxMCAgICAgIEROIEQyNC5VOAorCitkTWF4UCAgICAgICBETiBEMjMuVTgKK2RNaW5QICAgICAgIEROIEQyMi5VOAorCitkTWF4USAgICAgICBETiBEMTkuVTgKK2RNaW5RICAgICAgIEROIEQyMS5VOAorCitkRGVsdGFQICAgICBETiBEMjYuVTgKK2REZWx0YVEgICAgIEROIEQyNy5VOAorCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFFfMW4gICAgICAgRE4gRDI1LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorCis7Ly8gYlNHRTQKKworcVNwMHEwICAgICAgUU4gUTEwLlUxNgorCitxU3AycTEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBwMSAgICBRTiBRMTIuVTE2CitxU3AzcDIgICAgICBRTiBRMTMuVTE2CitkSFNwMHExICAgICBETiBEMjguVTgKKworcVNxMnAxICAgICAgUU4gUTExLlUxNgorcVNwMHEwcTEgICAgUU4gUTEyLlUxNgorcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCitkSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKKworcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKK3FUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCisKK2RQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CitkUF8ybiAgICAgICBETiBEMzEuVTgKKworZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQorICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAorCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisKKyAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKKyAgICAKKyAgICAgICAgQUREICAgICAgICAgcFRtcFN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKK0xvb3BYICAgICAgICAKKyAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICM0CisKKyAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICA7Ly8gTG9hZCA4IHJvd3Mgb2YgZGF0YQorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQorICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1CisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cxLCBkUm93MworICAgIAorCisgICAgICAgIDsvLyBkUm93MCA9IFtxM3IwIHEycjAgcTFyMCBxMHIwIHAwcjAgcDFyMCBwMnIwIHAzcjBdCisgICAgICAgIDsvLyBkUm93MSA9IFtxM3IxIHEycjEgcTFyMSBxMHIxIHAwcjEgcDFyMSBwMnIxIHAzcjFdCisgICAgICAgIDsvLyBkUm93MiA9IFtxM3IyIHEycjIgcTFyMiBxMHIyIHAwcjIgcDFyMiBwMnIyIHAzcjJdCisgICAgICAgIDsvLyBkUm93MyA9IFtxM3IzIHEycjMgcTFyMyBxMHIzIHAwcjMgcDFyMyBwMnIzIHAzcjNdCisgICAgICAgIDsvLyBkUm93NCA9IFtxM3I0IHEycjQgcTFyNCBxMHI0IHAwcjQgcDFyNCBwMnI0IHAzcjRdCisgICAgICAgIDsvLyBkUm93NSA9IFtxM3I1IHEycjUgcTFyNSBxMHI1IHAwcjUgcDFyNSBwMnI1IHAzcjVdCisgICAgICAgIDsvLyBkUm93NiA9IFtxM3I2IHEycjYgcTFyNiBxMHI2IHAwcjYgcDFyNiBwMnI2IHAzcjZdCisgICAgICAgIDsvLyBkUm93NyA9IFtxM3I3IHEycjcgcTFyNyBxMHI3IHAwcjcgcDFyNyBwMnI3IHAzcjddCisKKyAgICAgICAgOy8vIDh4OCBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzAsIGRSb3cyCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NworICAgICAgICAKKworICAgICAgICBWWklQLjE2ICAgICBkUm93NCwgZFJvdzYKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzEsIGRSb3c1CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cyLCBkUm93NgorICAgICAgICBWWklQLjMyICAgICBkUm93MywgZFJvdzcKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzAsIGRSb3c0CisgICAgICAgIAorCisgICAgICAgIDsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKKyAgICAgICAgOy8vIGRSb3c0IC0gZFBfMiwgZFJvdzUgLSBkUV8xLCBkUm93NiAtIGRQXzAsIGRSb3c3IC0gZFFfMworCisgICAgICAgIDsvLyBkUV8wID0gW3EwcjcgcTByNiBxMHI1IHEwcjQgcTByMyBxMHIyIHEwcjEgcTByMF0KKyAgICAgICAgOy8vIGRRXzEgPSBbcTFyNyBxMXI2IHExcjUgcTFyNCBxMXIzIHExcjIgcTFyMSBxMXIwXQorICAgICAgICA7Ly8gZFFfMiA9IFtxMnI3IHEycjYgcTJyNSBxMnI0IHEycjMgcTJyMiBxMnIxIHEycjBdCisgICAgICAgIDsvLyBkUV8zID0gW3EzcjcgcTNyNiBxM3I1IHEzcjQgcTNyMyBxM3IyIHEzcjEgcTNyMF0KKworICAgICAgICA7Ly8gZFBfMCA9IFtwMHI3IHAwcjYgcDByNSBwMHI0IHAwcjMgcDByMiBwMHIxIHAwcjBdCisgICAgICAgIDsvLyBkUF8xID0gW3AxcjcgcDFyNiBwMXI1IHAxcjQgcDFyMyBwMXIyIHAxcjEgcDFyMF0KKyAgICAgICAgOy8vIGRQXzIgPSBbcDJyNyBwMnI2IHAycjUgcDJyNCBwMnIzIHAycjIgcDJyMSBwMnIwXQorICAgICAgICA7Ly8gZFBfMyA9IFtwM3I3IHAzcjYgcDNyNSBwM3I0IHAzcjMgcDNyMiBwM3IxIHAzcjBdCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAorCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMF0sIE1hc2tfMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZjAwCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzFdLCBNYXNrXzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorICAgIAorICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCitiU0xUNAorICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICA7Ly8gVHJhbnNwb3NlCisKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzIgIAorICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzIsICBkUV8zCisKKyAgICAgICAgCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8yCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzIsICBkUF8wbgorCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgorICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMgorICAgICAgICBWWklQLjMyICAgICBkUF8yLCAgZFFfMW4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKKworICAgICAgICA7Ly8gZFJvd24wIC0gZFBfMywgIGRSb3duMSAtIGRRXzBuCisgICAgICAgIDsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgorICAgICAgICA7Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCisgICAgICAgIDsvLyBkUm93bjYgLSBkUF8wbiwgZFJvd243IC0gZFFfMworCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjEsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24yLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICA7MQorICAgICAgICBWU1QxICAgICAgICBkUm93bjQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd241LCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd242LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd243LCBbcFRtcF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCisKK05vRmlsdGVyQlMwCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZworICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMm4gICAKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgorICAgICAgICBWWklQLjggICAgICBkUV8ybiwgZFFfMworCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzMsICBkUF8xbgorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzBuLCBkUV8ybgorICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMworICAgICAgICBWWklQLjE2ICAgICBkUF8ybiwgZFBfMG4KKworICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzJuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzJuLCBkUV8xbgorICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMworCisgICAgICAgIDsvLyBkUm93MG4gLSBkUF8zLCBkUm93MW4gLSBkUV8wbiwgZFJvdzJuIC0gZFBfMW4sIGRSb3czbiAtIGRRXzJuCisgICAgICAgIDsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgICAgIGRSb3cwbiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93MW4sIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzJuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3czbiwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93NG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzVuLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCisgICAgICAgIFZTVDEgICAgICAgIGRSb3c2biwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZTVDEgICAgICAgIGRSb3c3biwgW3BUbXBdLCBwVG1wU3RlcAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKworRXhpdExvb3BZICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcEJTLCBwQlMsICMxNAorICAgICAgICBTVUIgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxNAorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjMTYKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMgCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdCisgICAgICAgIEJORSAgICAgICAgIExvb3BZCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjZTQxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKyAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCisgKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KKyAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgorICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKKyAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KKyAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KKyAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCisgICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQyZWJjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCkBAIC0wLDAgKzEsNTUzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKKzsvLworOy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSBpbiB2NiBhc3NlbWJseS4KKzsvLyBQZXJmb3JtcyBxdWFydGVyIHBlbCBpbnRlcnBvbGF0aW9uIG9mIGludGVyIGx1bWEgTUIuCis7Ly8gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorOy8vIFBhcmFtZXRlcnM6Cis7Ly8gW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgorOy8vIFtpbl0gICAgc3JjU3RlcCAgICAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorOy8vIFtpbl0gICAgZHN0U3RlcCAgICAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aAorOy8vIFtpbl0gICAgZHggICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvcgorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCis7Ly8gW2luXSAgICBkeSAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvcgorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCis7Ly8gW2luXSAgICByb2kgICAgICAgICBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Cis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LgorOy8vIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLworOy8vIFJldHVybiBWYWx1ZToKKzsvLyBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCis7Ly8gSXQgaXMgYXNzdWVkIHRoYXQgZm9sbG93aW5nIGNhc2VzIGFyZSBzYXRpc2ZpZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjoKKzsvLyAgcFNyYyBvciBwRHN0IGlzIG5vdCBOVUxMLgorOy8vICBzcmNTdGVwIG9yIGRzdFN0ZXAgPj0gcm9pLndpZHRoLgorOy8vICAgICBkeCBvciBkeSBpcyBpbiB0aGUgcmFuZ2UgWzAtM10uCis7Ly8gICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG5vdCBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIERzdCBpcyA0IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIHBEc3QgaXMgOCBieXRlIGFsaWduZWQuCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byAxNiwgcERzdCBpcyAxNiBieXRlIGFsaWduZWQuCis7Ly8gICAgIHNyY1N0ZXAgYW5kIGRzdFN0ZXAgaXMgbXVsdGlwbGUgb2YgOC4KKzsvLworOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgICAgICAKKworICAgIElGIENvcnRleEE4CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgRU5ESUYKKyAgICAKKyAgICAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworaUhlaWdodCAgICAgICAgIFJOIDQKK2lXaWR0aCAgICAgICAgICBSTiA1CisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKKworICAgIElGIENvcnRleEE4CisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KKyAgICAgICAgOy8vCisgICAgICAgIE1fQUxMT0M0ICAgIHBwQXJncywgMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExLCBkMTUKKworcFNyY0JLICAgICAgICAgIFJOIDgKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCitkU3JjMGMgICAgICAgICAgRE4gMTQuVTgKK2RTcmMxYyAgICAgICAgICBETiAxNi5VOAorZFNyYzJjICAgICAgICAgIEROIDE4LlU4CitkU3JjM2MgICAgICAgICAgRE4gMjAuVTggICAgICAgICAgICAgICAgICAgCitkU3JjMGQgICAgICAgICAgRE4gMTUuVTgKK2RTcmMxZCAgICAgICAgICBETiAxNy5VOAorZFNyYzJkICAgICAgICAgIEROIDE5LlU4CitkU3JjM2QgICAgICAgICAgRE4gMjEuVTgKK2RBY2NIMCAgICAgICAgICBETiAyMi5VOAorZEFjY0gxICAgICAgICAgIEROIDI0LlU4CitkQWNjSDIgICAgICAgICAgRE4gMjYuVTgKK2RBY2NIMyAgICAgICAgICBETiAyOC5VOAorZFJlc3VsdEgwICAgICAgIEROIDIyLlUzMgorZFJlc3VsdEgxICAgICAgIEROIDI0LlUzMgorZFJlc3VsdEgyICAgICAgIEROIDI2LlUzMgorZFJlc3VsdEgzICAgICAgIEROIDI4LlUzMgorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitkU3JjMCAgICAgICAgICAgRE4gOS5VOAorZFNyYzEgICAgICAgICAgIEROIDEwLlU4CitkU3JjMiAgICAgICAgICAgRE4gMTEuVTgKK2RTcmMzICAgICAgICAgICBETiAxMi5VOAorZFNyYzQgICAgICAgICAgIEROIDEzLlU4CitkQWNjVjAgICAgICAgICAgRE4gMC5VOAorZEFjY1YxICAgICAgICAgIEROIDIuVTgKK2RBY2NWMiAgICAgICAgICBETiA0LlU4CitkQWNjVjMgICAgICAgICAgRE4gNi5VOAorZFJlc3VsdFYwICAgICAgIEROIDAuVTMyCitkUmVzdWx0VjEgICAgICAgRE4gMi5VMzIKK2RSZXN1bHRWMiAgICAgICBETiA0LlUzMgorZFJlc3VsdFYzICAgICAgIEROIDYuVTMyCisgICAgICAgIAorOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgRGlhZ29uYWwgaW50ZXJwb2xhdGlvbgorZFRBY2MwICAgICAgICAgIEROIDAuVTgKK2RUQWNjMSAgICAgICAgICBETiAyLlU4CitkVEFjYzIgICAgICAgICAgRE4gNC5VOAorZFRBY2MzICAgICAgICAgIEROIDYuVTgKK2RUUmVzMCAgICAgICAgICBETiAwLjMyCitkVFJlczEgICAgICAgICAgRE4gMi4zMgorZFRSZXMyICAgICAgICAgIEROIDQuMzIKK2RUUmVzMyAgICAgICAgICBETiA2LjMyCitkVFJlc3VsdDAgICAgICAgRE4gMTQuVTgKK2RUUmVzdWx0MSAgICAgICBETiAxNi5VOAorZFRSZXN1bHQyICAgICAgIEROIDE4LlU4CitkVFJlc3VsdDMgICAgICAgRE4gMjAuVTgKK2RUZW1wUDAgICAgICAgICBETiAxOC5TMTYKK2RUZW1wUDEgICAgICAgICBETiAxOS5TMTYKK2RUZW1wUTAgICAgICAgICBETiAyMC5TMTYKK2RUZW1wUTEgICAgICAgICBETiAyMS5TMTYKK2RUZW1wUjAgICAgICAgICBETiAyMi5TMTYKK2RUZW1wUjEgICAgICAgICBETiAyMy5TMTYKK2RUZW1wUzAgICAgICAgICBETiAyNC5TMTYKK2RUZW1wUzEgICAgICAgICBETiAyNS5TMTYKK3FUZW1wUDAxICAgICAgICBRTiA5LlMxNgorcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgorcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgorcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgorCis7Ly8gSW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IgYXZlcmFnaW5nCitxUmVzMiAgICAgICAgICAgUU4gNy5TMTYKK3FSZXMzICAgICAgICAgICBRTiA4LlMxNgorcVJlczQgICAgICAgICAgIFFOIDkuUzE2CitxUmVzNSAgICAgICAgICAgUU4gMTAuUzE2CitxUmVzNiAgICAgICAgICAgUU4gMTEuUzE2CisgICAgICAgCis7Ly8gRm9yIGltcGxlbWVudGluZyBjb3B5CitkRHN0MCAgICAgICAgICAgIEROIDkuMzIKK2REc3QxICAgICAgICAgICAgRE4gMTAuMzIKK2REc3QyICAgICAgICAgICAgRE4gMTEuMzIKK2REc3QzICAgICAgICAgICAgRE4gMTIuMzIKKworICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICAgICBwdHJpZHgsIDQKKyAgICAgICAgTV9BUkcgICAgICAgcHRyaWR5LCA0ICAgICAgICAKKyAgICAgICAgTV9BUkcgICAgICAgcHRyV2lkdGgsIDQKKyAgICAgICAgTV9BUkcgICAgICAgcHRySGVpZ2h0LCA0ICAgICAgICAKKworICAgICAgICA7Ly8gTG9hZCBzdHJ1Y3R1cmUgZWxlbWVudHMgb2Ygcm9pIAorICAgICAgICBNX0xEUiAgICAgICBpZHgsIHB0cmlkeAorICAgICAgICBNX0xEUiAgICAgICBpZHksIHB0cmlkeQorICAgICAgICBNX0xEUiAgICAgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fTERSICAgICAgIGlIZWlnaHQsIHB0ckhlaWdodAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIE1vdmUgY29lZmZpY2llbnRzIE5lb24gcmVnaXN0ZXJzCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0Jsb2NrNHg0V2lkdGhMb29wCitCbG9jazR4NEhlaWdodExvb3AKKworICAgICAgICBTVE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBzd2l0Y2ggdGFibGUgdXNpbmcgbW90aW9uIHZlY3RvciBhcyBpbmRleAorICAgICAgICBBREQgICAgICAgICBwYywgcGMsIGluZGV4LCBMU0wgIzIKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9mCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfMyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfNyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfOCAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfOSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYiAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfYyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZAorICAgICAgICBCICAgICAgICAgICBDYXNlX2UgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2YKKyAgICAgICAgICAgICAgICAgICAgCitDYXNlXzAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBDYXNlIEcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkcyBhIDR4NCBibG9jayBvZiAuOCBhbmQgc3RvcmVzIGFzIC4zMgorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEgCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzIsIFtUZW1wXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZERzdDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkRHN0MlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGREc3QxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZERzdDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV8xCisgICAgICAgIDsvLyBDYXNlIGEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMSBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkU3JjMGMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRTcmMyYworICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZFNyYzFjCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkU3JjM2MKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzIKKyAgICAgICAgOy8vIENhc2UgYgorICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzMKKyAgICAgICAgOy8vIENhc2UgYworICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwZAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJkCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWQKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzZAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNAorICAgICAgICA7Ly8gQ2FzZSBkCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDQgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMgorICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmMzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV81CisgICAgICAgIDsvLyBDYXNlIGUKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV82CisgICAgICAgIDsvLyBDYXNlIGYKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVJlczIsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxUmVzMywgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFSZXM0LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVJlczUsICM1ICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNworICAgICAgICA7Ly8gQ2FzZSBnCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfOAorICAgICAgICA7Ly8gQ2FzZSBoCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDggXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV85CisgICAgICAgIDsvLyBDYXNlIGkKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOSBcbiIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBWRVhUICAgICAgICBkVGVtcFAwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFEwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcFMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgorICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxVGVtcFAwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFUZW1wUTAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVRlbXBSMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxVGVtcFMwMSwgIzUgICAgICAgIAorCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2EKKyAgICAgICAgOy8vIENhc2UgagorICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2IKKyAgICAgICAgOy8vIENhc2UgaworICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYworICAgICAgICA7Ly8gQ2FzZSBuCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMworICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmM0CisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZAorICAgICAgICA7Ly8gQ2FzZSBwCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9lCisgICAgICAgIDsvLyBDYXNlIHEKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMywgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXM0LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczUsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNiwgIzUgICAgICAgIAorCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2YKKyAgICAgICAgOy8vIENhc2UgcgorICAgICAgICBNX1BSSU5URiAiQ2FzZSBmIFxuIgorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworCisKK0Jsb2NrNHg0TG9vcEVuZAorCisgICAgICAgIDsvLyBXaWR0aCBMb29wCisgICAgICAgIDsvL01fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCisgICAgICAgIFNVQlMgICAgICAgIGlXaWR0aCwgaVdpZHRoLCAjNAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjNAorICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NFdpZHRoTG9vcAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIEhlaWdodCBMb29wCisgICAgICAgIFNVQlMgICAgICAgIGlIZWlnaHQsIGlIZWlnaHQsICM0CisgICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAorICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBpV2lkdGgKKyAgICAgICAgQkdUICAgICAgICAgQmxvY2s0eDRIZWlnaHRMb29wCisKK0VuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBNT1YgICAgICAgICByMCwgIzAKKyAgICAgICAgTV9FTkQgICAgICAgCisKKyAgICBFTkRJRiAgCisgICAgICAgIDsvLyBFbmQgb2YgQ29ydGV4QTgKKyAgICAgICAgICAgICAgICAgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E2MDcwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpAQCAtMCwwICsxLDQzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAorICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAorICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQorICAgIERDVyAgIDMsIDIsIDEsNCAKKyAgICBEQ1cgIC0zLC0yLC0xLDAKKyAgICBEQ1cgICAxLCAyLCAzLDQKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorcmV0dXJuICAgICAgICAgIFJOIDAgIAorcFRhYmxlICAgICAgICAgIFJOIDggCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBJbnB1dCBBcmd1bWVudHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcE11bHRpcGxpZXJUYWJsZSAgICBSTiAgMiAgICAgCisKK3BUbXAgICAgICAgICAgICBSTiA5CitzdGVwICAgICAgICAgICAgUk4gMTAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gTmVvbiBSZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8gT01YX1ZDX0NIUk9NQV9IT1IKKworZExlZnRWYWwwICAgICAgIEROICBEMC44CitkTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKK2RMZWZ0VmFsMiAgICAgICBETiAgRDIuOAorZExlZnRWYWwzICAgICAgIEROICBEMy44CitkTGVmdFZhbDQgICAgICAgRE4gIEQ0LjgKK2RMZWZ0VmFsNSAgICAgICBETiAgRDUuOAorZExlZnRWYWw2ICAgICAgIEROICBENi44CitkTGVmdFZhbDcgICAgICAgRE4gIEQ3LjgKKworOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAorCitkQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4CisKKzsvLyBPTVhfVkNfQ0hST01BX0RDCisKK2RMZWZ0VmFsICAgICAgICBETiAgRDEuVTgKK2RTdW1BYm92ZVZhbFUxNiBETiAgRDIuVTE2CitkU3VtQWJvdmVWYWxVMzIgRE4gIEQzLlUzMgorZFN1bUFib3ZlVmFsVTggIEROICBEMy5VOAorZFN1bUxlZnRWYWxVMTYgIEROICBEMi5VMTYKK2RTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCitkU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4CitkU3VtQWJvdmVMZWZ0ICAgRE4gIEQyLlUzMgorZFN1bUFib3ZlTGVmdFU4IEROICBEMi5VOAorZEluZGV4Um93MFU4ICAgIEROICBENS5VOAorZEluZGV4Um93MCAgICAgIEROICBENS5VNjQKK2RJbmRleFJvdzRVOCAgICBETiAgRDYuVTgKK2RJbmRleFJvdzQgICAgICBETiAgRDYuVTY0CitkRHN0Um93MCAgICAgICAgRE4gIEQwLlU4CitkRHN0Um93NCAgICAgICAgRE4gIEQ0LlU4CitkQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4CisKKzsvLyBPTVhfVkNfQ0hST01BX1BMQU5FCisKK2RSZXZBYm92ZVZhbCAgICBETiAgRDMuVTggIAorZFJldkFib3ZlVmFsVTY0IEROICBEMy5VNjQgIAorZEFib3ZlTGVmdFZhbCAgIEROICBEMi5VOAorcUFib3ZlN21pbnVzMCAgIFFOICBRMy5TMTYgCitxQWJvdmVEaWZmICAgICAgUU4gIFEyLlMxNiAKK2RJbmRleCAgICAgICAgICBETiAgRDguVTggIAorZERpZmZBYm92ZVU4ICAgIEROICBEOS5VOCAgCitkRGlmZkFib3ZlUzE2ICAgRE4gIEQ5LlMxNiAKK2RBYm92ZURpZmYwVTggICBETiAgRDQuVTggIAorZEFib3ZlRGlmZjBVNjQgIEROICBENC5VNjQKK2RBYm92ZTdtaW51czBVOCBETiAgRDYuVTggIAorZE11bHRpcGxpZXIgICAgIEROICBEMTAuUzE2IAorZEhvclByZWQgICAgICAgIEROICBEMTEuUzE2IAorZFJldkxlZnRWYWwgICAgIEROICBEMy5VOAorZFJldkxlZnRWYWxVNjQgIEROICBEMy5VNjQKK3FMZWZ0N21pbnVzMCAgICBRTiAgUTcuUzE2CitxTGVmdERpZmYgICAgICAgUU4gIFE2LlMxNgorZERpZmZMZWZ0VTggICAgIEROICBEMTYuVTgKK2REaWZmTGVmdFMxNiAgICBETiAgRDE2LlMxNgorZExlZnREaWZmMFU4ICAgIEROICBEMTIuVTgKK2RMZWZ0RGlmZjBVNjQgICBETiAgRDEyLlU2NAorZExlZnQ3bWludXMwVTggIEROICBEMTQuVTgKK2RWZXJQcmVkICAgICAgICBETiAgRDMuUzE2IAorZEhWVmFsUzE2ICAgICAgIEROICBEMy5TMTYKK2RIVlZhbFMzMiAgICAgICBETiAgRDMuUzMyCitkSFZUZW1wUzMyICAgICAgRE4gIEQyLlMzMgorcUEgICAgICAgICAgICAgIFFOICBRMC5TMTYKK3FCICAgICAgICAgICAgICBRTiAgUTIuUzE2CitxQyAgICAgICAgICAgICAgUU4gIFEzLlMxNgorcU11bHRpcGxpZXIgICAgIFFOICBRNS5TMTYKK2RNdWx0aXBsaWVyMCAgICBETiAgRDEwLlMxNgorZE11bHRpcGxpZXIxICAgIEROICBEMTEuUzE2CitxQzAgICAgICAgICAgICAgUU4gIFEwLlMxNgorcUMxICAgICAgICAgICAgIFFOICBRMS5TMTYKK3FDMiAgICAgICAgICAgICBRTiAgUTQuUzE2CitxQzMgICAgICAgICAgICAgUU4gIFE1LlMxNgorcUM0ICAgICAgICAgICAgIFFOICBRNi5TMTYKK3FDNSAgICAgICAgICAgICBRTiAgUTcuUzE2CitxQzYgICAgICAgICAgICAgUU4gIFE4LlMxNgorcUM3ICAgICAgICAgICAgIFFOICBROS5TMTYKK3FTdW0wICAgICAgICAgICBRTiAgUTAuUzE2CitxU3VtMSAgICAgICAgICAgUU4gIFExLlMxNgorcVN1bTIgICAgICAgICAgIFFOICBRNC5TMTYKK3FTdW0zICAgICAgICAgICBRTiAgUTUuUzE2CitxU3VtNCAgICAgICAgICAgUU4gIFE2LlMxNgorcVN1bTUgICAgICAgICAgIFFOICBRNy5TMTYKK3FTdW02ICAgICAgICAgICBRTiAgUTguUzE2CitxU3VtNyAgICAgICAgICAgUU4gIFE5LlMxNgorZFN1bTAgICAgICAgICAgIEROICBEMC5VOAorZFN1bTEgICAgICAgICAgIEROICBEMS5VOAorZFN1bTIgICAgICAgICAgIEROICBEMi5VOAorZFN1bTMgICAgICAgICAgIEROICBEMy5VOAorZFN1bTQgICAgICAgICAgIEROICBENC5VOAorZFN1bTUgICAgICAgICAgIEROICBENS5VOAorZFN1bTYgICAgICAgICAgIEROICBENi5VOAorZFN1bTcgICAgICAgICAgIEROICBENy5VOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCByMTAsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKK09NWF9WQ19DSFJPTUFfREMKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKKworICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorCisgICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gICAgICAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbworICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCisgICAgICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlVmFsVTMyLGRTdW1MZWZ0VmFsVTMyCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnQsZFN1bUFib3ZlTGVmdCwjMyAgICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MGMgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzRVOCwjMHgwNAorICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4MCA9IDB4MGMwYzBjMGMwMDAwMDAwMCAKKyAgICAgICAgVlNIUiAgICAgZEluZGV4Um93NCxkSW5kZXhSb3c0LCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDQgPSAweDAwMDAwMDAwMDQwNDA0MDQKKyAgICAgICAgVkFERCAgICAgZEluZGV4Um93NFU4LGRJbmRleFJvdzRVOCxkSW5kZXhSb3cwVTggICAgIDsvLyBpbmRleDQgPSAweDBjMGMwYzBjMDQwNDA0MDQKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZUxlZnRVOCxkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4CisgICAgICAgIFZUQkwgICAgIGREc3RSb3c0LHtkU3VtTGVmdFZhbFU4LGRTdW1BYm92ZUxlZnRVOH0sZEluZGV4Um93NFU4CisgCitEQ0Nocm9tYTh4OExlZnRTdG9yZSAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorCitEQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgIGREc3RSb3cwLGRTdW1MZWZ0VmFsVThbMF0KKyAgICAgICAgVkRVUCAgICAgZERzdFJvdzQsZFN1bUxlZnRWYWxVOFs0XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhMZWZ0U3RvcmUgIAorICAgICAgICAKKworRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCisgICAgICAgICAgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwNAorICAgICAgICBWU0hMICAgICBkSW5kZXhSb3cwLGRJbmRleFJvdzAsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4ID0gMHgwNDA0MDQwNDAwMDAwMDAwCisgICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVWYWxVOH0sZEluZGV4Um93MFU4IAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCisgICAgICAgIAorCitEQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisKK0RDQ2hyb21hOHg4VXBwZXJTdG9yZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgCisgICAgICAgIE1fRVhJVAorCisKK09NWF9WQ19DSFJPTUFfVkVSVAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKKyAgICAgICAgCisKK09NWF9WQ19DSFJPTUFfSE9SCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDVbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw2W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsN1tdfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhQbGFuZVN0b3JlCisgICAgICAgIAorICAgICAgICAKK09NWF9WQ19DSFJPTUFfUExBTkUKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0VmFsWzBdLFtwU3JjQWJvdmVMZWZ0XQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZSRVY2NCAgZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNBYm92ZVswOjE6MjozOjQ6NTo2OjddCisgICAgICAgIFZTVUJMICAgcUFib3ZlN21pbnVzMCxkUmV2QWJvdmVWYWwsZEFib3ZlTGVmdFZhbCAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgVlNIUiAgICBkUmV2QWJvdmVWYWxVNjQsZFJldkFib3ZlVmFsVTY0LCM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbWDowOjE6MjozOjQ6NTo2XQorICAgICAgICBWU1VCTCAgIHFBYm92ZURpZmYsZFJldkFib3ZlVmFsLGRBYm92ZVZhbCAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQorICAgICAgICAKKyAgICAgICAgVlJFVjY0ICBkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0xlZnRbMDoxOjI6Mzo0OjU6Njo3XQorICAgICAgICBWU1VCTCAgIHFMZWZ0N21pbnVzMCxkUmV2TGVmdFZhbCxkQWJvdmVMZWZ0VmFsICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgVlNIUiAgICBkUmV2TGVmdFZhbFU2NCxkUmV2TGVmdFZhbFU2NCwjOCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtYOjA6MToyOjM6NDo1OjZdCisgICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNl0gLSBwU3JjTGVmdFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzVdIC0gcFNyY0xlZnRbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0XSAtIHBTcmNMZWZ0WzJdCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBNdWx0aXBsaWVyVGFibGUsPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4ICAgOy8vIFVzZWQgdG8gY2FsY3VsYXRlIEh2YWwgJiBWdmFsICAKKyAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmMFU2NCxkQWJvdmVEaWZmMFU2NCwjMTYgIAorICAgICAgICBWRVhUICAgIGREaWZmQWJvdmVVOCxkQWJvdmVEaWZmMFU4LGRBYm92ZTdtaW51czBVOCwjMiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0KKyAgICAgICAgVkxEMSAgICBkTXVsdGlwbGllcixbcE11bHRpcGxpZXJUYWJsZV0hIAorICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjBVNjQsZExlZnREaWZmMFU2NCwjMTYgIAorICAgICAgICBWRVhUICAgIGREaWZmTGVmdFU4LGRMZWZ0RGlmZjBVOCxkTGVmdDdtaW51czBVOCwjMiAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNVUwgICAgZEhvclByZWQsZERpZmZBYm92ZVMxNixkTXVsdGlwbGllciAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0Kig3LTApIHwgMSooNC0yKSB8IDIqKDUtMSkgfCAzKig2LTApIF0KKyAgICAgICAgVk1VTCAgICBkVmVyUHJlZCxkRGlmZkxlZnRTMTYsZE11bHRpcGxpZXIKKyAgICAgICAgVlBBREQgICBkSFZWYWxTMTYsZEhvclByZWQsZFZlclByZWQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWUEFEREwgIGRIVlZhbFMzMixkSFZWYWxTMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtWfEhdIGluIDMyIGJpdHMgZWFjaAorICAgICAgICBWU0hMICAgIGRIVlRlbXBTMzIsZEhWVmFsUzMyLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE3KkggPSAxNipIICsgSCA9IChIPDw0KStICisgICAgICAgIFZBREQgICAgZEhWVmFsUzMyLGRIVlZhbFMzMixkSFZUZW1wUzMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWyAxNypWICB8IDE3KkggXWluIDMyIGJpdHMgZWFjaAorICAgICAgICBWTEQxICAgIHtkTXVsdGlwbGllcjAsZE11bHRpcGxpZXIxfSxbcE11bHRpcGxpZXJUYWJsZV0gICAgICAgICAgOy8vIHFNdWx0aXBsaWVyID0gWyA0fDN8MnwxfDB8LTF8LTJ8LTMgXSAgCisgICAgICAgIFZSU0hSICAgZEhWVmFsUzMyLGRIVlZhbFMzMiwjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Yl0gaW4gMTZiaXRzIGVhY2gKKyAgICAgICAgVkFEREwgICBxQSxkQWJvdmVWYWwsZExlZnRWYWwKKyAgICAgICAgVkRVUCAgICBxQSxxQVs3XQorICAgICAgICBWU0hMICAgIHFBLHFBLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFthfGF8YXxhfGF8YXxhfGFdCisgICAgICAgIFZEVVAgICAgcUIsZEhWVmFsUzE2WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2J8YnxifGJ8YnxifGJ8Yl0KKyAgICAgICAgVkRVUCAgICBxQyxkSFZWYWxTMTZbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xjfGN8Y3xjfGN8Y3xjXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNVUwgICAgcUIscUIscU11bHRpcGxpZXIKKyAgICAgICAgVk1VTCAgICBxQyxxQyxxTXVsdGlwbGllcgorICAgICAgICBWQUREICAgIHFCLHFCLHFBIAorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBxQzAscUNbMF0KKyAgICAgICAgVkRVUCAgICBxQzEscUNbMV0KKyAgICAgICAgVkRVUCAgICBxQzIscUNbMl0KKyAgICAgICAgVkRVUCAgICBxQzMscUNbM10KKyAgICAgICAgVkRVUCAgICBxQzQscUNbNF0KKyAgICAgICAgVkRVUCAgICBxQzUscUNbNV0KKyAgICAgICAgVkRVUCAgICBxQzYscUNbNl0KKyAgICAgICAgVkRVUCAgICBxQzcscUNbN10KKyAgICAgICAgCisgICAgICAgIFZBREQgICAgcVN1bTAscUIscUMwCisgICAgICAgIFZBREQgICAgcVN1bTEscUIscUMxCisgICAgICAgIFZBREQgICAgcVN1bTIscUIscUMyCisgICAgICAgIFZBREQgICAgcVN1bTMscUIscUMzCisgICAgICAgIFZBREQgICAgcVN1bTQscUIscUM0CisgICAgICAgIFZBREQgICAgcVN1bTUscUIscUM1CisgICAgICAgIFZBREQgICAgcVN1bTYscUIscUM2CisgICAgICAgIFZBREQgICAgcVN1bTcscUIscUM3CisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiBkU3VtMCxxU3VtMCwjNSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gKE9NWF9VOClhcm1DbGlwKDAsMjU1LChTdW0rMTYpPj41KQorICAgICAgICBWUVJTSFJVTiBkU3VtMSxxU3VtMSwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtMixxU3VtMiwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtMyxxU3VtMywjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNCxxU3VtNCwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNSxxU3VtNSwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNixxU3VtNiwjNQorICAgICAgICBWUVJTSFJVTiBkU3VtNyxxU3VtNywjNSAgICAgIAorCitEQ0Nocm9tYTh4OFBsYW5lU3RvcmUgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRTdW0wLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtMSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTIsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW0zLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTUsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW02LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNyxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTljMGVlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCkBAIC0wLDAgKzEsNDI0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAorICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorICAgIAorCisgICAgSUYgQ29ydGV4QTgKKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNiwxCisgICAgRENXICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDggCisgICAgRENXICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICBEQ1cgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gQ29uc3RhbnRzIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorQkxLX1NJWkUgICAgICAgIEVRVSAweDEwCitNVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKK01VTF9DT05TVDEgICAgICBFUVUgMHgwMDA2MDAwNAorTVVMX0NPTlNUMiAgICAgIEVRVSAweDAwMDcwMDA1CitNVUxfQ09OU1QzICAgICAgRVFVIDB4MDAwMzAwMDEKK01BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit5ICAgICAgICAgICAgICAgUk4gMTIgICAKK3BjICAgICAgICAgICAgICBSTiAxNSAgIAorCityZXR1cm4gICAgICAgICAgUk4gMCAgICAKK3BUYWJsZSAgICAgICAgICBSTiA5ICAgIAorY291bnQgICAgICAgICAgIFJOIDExICAgCitwTXVsdFRhYmxlICAgICAgUk4gOQorOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE5lb24gcmVnaXN0ZXJzCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3FBYm92ZSAgICAgICAgICBRTiBRMC5VOAorcUxlZnQgICAgICAgICAgIFFOIFExLlU4CitxU3VtOCAgICAgICAgICAgUU4gUTAuVTE2CitkU3VtODAgICAgICAgICAgRE4gRDAuVTE2CitkU3VtODEgICAgICAgICAgRE4gRDEuVTE2CitkU3VtNCAgICAgICAgICAgRE4gRDAuVTE2CitkU3VtMiAgICAgICAgICAgRE4gRDAuVTMyCitkU3VtMSAgICAgICAgICAgRE4gRDAuVTY0CitxT3V0ICAgICAgICAgICAgUU4gUTMuVTgKK2RTdW1MZWZ0ICAgICAgICBETiBENi5VNjQKK2RTdW1BYm92ZSAgICAgICBETiBENy5VNjQKK2RTdW0gICAgICAgICAgICBETiBEOC5VNjQKK2RTdW0wICAgICAgICAgICBETiBEOC5VOFswXQorCitxSCAgICAgICAgICAgICAgUU4gUTExLlMzMgorcVYgICAgICAgICAgICAgIFFOIFExMi5TMzIKK3FBICAgICAgICAgICAgICBRTiBRMTEuUzE2CitxQiAgICAgICAgICAgICAgUU4gUTYuUzE2CitxQyAgICAgICAgICAgICAgUU4gUTcuUzE2CisKK3FCMCAgICAgICAgICAgICBRTiBRNS5TMTYKK3FCMSAgICAgICAgICAgICBRTiBRNi5TMTYKK2RBMSAgICAgICAgICAgICBETiBEMjMuUzE2CisKK2RIMCAgICAgICAgICAgICBETiBEMjIuUzMyCitkSDEgICAgICAgICAgICAgRE4gRDIzLlMzMgorZFYwICAgICAgICAgICAgIEROIEQyNC5TMzIKK2RWMSAgICAgICAgICAgICBETiBEMjUuUzMyCisKK3FIViAgICAgICAgICAgICBRTiBRMTEuUzY0CitxSFYwICAgICAgICAgICAgUU4gUTExLlMzMgorcUhWMSAgICAgICAgICAgIFFOIFExMi5TNjQKKworZEhWMDAgICAgICAgICAgIEROIEQyMi5TMzIKK2RIVjAxICAgICAgICAgICBETiBEMjMuUzMyCisKK2RIVjAgICAgICAgICAgICBETiBEMjIuUzE2WzBdCitkSFYxICAgICAgICAgICAgRE4gRDIzLlMxNlswXQorZEhWMTAgICAgICAgICAgIEROIEQyNC5TNjQKK2RIVjExICAgICAgICAgICBETiBEMjUuUzY0CisKK3FTdW0wICAgICAgICAgICBRTiBRMC5TMTYKK3FTdW0xICAgICAgICAgICBRTiBRMS5TMTYKKworZE91dDAgICAgICAgICAgIEROIEQ2LlU4CitkT3V0MSAgICAgICAgICAgRE4gRDcuVTgKKworZExlZnQwICAgICAgICAgIEROIEQyLlU4CitkTGVmdDEgICAgICAgICAgRE4gRDMuVTgKK3FDb25zdCAgICAgICAgICBRTiBRMTMuUzE2CisKK2RBYm92ZTAgICAgICAgICBETiBEMC5VOAorZEFib3ZlMSAgICAgICAgIEROIEQxLlU4CisKK2RSZXZMZWZ0NjQgICAgICBETiBEMTIuVTY0CitkUmV2TGVmdCAgICAgICAgRE4gRDEyLlU4CitkUmV2QWJvdmU2NCAgICAgRE4gRDUuVTY0CitkUmV2QWJvdmUgICAgICAgRE4gRDUuVTgKK3FMZWZ0RGlmZiAgICAgICBRTiBROC5TMTYKK2RMZWZ0RGlmZjEgICAgICBETiBEMTcuUzE2CitkTGVmdERpZmY2NCAgICAgRE4gRDE3LlM2NAorcURpZmZMZWZ0ICAgICAgIFFOIFE4LlMxNgorcURpZmZBYm92ZSAgICAgIFFOIFE0LlMxNgorZEFib3ZlRGlmZjEgICAgIEROIEQ5LlMxNgorZEFib3ZlRGlmZjY0ICAgIEROIEQ5LlM2NAorcUFib3ZlRGlmZiAgICAgIFFOIFE0LlMxNgorCitkQWJvdmVMZWZ0ICAgICAgRE4gRDQuVTgKKworZERpZmZMZWZ0MCAgICAgIEROIEQxNi5TMTYKK2REaWZmTGVmdDEgICAgICBETiBEMTcuUzE2CitkRGlmZkFib3ZlMCAgICAgRE4gRDguUzE2CitkRGlmZkFib3ZlMSAgICAgRE4gRDkuUzE2CisKK3FMZWZ0MTVtaW51czAgICBRTiBRNy5TMTYKK2RMZWZ0MTVtaW51czAgICBETiBEMTQuUzE2CitxQWJvdmUxNW1pbnVzMCAgUU4gUTMuUzE2CitkQWJvdmUxNW1pbnVzMCAgRE4gRDYuUzE2CisKK3FNdWx0aXBsaWVyICAgICBRTiBRMTAuUzE2CitxTXVsdGlwbGllcjAgICAgUU4gUTEwLlMxNgorcU11bHRpcGxpZXIxICAgIFFOIFExMi5TMTYKK2RNdWx0aXBsaWVyMCAgICBETiBEMjAuUzE2CitkTXVsdGlwbGllcjEgICAgRE4gRDIxLlMxNgorCitkQlBsdXNDTXVsdDcgICAgRE4gRDEuUzY0CitkQlBsdXNDTXVsdDdTMTYgRE4gRDEuUzE2CisKK3FUbXAgICAgICAgICAgICBRTiBRMC5VOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworcFRtcCAgICAgICAgICAgIFJOIDgKK3N0ZXAgICAgICAgICAgICBSTiAxMAorcFRtcDIgICAgICAgICAgIFJOIDExCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfVkVSVAorICAgICAgICBWTEQxICAgIHFBYm92ZSwgIFtwU3JjQWJvdmVdCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXQorICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfSE9SCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgbGVmdFN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHBUbXAyLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0U3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorTG9vcEhvciAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFNVQlMgICAgIHksIHksICM4CisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgQk5FICAgICAgTG9vcEhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMTYgdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfREMKKyAgICAgICAgTU9WICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvdW50ID0gMAorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgICBVcHBlck9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgbGVmdAorCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCBbcFRtcF0sc3RlcAorICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sIFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sIFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sW3BUbXBdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sW3BUbXBdIAorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgcVN1bTgsIHFMZWZ0CisgICAgICAgIEFERCAgICAgY291bnQsIGNvdW50LCAjMSAgICAKKyAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCisgICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdCwgZFN1bTIKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUxlZnQsICM0CisgICAgICAgIAorVXBwZXJPck5vbmVBdmFpbGFibGUKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIEJFUSAgICAgIEJvdGhPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCisgICAgICAgIFZMRDEgICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHVwcGVyIGluYyBjb3VudCBieSAxCisgICAgICAgIFZQQURETCAgIHFTdW04LCBxQWJvdmUKKyAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCisgICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmUsIGRTdW0yCisgICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1BYm92ZSwgIzQKKyAgICAgICAgCitCb3RoT3JOb25lQXZhaWxhYmxlCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgYm90aCBhdmFpbGFibGUKKyAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQorICAgICAgICBWQUREICAgICBkU3VtLCBkU3VtQWJvdmUsIGRTdW1MZWZ0CisgICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW0sICM1CisgICAgICAgIAorCitOb25lQXZhaWxhYmxlCisgICAgICAgIFZEVVAgICAgIHFPdXQsIGRTdW0wICAgICAgICAKKyAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBub25lIGF2YWlsYWJsZQorICAgICAgICBBREQgICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgQk5FICAgICAgTG9vcERDCisgICAgICAgIFZNT1YgICAgIHFPdXQsICMxMjgKK0xvb3BEQyAgICAgICAgCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCisgICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQKKworT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgICAgIExEUiAgICAgcE11bHRUYWJsZSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKKyAgICAgICAgVkxEMSAgICBxQWJvdmUsIFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0WzBdLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgIFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sICBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sICBbcFRtcF0sc3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCAgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCAgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LCBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LCBbcFRtcF0sc3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSwgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSwgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sIFtwVG1wXSAgIAorCisgICAgICAgIFZSRVY2NCAgZFJldkFib3ZlLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCisgICAgICAgIFZTVUJMICAgcUFib3ZlMTVtaW51czAsIGRSZXZBYm92ZSwgZEFib3ZlTGVmdCAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdIAorICAgICAgICBWU0hSICAgIGRSZXZBYm92ZTY0LCBkUmV2QWJvdmU2NCwgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCisgICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZiwgZFJldkFib3ZlLCBkQWJvdmUwICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjY0LCBkQWJvdmVEaWZmNjQsICMxNiAKKyAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlMSwgZEFib3ZlRGlmZjEsIGRBYm92ZTE1bWludXMwLCAjMSAgCisKKyAgICAgICAgVlJFVjY0ICBkUmV2TGVmdCxkTGVmdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAorICAgICAgICBWU1VCTCAgIHFMZWZ0MTVtaW51czAsZFJldkxlZnQsIGRBYm92ZUxlZnQgICAgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0gCisgICAgICAgIFZTSFIgICAgZFJldkxlZnQ2NCwgZFJldkxlZnQ2NCwgIzggICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAorICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdCwgZExlZnQwICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbGllciA9IFs4fDF8MnwuLi58Nnw3XQorICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyLCBbcE11bHRUYWJsZV0hICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjY0LCBkTGVmdERpZmY2NCwgIzE2CisgICAgICAgIFZFWFQgICAgZERpZmZMZWZ0MSwgZExlZnREaWZmMSwgZExlZnQxNW1pbnVzMCwgIzEgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTEwgICBxSCxkRGlmZkFib3ZlMCwgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAorICAgICAgICBWTVVMTCAgIHFWLGREaWZmTGVmdDAsICBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNTEFMICAgcUgsZERpZmZBYm92ZTEsIGRNdWx0aXBsaWVyMSAKKyAgICAgICAgVk1MQUwgICBxVixkRGlmZkxlZnQxLCAgZE11bHRpcGxpZXIxCisgICAgICAgIAorICAgICAgICBWUEFERCAgIGRIVjAwLGRIMSxkSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBREQgICBkSFYwMSxkVjEsZFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgcUhWLCBxSFYwCisgICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzIKKyAgICAgICAgVkFERCAgICBxSFYscUhWLHFIVjEgCisgICAgICAgIAorICAgICAgICA7Ly8gSFYgPSBbYyA9ICgoNSpWKzMyKT4+NikgfCBiID0gKCg1KkgrMzIpPj42KV0KKyAgICAgICAgVlJTSFIgICBxSFYscUhWLCM2CisgICAgICAgIAorICAgICAgICA7Ly8gSFYxID0gW2MqN3xiKjddCisgICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzMKKyAgICAgICAgVlNVQiAgICBxSFYxLHFIVjEscUhWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFswfDF8MnwuLi58N10KKyAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjAsIFtwTXVsdFRhYmxlXSEgICAgCisgICAgICAgIFZEVVAgICAgcUIsIGRIVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZEVVAgICAgcUMsIGRIVjEgCisgICAgICAgIAorICAgICAgICBWQURETCAgIHFBLGRBYm92ZTEsZExlZnQxCisgICAgICAgIFZTSEwgICAgcUEscUEsICM0CisgICAgICAgIFZEVVAgICAgcUEsZEExWzNdICAKKyAgICAgICAgVkFERCAgICBkQlBsdXNDTXVsdDcsIGRIVjEwLCBkSFYxMQorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzh8OXwxMHwuLi58MTVdCisgICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIxLCBbcE11bHRUYWJsZV0KKyAgICAgICAgOy8vIENvbnN0ID0gYSAtIDcqKGIrYykKKyAgICAgICAgVkRVUCAgICBxQ29uc3QsIGRCUGx1c0NNdWx0N1MxNlswXQorICAgICAgICBWU1VCICAgIHFDb25zdCwgcUEsIHFDb25zdAorICAgICAgICAKKyAgICAgICAgOy8vIEIwID0gWzAqYnwxKmJ8MipifDMqYnwuLi4uLi58NypiXQorICAgICAgICBWTVVMICAgIHFCMCxxQixxTXVsdGlwbGllcjAKKyAgICAgICAgCisgICAgICAgIDsvLyBCMCA9IFs4KmJ8OSpifDEwKmJ8MTEqYnwuLi4ufDE1KmJdCisgICAgICAgIFZNVUwgICAgcUIxLHFCLHFNdWx0aXBsaWVyMQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBxU3VtMCwgcUIwLCBxQ29uc3QKKyAgICAgICAgVkFERCAgICBxU3VtMSwgcUIxLCBxQ29uc3QgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvb3BzIGZvciAxNiB0aW1lcworTG9vcFBsYW5lICAgICAgIAorICAgICAgICA7Ly8gKGIqeCArIGMqeSArIEMpPj41CisgICAgICAgIFZRUlNIUlVOIGRPdXQwLCBxU3VtMCwjNQorICAgICAgICBWUVJTSFJVTiBkT3V0MSwgcVN1bTEsIzUgICAgICAKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEKKyAgICAgICAgVlNUMSAgICAgcU91dCxbcERzdF0sZHN0U3RlcAorICAgICAgICBWQUREICAgICBxU3VtMCxxU3VtMCxxQyAKKyAgICAgICAgVkFERCAgICAgcVN1bTEscVN1bTEscUMgCisgICAgICAgIEJORSAgICAgIExvb3BQbGFuZQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgICAgIAorICAgICAgICBFTkQKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWViOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCkBAIC0wLDAgKzEsNTMxIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0CisgICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgorICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAorICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAorICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXR1cm4gICAgICAgICAgUk4gMAorcFRhYmxlICAgICAgICAgIFJOIDgKK3BjICAgICAgICAgICAgICBSTiAxNQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3BEc3QxICAgICAgICAgICBSTiAxIAorcERzdDIgICAgICAgICAgIFJOIDQgCitwRHN0MyAgICAgICAgICAgUk4gNiAKKworcFNyY1RtcCAgICAgICAgIFJOIDkKK3NyY1N0ZXAgICAgICAgICBSTiAxMAorcERzdFRtcCAgICAgICAgIFJOIDExCitkc3RlcCAgICAgICAgICAgUk4gMTIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIE5lb24gcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKK2RBYm92ZVUzMiAgICAgICBETiAgRDAuVTMyCisKKzsvLyBPTVhfVkNfQ0hST01BX0hPUgorZExlZnRWYWwwICAgICAgIEROICBEMC44CitkTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKK2RMZWZ0VmFsMiAgICAgICBETiAgRDIuOAorZExlZnRWYWwzICAgICAgIEROICBEMy44CitkTGVmdFZhbDBVMzIgICAgRE4gIEQwLlUzMgorZExlZnRWYWwxVTMyICAgIEROICBEMS5VMzIKK2RMZWZ0VmFsMlUzMiAgICBETiAgRDIuVTMyCitkTGVmdFZhbDNVMzIgICAgRE4gIEQzLlUzMgorCis7Ly8gT01YX1ZDXzR4NF9EQworZExlZnRWYWwgICAgICAgIEROICBEMC5VOAorZExlZnRWYWxVMzIgICAgIEROICBEMC5VMzIKK2RTdW1BYm92ZUxlZnRVMTYgIEROICBEMS5VMTYKK2RTdW1BYm92ZUxlZnRVMzIgIEROICBEMS5VMzIKK2RTdW1BYm92ZUxlZnRVNjQgIEROICBEMS5VNjQKK2RTdW1BYm92ZUxlZnRVOCBETiAgRDEuVTgKK2RTdW0gICAgICAgICAgICBETiAgRDAuVTgKKworZFN1bUxlZnRWYWxVMTYgIEROICBEMS5VMTYKK2RTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCitkU3VtTGVmdFZhbFU2NCAgRE4gIEQxLlU2NAorZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAorCitkQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4CitkU3VtQWJvdmVWYWxVMTYgIEROICBEMS5VMTYKK2RTdW1BYm92ZVZhbFUzMiAgRE4gIEQxLlUzMgorZFN1bUFib3ZlVmFsVTY0ICBETiAgRDEuVTY0CitkU3VtQWJvdmVWYWxVOCAgIEROICBEMS5VOAorZENvbnN0MTI4VTggICAgIEROICBEMC5VOAorCisKKzsvL09NWF9WQ180eDRfRElBR19ETAorCitkQWJvdmUgICAgICAgICAgRE4gIEQwLlU4CitkVTcgICAgICAgICAgICAgRE4gIEQyLlU4CitkVTMgICAgICAgICAgICAgRE4gIEQyLlU4CitkQWJvdmUwICAgICAgICAgRE4gIEQzLlU4CitkQWJvdmUxICAgICAgICAgRE4gIEQ0LlU4CitkQWJvdmUyICAgICAgICAgRE4gIEQ1LlU4CitkVG1wICAgICAgICAgICAgRE4gIEQ2LlU4CitkVG1wMCAgICAgICAgICAgRE4gIEQ3LlU4CitkVG1wMSAgICAgICAgICAgRE4gIEQ4LlU4CitkVG1wMiAgICAgICAgICAgIEROICBEOS5VOAorZFRtcDMgICAgICAgICAgICBETiAgRDEwLlU4CitkVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgorCisKKzsvL09NWF9WQ180eDRfRElBR19EUgorZExlZnQgICAgICAgICAgIEROICBEMS5VOAorZFVMICAgICAgICAgICAgIEROICBEMi5VOAorCis7Ly9PTVhfVkNfNHg0X1ZSCitkTGVmdDAgICAgICAgICAgRE4gIEQxLlU4CitkTGVmdDEgICAgICAgICAgRE4gIEQyLlU4CitkRXZlbjAgICAgICAgICAgRE4gIEQzLlU4CitkRXZlbjEgICAgICAgICAgRE4gIEQ0LlU4CitkRXZlbjIgICAgICAgICAgRE4gIEQ1LlU4CitkT2RkMCAgICAgICAgICAgRE4gIEQ2LlU4CitkT2RkMSAgICAgICAgICAgRE4gIEQxMS5VOAorZE9kZDIgICAgICAgICAgIEROICBEMTIuVTgKK2RUbXAzVTMyICAgICAgICBETiAgRDEwLlUzMiAgICAKK2RUbXAyVTMyICAgICAgICBETiAgRDkuVTMyCisKKworOy8vT01YX1ZDXzR4NF9IRAorZFRtcDFVNjQgICAgICAgIEROICBEOC5VNjQKK2RUbXAwVTY0ICAgICAgICBETiAgRDcuVTY0CitkVG1wVTY0ICAgICAgICAgRE4gIEQ2LlU2NAorZFRtcFUzMiAgICAgICAgIEROICBENi5VMzIKK2RUbXAxVTMyICAgICAgICBETiAgRDguVTMyCisKKzsvL09NWF9WQ180eDRfSFUKK2RMMyAgICAgICAgICAgICBETiAgRDIuVTgKK2RMZWZ0SFUwICAgICAgICBETiAgRDMuVTgKK2RMZWZ0SFUxICAgICAgICBETiAgRDQuVTgKK2RMZWZ0SFUyICAgICAgICBETiAgRDUuVTgKK2RUbXAwVTMyICAgICAgICBETiAgRDcuVTMyCisKKworCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMixkMTIKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUkQgICBwcmVkTW9kZSxhdmFpbGFiaWxpdHksUHJlZE1vZGUgICAgIDsvLyBBcmcgcHJlZE1vZGUgJiBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUkQgICBsZWZ0U3RlcCxkc3RTdGVwLExlZnRTdGVwICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgJiBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworCitPTVhfVkNfNHg0X0hPUgorICAgICAgICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZExlZnRWYWwwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDFVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMlUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZExlZnRWYWwzVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfVkVSVAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZQorICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0sZHN0ZXAKKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXSxkc3RlcAorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RdCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdFRtcF0KKworICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKworT01YX1ZDXzR4NF9EQworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCisKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KKyAgICAgICAgVkxEMSAgICAgZExlZnRWYWxVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszIHwgMCsxXSB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTMyLCBkU3VtQWJvdmVMZWZ0VTE2ICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszKzArMV0gfCBwU3JjTGVmdFsyKzMrMCsxXV0gCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVNjQsIGRTdW1BYm92ZUxlZnRVMzIgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSArIHBTcmNMZWZ0WzIrMyswKzFdXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnRVNjQsZFN1bUFib3ZlTGVmdFU2NCwjMyAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVMZWZ0VThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgCisgICAgICAgIAorRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gWyBYWCB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtTGVmdFZhbFU4WzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCisgICAgICAgICAgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAorICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0Fib3ZlWzIrMyB8IDArMV1dICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNBYm92ZVsyKzMrMCsxXV0gCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUFib3ZlVmFsVThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAorICAgICAgICAKK0RDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCitPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCisgICAgICAgIEJFUSAgICAgRGlhZ0RMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKKyAgICAgICAgVkRVUCAgICBkVTcsIGRBYm92ZTBbN10gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVN3xVN3xVN3xVN3xVN10KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUwLCBkVTcsICMxICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVNnxVNXxVNHxVM3xVMnxVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUwLCBkVTcsICMyICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVNnxVNXxVNHxVM3xVMl0gCisgICAgICAgIEIgICAgICAgRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCisgICAgICAgCitEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCisgICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTNdCisKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLCBkQWJvdmUsIGRVMywgIzQgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVMl0KKyAgICAgICAKK0RpYWdETFByZWRpY3Q0eDRTdG9yZSAgCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wLCBkVG1wLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCisgICAgICAgIAorCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorCitPTVhfVkNfNHg0X0RJQUdfRFIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMworICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtYfFh8WHxYfFUzfFUyfFUxfFUwXQorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVTCxMMCxMMSxMMixMMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQgPSBbVUx8TDB8TDF8TDJ8TDN8WHxYfFhdICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBwRHN0MSxwRHN0LGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCxkTGVmdCxkQWJvdmUsIzMgICAgICAgICAgICAgICAgIDsvLyBbVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDNdICAgCisgICAgICAgIEFERCAgICAgcERzdDIscERzdDEsZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRBYm92ZTEsZExlZnQsZEFib3ZlLCM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfFVMfEwwfEwxfEwyXSAgIAorICAgICAgICBBREQgICAgIHBEc3QzLHBEc3QyLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRMZWZ0LGRBYm92ZSwjNSAgICAgICAgICAgICAgICAgOy8vIFsgWHxVM3xVMnxVMXxVMHxVTHxMMHxMMV0gICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QzXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswXSxbMV0sWzJdLFszXSBAIHBEc3QzCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0Ml0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMV0sWzJdLFszXSxbNF0gQCBwRHN0MgorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDFdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJdLFszXSxbNF0sWzVdIEAgcERzdDEKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFszXSxbNF0sWzVdLFs2XSBAIHBEc3QKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisKK09NWF9WQ180eDRfVlIKKworICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVUwsVTAsVTEsVTIsVTMKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KKyAgICAgICAgVkxEMSAgICBkQWJvdmVbN10sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgOy8vIFtVTHxYfFh8WHxVM3xVMnxVMXxVMF0KKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEwwLEwxLEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDAgPSBbTDB8TDJ8WHxYfFh8WHxYfFhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDEgPSBbTDF8IFh8WHxYfFh8WHxYfFhdICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdDBbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnQxWzddfSxbcFNyY0xlZnRdLGxlZnRTdGVwICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0MFs2XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZE9kZDIsZEFib3ZlLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIFVMIF0KKyAgICAgICAgVkVYVCAgICBkRXZlbjAsZExlZnQwLGRPZGQyLCM2ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTEgVTAgVUwgTDAgTDIgXQorICAgICAgICBWRVhUICAgIGRFdmVuMSxkTGVmdDEsZE9kZDIsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMSBdCisgICAgICAgIFZFWFQgICAgZEV2ZW4yLGRMZWZ0MCxkQWJvdmUsIzcgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIEwwIF0KKyAgICAgICAgVkVYVCAgICBkT2RkMCxkTGVmdDEsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDEgXQorICAgICAgICBWRVhUICAgIGRPZGQxLGRMZWZ0MCxkT2RkMiwjNyAgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMCBdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAxLCBkT2RkMCwgZE9kZDIKKyAgICAgICAgVlJIQUREICBkVG1wMSwgZFRtcDEsIGRPZGQxICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOSA3IDUgMyAxIF0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDAsIGRFdmVuMCwgZEV2ZW4yCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkRXZlbjEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IDggNiA0IDIgMCBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkVG1wMyxkVG1wMSxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA5IDcgNSAzIF0gCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDAsZFRtcDAsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IHggOCA2IDQgMiBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wM1UzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQorICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzhdLFs2XSxbNF0sWzJdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X0hECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVTAsVTEsVTIsVTMKKyAgICAgICAgVkxEMSAgICBkQWJvdmUsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vZEFib3ZlTGVmdFZhbCA9IFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0KKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFsgVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDMgXSAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzIgICAgICAgICAgICAgICAgIDsvLyBbIFUxfFUwfFVMfEwwfEwxfEwyfEwzfFggXSAgIAorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCMxICAgICAgICAgICAgICAgICA7Ly8gWyBVMHxVTHxMMHxMMXxMMnxMM3xYfFggXSAgICAgCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAwLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDAgfCAxIHwgMiB8IDQgfCA2IHwgOCB8IFggfCBYIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWUkhBREQgIGRUbXAxLCBkQWJvdmUxLCBkQWJvdmUwICAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MQorICAgICAgICBWU0hMICAgIGRUbXAxVTY0LGRUbXAxVTY0LCMyNCAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAzfDV8IDcgfDkgfCBYIHwgWCB8IFggfCBYIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU0hMICAgIGRUbXBVNjQsZFRtcDBVNjQsIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAyfDR8Nnw4fCBYIHwgWCB8IFggfCBYIF0KKyAgICAgICAgVlpJUCAgICBkVG1wMSxkVG1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAgPSBbIDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IF0KKyAgICAgICAgVkVYVCAgICBkVG1wMCxkVG1wMCxkVG1wMCwjNiAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgIFh8IFh8IFh8IFh8IFh8IFh8IDAgfCAxIF0KKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wLGRUbXAwLCMyICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8NyBdCisgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzFdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswfDF8MnwzXQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMV0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsyfDN8NHw1XQorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs0fDV8Nnw3XQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs2fDd8OHw5XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X1ZMCisKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCisgICAgICAgIEJFUSAgICAgRGlhZ1ZMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0gCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkQWJvdmUwLGRBYm92ZTAsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfFU3fFU2fFU1fFU0fFUzfFUyfFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZEFib3ZlMSxkQWJvdmUxLCMxICAgICAgICAgICAgICAgOy8vIFsgWHwgWHxVN3xVNnxVNXxVNHxVM3xVMl0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCisgICAgICAgCitEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfC18LXwtfC1dIAorICAgICAgICBWRFVQICAgIGRVMywgZEFib3ZlWzddICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KKworICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTIgVTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlLCBkVTMsICM2ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQorICAgICAgIAorRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAKKyAgICAgICAgCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IDh8IDZ8IDR8IDJ8IDAgXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMywgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAzLCBkVG1wMywgZEFib3ZlMSAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOXwgN3wgNXwgM3wgMSBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOHwgNnwgNHwgMiBdCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDMsZFRtcDEsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IFh8IDl8IDd8IDV8IDMgXQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQorICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzddLFs1XSxbM10sWzFdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KKyAgICAgICAgVlNUMSAgICBkVG1wMlUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X0hVCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMMnxMMXxMMHxYfFh8WHxYXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZEwzLGRMZWZ0WzddICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRMZWZ0SFUwLGRMZWZ0LGRMMywjNCAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwyfEwxfEwwXQorICAgICAgICBWRVhUICAgIGRMZWZ0SFUxLGRMZWZ0LGRMMywjNSAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwyfEwxXQorICAgICAgICBWRVhUICAgIGRMZWZ0SFUyLGRMZWZ0LGRMMywjNiAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwyXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMCwgZExlZnRIVTAsIGRMZWZ0SFUyCisgICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkTGVmdEhVMSAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA1IHwgMyB8IDEgXQorICAgICAgICAKKyAgICAgICAgVlJIQUREICBkVG1wMSwgZExlZnRIVTEsIGRMZWZ0SFUwICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgVG1wWyBMMyB8IEwzIHwgTDMgfCBMMyB8IEwzIHwgNCB8IDIgfCAwIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDEgPSBUbXBbN3wgNnwgNXwgNHwgM3wgMnwgMXwgMF0gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDAgPSBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzN8MnwxfDBdIAorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAxLGRUbXAxLCMyCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbNXw0fDN8Ml0gCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs3fDZ8NXw0XSAgCisgICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBbOXw4fDd8Nl0gCisgICAgICAgIAorICAgICAgICAKK0V4aXRQcmVkaWN0NHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM5NDMzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSwxNDAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgIAorCisgICAgCisgICAgCisgICAgSUYgQ29ydGV4QTgKKworOy8vIEFSTSBSZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICBSTiAwCitwRHN0ICAgICAgICBSTiAxCitRUCAgICAgICAgICBSTiAyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgIFJOIDkKK1ZhbHVlICAgICAgIFJOIDQKK1ZhbHVlMiAgICAgIFJOIDUKK0ZsYWcgICAgICAgIFJOIDYKK3N0ck9mZnNldCAgIFJOIDcKK2NzdE9mZnNldCAgIFJOIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjB3MCAgICAgICAgUk4gIDMKK3IwdzEgICAgICAgIFJOICA0CisKK2MwdzAgICAgICAgIFJOICA1CitjMXcwICAgICAgICBSTiAgNgorCityZXR1cm4gICAgICBSTiAgMAorcFFQRGl2VGFibGUgUk4gIDUKK3BRUE1vZFRhYmxlICAgIFJOICA2CitTaGlmdCAgICAgICAgUk4gIDkKK1NjYWxlICAgICAgICBSTiAgMgorCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisKK2RaZXJvICAgICAgIEROICBEMC5VMTYKK2RJbnZUckNvZWZmIEROICBEMC5TMTYKK2RTY2FsZSAgICAgIEROICBEMS5TMTYKK3FEcW50Q29lZmYgIFFOICBRMS5TMzIKK2REcW50Q29lZmYgIEROICBEMi5TMTYKKworCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQorICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBWTU9WICAgIGRaZXJvLCAjMAorICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFplcm8sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAgICAKKyAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKworCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vSW52VHJhbnNmb3JtREMyeDI6IElubGluZWQgKEltcGxlbWVudGVkIGluIEFSTSBWNikKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIExETUlBICAgIHBEc3QsIHtyMHcwLCByMHcxfSAgICAgICAgICAgICAgICAgIDsvLyByMHcwID0gfGMxfGMwfCAmIHIwdzEgPSB8YzN8YzJ8CisKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFIgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgU0FERFNVQlggcjB3MCwgcjB3MCwgIHIwdzAgICAgICAgICAgICAgICAgICAgOy8vIFsgYzAwK2MwMSwgYzAwLWMwMSBdCisgICAgICAgIFNBRERTVUJYIHIwdzEsIHIwdzEsICByMHcxICAgICAgICAgICAgICAgICAgIDsvLyBbIGMxMCtjMTEsIGMxMC1jMTEgXQorICAgICAgICAKKyAgICAgICAgTERSU0IgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIExEUlNCICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgYzB3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwK2QxMCwgZDAxK2QxMSBdCisgICAgICAgIFNTVUIxNiAgIGMxdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMC1kMTAsIGQwMS1kMTEgXQorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly9EZXF1YW50Q2hyb21hREMyeDI6IElubGluZWQgKE5lb24gSW1wbGVtZW50YXRpb24pCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIFZNT1YgICAgIGRJbnZUckNvZWZmLCBjMHcwLCBjMXcwICAKKyAgICAgICAgVlJFVjMyICAgZEludlRyQ29lZmYsZEludlRyQ29lZmYgIAorICAgICAgICBWRFVQICAgICBkU2NhbGUsU2NhbGUgCisgICAgICAgIAorICAgICAgICBWTVVMTCAgICBxRHFudENvZWZmLGRJbnZUckNvZWZmLGRTY2FsZQorICAgICAgICBWU0hSTiAgICBkRHFudENvZWZmLHFEcW50Q29lZmYsIzEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHFudENvZWZmLFtwRHN0XSAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgIAorICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTI5OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSwyNjQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCis7Ly8gCis7Ly8gCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcERhdGEgICAgICAgICAgICAgICBSTiAgMAorUVAgICAgICAgICAgICAgICAgICBSTiAgMSAgICAKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gQVJNIFJlZ2lzdGVycworCitwUVBEaXZUYWJsZSAgICAgICAgIFJOICAyCitwUVBNb2RUYWJsZSAgICAgICAgIFJOICAzCitTaGlmdCAgICAgICAgICAgICAgIFJOICA0CitTY2FsZSAgICAgICAgICAgICAgIFJOICA1CisKKzsvLyBORU9OIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2ICAgCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCitkUm93U3VtMSAgICAgICAgICAgIEROICBENC5TMTYKK2RSb3dTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgorZFJvd0RpZmYxICAgICAgICAgICBETiAgRDYuUzE2CitkUm93RGlmZjIgICAgICAgICAgIEROICBENy5TMTYKKworOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKK2RSb3dPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZFJvd09wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkUm93T3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RSb3dPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcVJvd09wMDEgICAgICAgICAgICBRTiAgUTAuMzIKK3FSb3dPcDIzICAgICAgICAgICAgUU4gIFExLjMyCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCitkQ29sU3VtMSAgICAgICAgICAgIEROICBENC5TMTYKK2RDb2xTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgorZENvbERpZmYxICAgICAgICAgICBETiAgRDYuUzE2CitkQ29sRGlmZjIgICAgICAgICAgIEROICBENy5TMTYKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitkQ29sT3AwICAgICAgICAgICAgIEROICBEMC5TMTYKK2RDb2xPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZENvbE9wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkQ29sT3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworCitkU2NhbGUgICAgICAgICAgICAgIEROICBENS5TMTYKK3FSb3VuZDAgICAgICAgICAgICAgUU4gIFEzLlMzMgorcVJvdW5kMSAgICAgICAgICAgICBRTiAgUTQuUzMyCitxUm91bmQyICAgICAgICAgICAgIFFOICBRNS5TMzIKK3FSb3VuZDMgICAgICAgICAgICAgUU4gIFE2LlMzMgorCis7Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscworZE91dDAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkT3V0MSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkT3V0MiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkT3V0MyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyNSxkMTMKKyAgICAKKyAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA0IEQtcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIFRyYW5zcG9zZWQgZm9ybQorICAgICAgICAKKyAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BEYXRhXQorICAgICAgICBMRFIgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gU2NhbGUgZmFjdG9yIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgQVJNIGluc3RydWN0aW9ucworICAgICAgICA7Ly8gSW50ZXJsZWF2ZWQgd2l0aCBORU9OIGluc3RydWN0aW9ucyBpbm9yZGVyIHRvIER1YWwgaXNzdWUKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgZFJvd1N1bTEsZEluMCxkSW4xCisgICAgICAgIFZBREQgICAgZFJvd1N1bTIsZEluMixkSW4zCisgICAgICAgIFZTVUIgICAgZFJvd0RpZmYxLGRJbjAsZEluMQorICAgICAgICBMRFJTQiAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgVlNVQiAgICBkUm93RGlmZjIsZEluMixkSW4zCisgICAgICAgIExEUlNCICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKKyAgICAgICAgVkFERCAgICBkUm93T3AwLGRSb3dTdW0xLGRSb3dTdW0yCisgICAgICAgIFZTVUIgICAgZFJvd09wMSxkUm93U3VtMSxkUm93U3VtMgorICAgICAgICBWU1VCICAgIGRSb3dPcDIsZFJvd0RpZmYxLGRSb3dEaWZmMgorICAgICAgICBMU0wgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAorICAgICAgICBWQUREICAgIGRSb3dPcDMsZFJvd0RpZmYxLGRSb3dEaWZmMgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkUm93T3AwLGRSb3dPcDEKKyAgICAgICAgVlRSTiAgICBkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVlRSTiAgICBxUm93T3AwMSxxUm93T3AyMyAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgZENvbFN1bTEsZFJvd09wMCxkUm93T3AxCisgICAgICAgIFZBREQgICAgZENvbFN1bTIsZFJvd09wMixkUm93T3AzCisgICAgICAgIFZTVUIgICAgZENvbERpZmYxLGRSb3dPcDAsZFJvd09wMQorICAgICAgICBWU1VCICAgIGRDb2xEaWZmMixkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVkFERCAgICBkQ29sT3AwLGRDb2xTdW0xLGRDb2xTdW0yCisgICAgICAgIFZTVUIgICAgZENvbE9wMSxkQ29sU3VtMSxkQ29sU3VtMgorICAgICAgICBWU1VCICAgIGRDb2xPcDIsZENvbERpZmYxLGRDb2xEaWZmMgorICAgICAgICBWQUREICAgIGRDb2xPcDMsZENvbERpZmYxLGRDb2xEaWZmMgorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQorICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCisgICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQorICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCisgICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAorICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRFVQICAgIGRTY2FsZSwgU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSAtPiBORU9OICBjb3B5ICdzY2FsZScgdG8gdmVjdG9yCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1PViAgICBxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdGhlIFJvdW5kIFZhbHVlIAorICAgICAgICBWTU9WICAgIHFSb3VuZDEsIzIKKyAgICAgICAgVk1PViAgICBxUm91bmQyLCMyCisgICAgICAgIFZNT1YgICAgcVJvdW5kMywjMgorICAgICAgICAKKyAgICAgICAgVk1MQUwgICBxUm91bmQwLGRDb2xPcDAsZFNjYWxlICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0W2ldICogU2NhbGUgKyBSb3VuZCAKKyAgICAgICAgVk1MQUwgICBxUm91bmQxLGRDb2xPcDEsZFNjYWxlCisgICAgICAgIFZNTEFMICAgcVJvdW5kMixkQ29sT3AyLGRTY2FsZQorICAgICAgICBWTUxBTCAgIHFSb3VuZDMsZENvbE9wMyxkU2NhbGUKKyAgICAgICAgCisgICAgICAgIFZTSFJOICAgZE91dDAscVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJpZ2h0IHNoaWZ0IGJ5IDIgJiAoT01YX1MxNilWYWx1ZQorICAgICAgICBWU0hSTiAgIGRPdXQxLHFSb3VuZDEsIzIKKyAgICAgICAgVlNIUk4gICBkT3V0MixxUm91bmQyLCMyCisgICAgICAgIFZTSFJOICAgZE91dDMscVJvdW5kMywjMgorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtkT3V0MCxkT3V0MSxkT3V0MixkT3V0M30sIFtwRGF0YV0KKworICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5EICAgICAgICAKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCisgICAgICAgIAorCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgICAgICAgICBSTiAgMAorcERzdCAgICAgICAgICAgICAgICBSTiAgMQorUVBSMiAgICAgICAgICAgICAgICBSTiAgMgorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICAgICAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRHN0UjQgICAgICAgICAgICAgIFJOICA0CitwRHN0UjAgICAgICAgICAgICAgIFJOICAwCitRUFIxICAgICAgICAgICAgICAgIFJOICAxCitRUFI1ICAgICAgICAgICAgICAgIFJOICA1CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKKyAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAorICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKKyAgICAKKworICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMmRmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBNVk4gICAgICByMTIscjEyCisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCithcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAorICAgIExEUiAgICAgIHI0LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIExTUiAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2CisgICAgTFNSICAgICAgcjExLHIxMSwjMTYKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKK2FybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllZTIyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmU6CisgICAgVkxEMS4zMiAge2QxOFswXX0sW3I1XSEKKyAgICBWU1VCTC5VOCBxMTEsZDUsZDkKKyAgICBWTU9WICAgICBkMjgsZDE4CisgICAgVlNVQkwuVTggcTEwLGQ4LGQ0CisgICAgVlNIUi5TMTYgcTExLHExMSwjMgorICAgIFZaSVAuOCAgIGQxOCxkMjgKKyAgICBWQklGICAgICBkMTgsZDE0LGQxNgorICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKKyAgICBWQURELkk4ICBkMzEsZDE4LGQxNQorICAgIFZRTU9WTi5TMTYgZDIwLHExMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgVk1JTi5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTkVHLlM4ICBkMzEsZDMxCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBWTUFYLlM4ICBkMjAsZDIwLGQzMQorICAgIFZNT1ZMLlU4IHExNCxkNAorICAgIFZNT1ZMLlU4IHExMixkOAorICAgIFZBRERXLlM4IHExNCxxMTQsZDIwCisgICAgVlNVQlcuUzggcTEyLHExMixkMjAKKyAgICBWUU1PVlVOLlMxNiBkMjkscTE0CisgICAgVlFNT1ZVTi5TMTYgZDI0LHExMgorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZToKKyAgICBWSEFERC5VOCBkMTMsZDQsZDkKKyAgICBWSEFERC5VOCBkMzEsZDgsZDUKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBWUkhBREQuVTggZDEzLGQxMyxkNQorICAgIFZSSEFERC5VOCBkMzEsZDMxLGQ5CisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmM2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZToKKyAgICBWU1VCTC5VOCBxMTEsZDUsZDkKKyAgICBWTEQxLjggICB7ZDE4W119LFtyNV0hCisgICAgVlNVQkwuVTggcTEwLGQ4LGQ0CisgICAgVkxEMS44ICAge2QxOVtdfSxbcjVdIQorICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKKyAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAorICAgIFZBTkQgICAgIGQxOSxkMTcsZDE1CisgICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKKyAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCisgICAgVlJIQURELlU4IGQyNCxkNCxkOAorICAgIFZBREQuSTggIGQzMSxkMTgsZDE5CisgICAgVkFORCAgICAgZDE5LGQxMixkMTUKKyAgICBWUUFERC5VOCBkMjMsZDUsZDE4CisgICAgVlFNT1ZOLlMxNiBkMjAscTEwCisgICAgVkFERC5JOCAgZDMxLGQzMSxkMTkKKyAgICBWUVNVQi5VOCBkMjIsZDUsZDE4CisgICAgVlFBREQuVTggZDE5LGQ5LGQxOAorICAgIFZIQURELlU4IGQyNixkMjQsZDYKKyAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQorICAgIFZORUcuUzggIGQzMSxkMzEKKyAgICBWUVNVQi5VOCBkMjEsZDksZDE4CisgICAgVkhBREQuVTggZDI3LGQyNCxkMTAKKyAgICBWTUFYLlU4ICBkMzAsZDI2LGQyMgorICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCisgICAgVk1PVkwuVTggcTE0LGQ0CisgICAgVk1PVkwuVTggcTEyLGQ4CisgICAgVkFERFcuUzggcTE0LHExNCxkMjAKKyAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAorICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKKyAgICBWUU1PVlVOLlMxNiBkMjQscTEyCisgICAgVk1BWC5VOCAgZDI1LGQyNyxkMjEKKyAgICBWTUlOLlU4ICBkMzAsZDMwLGQyMworICAgIFZNSU4uVTggIGQyNSxkMjUsZDE5CisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVkJJRiAgICAgZDI1LGQ5LGQxMgorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZToKKyAgICBWU0hSLlU4ICBkMTksZDAsIzIKKyAgICBWQURELkk4ICBkMTksZDE5LGQxNQorICAgIFZBRERMLlU4IHExMCxkOCxkNAorICAgIFZBREQuSTggIGQxOSxkMTksZDE1CisgICAgVkFEREwuVTggcTExLGQ2LGQ5CisgICAgVkFERFcuVTggcTEyLHExMCxkNQorICAgIFZDR1QuVTggIGQxOSxkMTksZDEzCisgICAgVlNIUi5VMTYgcTExLHExMSwjMQorICAgIFZIQURELlUxNiBxMTEscTEyLHExMQorICAgIFZBRERXLlU4IHExMixxMTIsZDYKKyAgICBWQURETC5VOCBxMTMsZDcsZDYKKyAgICBWQU5EICAgICBkMTcsZDE3LGQxOQorICAgIFZIQURELlU4IGQyOCxkNCxkOQorICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKKyAgICBWQU5EICAgICBkMTIsZDEyLGQxOQorICAgIFZRUlNIUk4uVTE2IGQyOSxxMTEsIzEKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNQorICAgIFZRUlNIUk4uVTE2IGQzMCxxMTIsIzIKKyAgICBWQURETC5VOCBxMTEsZDEwLGQ1CisgICAgVkFERFcuVTggcTEyLHExMCxkOQorICAgIFZCSUYgICAgIGQyOSxkMjgsZDE3CisgICAgVlFSU0hSTi5VMTYgZDMxLHExMywjMgorICAgIFZBRERMLlU4IHExMyxkMTEsZDEwCisgICAgVlNIUi5VMTYgcTExLHExMSwjMQorICAgIFZIQURELlUxNiBxMTEscTEyLHExMQorICAgIFZBRERXLlU4IHExMixxMTIsZDEwCisgICAgVkhBREQuVTggZDI4LGQ4LGQ1CisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKKyAgICBWU1JBLlUxNiBxMTMscTEyLCMxCisgICAgVlFSU0hSTi5VMTYgZDI1LHExMiwjMgorICAgIFZRUlNIUk4uVTE2IGQyNCxxMTEsIzEKKyAgICBWUkhBREQuVTggZDIyLGQyOCxkOQorICAgIFZCSUYgICAgIGQyNSxkOSxkMTIKKyAgICBWQklGICAgICBkMzEsZDYsZDE3CisgICAgVkJJRiAgICAgZDI0LGQyMixkMTIKKyAgICBWUVJTSFJOLlUxNiBkMjgscTEzLCMyCisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIFZCSUYgICAgIGQyOCxkMTAsZDEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4YmQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCithcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcjoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFNVQiAgICAgIHNwLHNwLCMweDQwCisgICAgTERSICAgICAgcjEwLFtyMCwjMF0KKyAgICBMRFIgICAgICByMTIsW3IxLCMwXQorICAgIExEUiAgICAgIHI2LCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjhdCisgICAgTERSQiAgICAgcjksW3IxMCwjMl0KKyAgICBMRFJCICAgICByOCxbcjEwLCMxXQorICAgIExEUkIgICAgIHIxMSxbcjEwXSwjMworICAgIEFERCAgICAgIHIxMixyMTIsIzgKKyAgICBMRFIgICAgICByNixbcjYscjQsTFNMICMyXQorICAgIE9SUiAgICAgIHI5LHI5LHI4LExTTCAjOAorICAgIE9SUiAgICAgIHIxMSxyOSxyMTEsTFNMICMxNgorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHgxZQorICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKKyAgICBTVUJTICAgICByMTIscjEyLCM4CitMMHg0NDoKKyAgICBCQ0MgICAgICBMMQorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMToKKyAgICBMRFJIICAgICByNyxbcjYscjddCisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIEFERCAgICAgIHIxMixyMTIsIzQKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgQkNTICAgICAgTDB4NzQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCisgICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQorICAgIEJJQyAgICAgIHI3LHI3LCMxCisgICAgQiAgICAgICAgTDB4NDQKK0wweDc0OgorICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMworICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKKyAgICBMU1JTICAgICByNSxyNywjMgorICAgIFNUUkIgICAgIHI1LFtyMiwjMF0KKyAgICBCRVEgICAgICBMMHgzNDQKKyAgICBDTVAgICAgICByNywjMHg0NAorICAgIEJHRSAgICAgIEwweDMzYworICAgIFNUUiAgICAgIHIwLFtzcCwjMF0KKyAgICBTVFIgICAgICByMSxbc3AsIzRdCisgICAgU1RSICAgICAgcjMsW3NwLCM4XQorICAgIEFORFMgICAgIHIxLHI3LCMzCisgICAgQUREICAgICAgcjIsc3AsIzB4YworICAgIEJFUSAgICAgIEwweGQ4CisgICAgTU9WICAgICAgcjAscjEKK0wweGFjOgorICAgIExTTFMgICAgIHI3LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCM3CisgICAgQkNDICAgICAgTDIKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDI6CisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIExTUiAgICAgIHI3LHI3LCMzMQorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBNT1YgICAgICByOCwjMQorICAgIFNVQiAgICAgIHI4LHI4LHI3LExTTCAjMQorICAgIFNUUkggICAgIHI4LFtyMl0sIzIKKyAgICBCR1QgICAgICBMMHhhYworTDB4ZDg6CisgICAgU1VCUyAgICAgcjAscjUscjEKKyAgICBCRVEgICAgICBMMHgxYjgKKyAgICBNT1YgICAgICByNCwjMQorICAgIENNUCAgICAgIHI1LCMweGEKKyAgICBNT1ZMRSAgICByNCwjMAorICAgIENNUCAgICAgIHIxLCMzCisgICAgTU9WTFQgICAgcjEsIzQKKyAgICBNT1ZHRSAgICByMSwjMgorICAgIE1PVkdFICAgIHI0LCMwCitMMHhmYzoKKyAgICBMU0xTICAgICByNyxyMTEscjEyCisgICAgQ0xaICAgICAgcjcscjcKKyAgICBBREQgICAgICByMTIscjEyLHI3CisgICAgU1VCUyAgICAgcjEyLHIxMiwjNworICAgIEJDQyAgICAgIEwzCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKKyAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBCQ0MgICAgICBMMworICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMzoKKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBDTVAgICAgICByNywjMHgxMAorICAgIEJHRSAgICAgIEwweDMzYworICAgIE1PVlMgICAgIGxyLHI0CisgICAgVEVRRVEgICAgcjcsIzB4ZQorICAgIE1PVkVRICAgIGxyLCM0CisgICAgVEVRICAgICAgcjcsIzB4ZgorICAgIE1PVkVRICAgIGxyLCMweGMKKyAgICBURVFFUSAgICByNCwjMAorICAgIEFEREVRICAgIHI3LHI3LCMweGYKKyAgICBURVEgICAgICBsciwjMAorICAgIEJFUSAgICAgIEwweDE4NAorICAgIExTTCAgICAgIHIzLHIxMSxyMTIKKyAgICBBREQgICAgICByMTIscjEyLGxyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIFJTQiAgICAgIHI5LGxyLCMweDIwCisgICAgQkNDICAgICAgTDQKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIEJDQyAgICAgIEw0CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w0OgorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBMU1IgICAgICByMyxyMyxyOQorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNMICAgICAgcjcscjcscjQKKyAgICBBREQgICAgICByNyxyMyxyNworTDB4MTg0OgorICAgIEFERCAgICAgIHI3LHI3LHIxCisgICAgTU9WICAgICAgcjEsIzIKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIFJTQkNTICAgIHI4LHI4LCMwCisgICAgU1RSSCAgICAgcjgsW3IyXSwjMgorICAgIExEUiAgICAgIHI5LCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgTERSU0IgICAgcjgsW3I5LHI0XQorICAgIFRFUSAgICAgIHI0LCMwCisgICAgTU9WRVEgICAgcjQsIzEKKyAgICBDTVAgICAgICByNyxyOAorICAgIEFERENTICAgIHI0LHI0LCMxCisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBCR1QgICAgICBMMHhmYworTDB4MWI4OgorICAgIExEUiAgICAgIHI4LFtzcCwjMHg2Y10KKyAgICBTVUIgICAgICByMCxyNSwjMQorICAgIFNVQlMgICAgIHIxLHI4LHI1CisgICAgQUREICAgICAgcjQsc3AsIzB4MmMKKyAgICBNT1YgICAgICBscixyNQorICAgIFNVQiAgICAgIGxyLGxyLCMxCisgICAgQkVRICAgICAgTDB4MmIwCisgICAgVEVRICAgICAgcjgsIzQKKyAgICBMRFJFUSAgICByNiwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcyAtIDQpCisgICAgTERSTkUgICAgcjYsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcyAtIDQpCisgICAgTERSICAgICAgcjYsW3I2LHI1LExTTCAjMl0KKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgTU9WUyAgICAgcjcsIzB4MWUKKyAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorTDB4MWY0OgorICAgIEJDQyAgICAgIEw1CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w1OgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjNAorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHgyMjQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjMHhhCisgICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQorICAgIEJJQyAgICAgIHI3LHI3LCMxCisgICAgQiAgICAgICAgTDB4MWY0CitMMHgyMjQ6CisgICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCisgICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAorICAgIENNUCAgICAgIHI3LCMweDEwCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgTERSICAgICAgcjMsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcyAtIDQpCisgICAgQUREICAgICAgcjQsc3AsIzB4MmMKKyAgICBNT1ZTICAgICByMSxyNworICAgIEFERCAgICAgIGxyLGxyLHIxCisgICAgQkVRICAgICAgTDB4MmIwCitMMHgyNDg6CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBMRFIgICAgICByNixbcjMscjEsTFNMICMyXQorICAgIEJMVCAgICAgIEwweDJiYworICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHhlCisgICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyOAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKK0wweDI2NDoKKyAgICBCQ0MgICAgICBMNgorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMNjoKKyAgICBMRFJIICAgICByNyxbcjYscjddCisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIEFERCAgICAgIHIxMixyMTIsIzMKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgQkNTICAgICAgTDB4Mjk0CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzkKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHgyNjQKK0wweDI5NDoKKyAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKKyAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCisgICAgQ01QICAgICAgcjcsIzB4ZgorICAgIEJHRSAgICAgIEwweDMzYworICAgIFNVQlMgICAgIHIxLHIxLHI3CisgICAgU1RSQiAgICAgcjcsW3I0XSwjMQorICAgIEJHVCAgICAgIEwweDI0OAorTDB4MmIwOgorICAgIFNVQlMgICAgIHIwLHIwLCMxCisgICAgQkxUICAgICAgTDcKKyAgICBTVFJCICAgICByMSxbcjRdLCMxCitMNzoKKyAgICBCR1QgICAgICBMMHgyYjAKK0wweDJiYzoKKyAgICBTVFJCICAgICByMSxbcjRdLCMxCisgICAgTERSICAgICAgcjgsW3NwLCMweDZjXQorICAgIFRFUSAgICAgIHI4LCMweGYKKyAgICBBRERFUSAgICBscixsciwjMQorICAgIFNVQiAgICAgIHI0LHI0LHI1CisgICAgU1VCICAgICAgcjIscjIscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIExEUiAgICAgIHIzLFtzcCwjOF0KKyAgICBMRFIgICAgICByMCxbcjMsIzBdCisgICAgVEVRICAgICAgcjgsIzQKKyAgICBMRFJFUSAgICByNiwgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgIExEUk5FICAgIHI2LCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CitMMHgyZWM6CisgICAgTERSQiAgICAgcjksW3I0XSwjMQorICAgIExEUkIgICAgIHI4LFtyNixscl0KKyAgICBTVUIgICAgICBscixsciwjMQorICAgIFNVQiAgICAgIGxyLGxyLHI5CisgICAgTERSU0ggICAgcjksW3IyXSwjMgorICAgIFNVQlMgICAgIHI1LHI1LCMxCisgICAgT1JSRVEgICAgcjgscjgsIzB4MjAKKyAgICBBREQgICAgICByMSxyOSwjMHg4MAorICAgIENNUCAgICAgIHIxLCMweDEwMAorICAgIE9SUkNTICAgIHI4LHI4LCMweDEwCisgICAgVEVRICAgICAgcjUsIzAKKyAgICBTVFJCICAgICByOCxbcjBdLCMxCisgICAgU1RSQiAgICAgcjksW3IwXSwjMQorICAgIExTUiAgICAgIHI5LHI5LCM4CisgICAgQkNDICAgICAgTDgKKyAgICBTVFJCICAgICByOSxbcjBdLCMxCitMODoKKyAgICBCTkUgICAgICBMMHgyZWMKKyAgICBTVFIgICAgICByMCxbcjMsIzBdCisgICAgTERSICAgICAgcjAsW3NwLCMwXQorICAgIExEUiAgICAgIHIxLFtzcCwjNF0KKyAgICBCICAgICAgICBMMHgzNDQKK0wweDMzYzoKKyAgICBNVk4gICAgICByMCwjMQorICAgIEIgICAgICAgIEwweDM1YworTDB4MzQ0OgorICAgIEFERCAgICAgIHIxMCxyMTAscjEyLExTUiAjMworICAgIEFORCAgICAgIHIxMixyMTIsIzcKKyAgICBTVUIgICAgICByMTAscjEwLCM0CisgICAgU1RSICAgICAgcjEyLFtyMSwjMF0KKyAgICBTVFIgICAgICByMTAsW3IwLCMwXQorICAgIE1PViAgICAgIHIwLCMwCitMMHgzNWM6CisgICAgQUREICAgICAgc3Asc3AsIzB4NDAKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWI0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorCithcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKKyAgICAuYnl0ZSAgMCwgMiwgMCwgMgorICAgIC5ieXRlICAyLCAxLCAyLCAxCisgICAgLmJ5dGUgIDAsIDIsIDAsIDIKKyAgICAuYnl0ZSAgMiwgMSwgMiwgMQorCithcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MjoKKyAgICAuYnl0ZSAgMCwgMgorICAgIC5ieXRlICAyLCAxCisKK2FybVZDTTRQMTBfVk1hdHJpeDoKKyAgICAuYnl0ZSAgMTAsIDE2LCAxMworICAgIC5ieXRlICAxMSwgMTgsIDE0CisgICAgLmJ5dGUgIDEzLCAyMCwgMTYKKyAgICAuYnl0ZSAgMTQsIDIzLCAxOAorICAgIC5ieXRlICAxNiwgMjUsIDIwCisgICAgLmJ5dGUgIDE4LCAyOSwgMjMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfUVBEaXZUYWJsZToKKyAgICAuYnl0ZSAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgLmJ5dGUgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgIC5ieXRlICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAuYnl0ZSAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgLmJ5dGUgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgIC5ieXRlICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAuYnl0ZSAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgLmJ5dGUgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgIC5ieXRlICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGU6CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1FQTW9kdWxvVGFibGU6CisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKKzsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfVk1hdHJpeFUxNjoKKyAgICAuaHdvcmQgMTAsIDE2LCAxMworICAgIC5od29yZCAxMSwgMTgsIDE0CisgICAgLmh3b3JkIDEzLCAyMCwgMTYKKyAgICAuaHdvcmQgMTQsIDIzLCAxOAorICAgIC5od29yZCAxNiwgMjUsIDIwCisgICAgLmh3b3JkIDE4LCAyOSwgMjMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYzY5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmU6CisgICAgTU9WICAgICAgcjEyLHI4CisgICAgQU5EICAgICAgcjcscjAsIzMKKyAgICBCSUMgICAgICByMCxyMCwjMworICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHkwdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weTF0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5MnRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkzdG9BbGlnbmVkCitDb3B5MHRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkwdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weUVuZAorQ29weTF0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIExTUiAgICAgIHI3LHI3LCM4CisgICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMjQKKyAgICBMU1IgICAgICByMTAscjEwLCM4CisgICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMyNAorICAgIExTUiAgICAgIHIxMSxyMTEsIzgKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTF0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5RW5kCitDb3B5MnRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgTFNSICAgICAgcjcscjcsIzE2CisgICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMTYKKyAgICBMU1IgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5MnRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlFbmQKK0NvcHkzdG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBMU1IgICAgICByNyxyNywjMjQKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICM4CisgICAgTFNSICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzgKKyAgICBMU1IgICAgICByMTEscjExLCMyNAorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5M3RvQWxpZ25lZAorQ29weUVuZDoKKyAgICBNT1YgICAgICByMCxyMTIKKyAgICBNT1YgICAgICByMSwjMHhjCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlOgorICAgIEFORCAgICAgIHI3LHIwLCMzCisgICAgQklDICAgICAgcjAscjAsIzMKKyAgICBBREQgICAgICBwYyxwYyxyNyxMU0wgIzIKKyAgICBOT1AKKyAgICBCICAgICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5M3RvVkFsaWduZWQKK0NvcHkwdG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTB0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weVZFbmQKK0NvcHkxdG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByMTAsW3IwLCM0XQorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIExTTCAgICAgIHIxMCxyMTAsIzI0CisgICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjOAorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTJ0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICMxNgorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MnRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTN0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjOAorICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzI0CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkzdG9WQWxpZ25lZAorQ29weVZFbmQ6CisgICAgU1VCICAgICAgcjAscjgsIzB4MWMKKyAgICBNT1YgICAgICByMSwjNAorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTIyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIEFORCAgICAgIHIxMixyMCwjMworICAgIEJJQyAgICAgIHIwLHIwLCMzCisgICAgQUREICAgICAgcGMscGMscjEyLExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjAKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24xCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMgorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjMKK0NvcHk0eDRBbGlnbjA6CisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI1LFtyMF0scjEKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBMRFIgICAgICByOSxbcjBdLHIxCisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIFNUUiAgICAgIHI5LFtyMl0scjMKKyAgICBCICAgICAgICBDb3B5NHg0RW5kCitDb3B5NHg0QWxpZ24xOgorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjOAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzgKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjOAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMjQKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzgKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzI0CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjI6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMxNgorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzE2CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzE2CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMTYKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjM6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMyNAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMjQKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMyNAorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMjQKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzgKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCitDb3B5NHg0RW5kOgorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRhYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTU9WICAgICAgbHIsIzQKKyAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAorICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCitMb29wU3RhcnQxOgorICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KKyAgICBMRFIgICAgICByMTAsW3IwLCM4XQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgVVFTVUIxNiAgcjExLHIxMSxyNgorICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKKyAgICBVUVNVQjE2ICByNSxyNSxyNgorICAgIFVRU1VCMTYgIHI0LHI0LHI2CisgICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKKyAgICBVU0FUMTYgICByMTAsIzEzLHIxMAorICAgIFVTQVQxNiAgIHI1LCMxMyxyNQorICAgIFVTQVQxNiAgIHI0LCMxMyxyNAorICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQorICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQorICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKKyAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1CisgICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4CisgICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAorICAgIFNVQlMgICAgIGxyLGxyLCMxCisgICAgU1RSRCAgICAgcjEwLHIxMSxbcjddLCM4CisgICAgQkdUICAgICAgTG9vcFN0YXJ0MQorICAgIFNVQiAgICAgIHIwLHI3LCMweDIwCisgICAgTU9WICAgICAgcjEsIzgKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjYsID0weGZlMDBmZTAKKyAgICBMRFIgICAgICByMTIsID0weGZmMDBmZgorICAgIE1PViAgICAgIGxyLCMyCitMb29wU3RhcnQ6CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2CisgICAgU1RSICAgICAgcjQsW3I3XSwjOAorICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgorICAgIFNUUiAgICAgIHI1LFtyN10sIy00CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgUEtIQlQgICAgcjQscjEwLHIxMSxMU0wgIzE2CisgICAgU1VCUyAgICAgbHIsbHIsIzEKKyAgICBTVFIgICAgICByNCxbcjddLCM4CisgICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2CisgICAgU1RSICAgICAgcjUsW3I3XSwjNAorICAgIEJHVCAgICAgIExvb3BTdGFydAorICAgIFNVQiAgICAgIHIwLHI3LCMweDE4CisgICAgTU9WICAgICAgcjEsIzQKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzMDk3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTUsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMTAsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNixkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxMCxkMTAsZDgKKyAgICBWTUxBLkkxNiBkMTIsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNyxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxMixkMTIsZDgKKyAgICBWTUxBLkkxNiBkMTQsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxOCxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxNCxkMTQsZDgKKyAgICBWTUxBLkkxNiBkMTYsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxOSxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxNixkMTYsZDgKKyAgICBWTUxBLkkxNiBkMTgsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTAsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTgsZDE4LGQ4CisgICAgVk1MQS5JMTYgZDIwLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTExLGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDIwLGQyMCxkOAorICAgIFZNTEEuSTE2IGQyMixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMixkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQyMixkMjIsZDgKKyAgICBWTUxBLkkxNiBkMjQsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTMsZDAsZDEKKyAgICBWU1VCLkkxNiBkMjQsZDI0LGQ4CisgICAgVk1MQS5JMTYgZDI2LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZNT1YuSTMyIHExNSwjMHgxNAorICAgIFZNT1YuSTMyIHExNCwjMHg1CisgICAgVkFEREwuUzE2IHE1LGQxMCxkMjAKKyAgICBWQURETC5TMTYgcTEsZDE0LGQxNgorICAgIFZBRERMLlMxNiBxMCxkMTIsZDE4CisgICAgVlNVQi5JMTYgZDI2LGQyNixkOAorICAgIFZNTEEuSTMyIHE1LHExLHExNQorICAgIFZNVUwuSTMyIHE0LHEwLHExNAorICAgIFZBRERMLlMxNiBxNixkMTIsZDIyCisgICAgVkFEREwuUzE2IHExLGQxNixkMTgKKyAgICBWQURETC5TMTYgcTAsZDE0LGQyMAorICAgIFZNTEEuSTMyIHE2LHExLHExNQorICAgIFZTVUIuSTMyIHE1LHE1LHE0CisgICAgVk1VTC5JMzIgcTQscTAscTE0CisgICAgVkFEREwuUzE2IHEyLGQxNCxkMjQKKyAgICBWQURETC5TMTYgcTEsZDE4LGQyMAorICAgIFZBRERMLlMxNiBxMCxkMTYsZDIyCisgICAgVk1MQS5JMzIgcTIscTEscTE1CisgICAgVlNVQi5JMzIgcTYscTYscTQKKyAgICBWTVVMLkkzMiBxNCxxMCxxMTQKKyAgICBWQURETC5TMTYgcTMsZDE2LGQyNgorICAgIFZBRERMLlMxNiBxMSxkMjAsZDIyCisgICAgVkFEREwuUzE2IHEwLGQxOCxkMjQKKyAgICBWTUxBLkkzMiBxMyxxMSxxMTUKKyAgICBWU1VCLkkzMiBxMixxMixxNAorICAgIFZNTFMuSTMyIHEzLHEwLHExNAorICAgIFZRUlNIUlVOLlMzMiBkMCxxNSwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDIscTYsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKKyAgICBWUU1PVk4uVTE2IGQwLHEwCisgICAgVlFNT1ZOLlUxNiBkMixxMQorICAgIFZRTU9WTi5VMTYgZDQscTIKKyAgICBWUU1PVk4uVTE2IGQ2LHEzCisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTFjMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKKyAgICBWTU9WLkk4ICBkMzAsIzB4NQorICAgIFZNT1YuSTggIGQzMSwjMHgxNAorICAgIFZMRDEuOCAgIHtkMTAsZDExfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMixkM30sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTIsZDEzfSxbcjEyXSxyMQorICAgIFZBRERMLlU4IHE5LGQwLGQxMAorICAgIFZMRDEuOCAgIHtkNCxkNX0sW3IwXSxyMQorICAgIFZBRERMLlU4IHEwLGQxLGQxMQorICAgIFZMRDEuOCAgIHtkNixkN30sW3IwXSxyMQorICAgIFZBRERMLlU4IHExMCxkMixkMTIKKyAgICBWTEQxLjggICB7ZDgsZDl9LFtyMF0scjEKKyAgICBWTUxBTC5VOCBxOSxkNCxkMzEKKyAgICBWTEQxLjggICB7ZDE0LGQxNX0sW3IxMl0scjEKKyAgICBWTUxBTC5VOCBxMCxkNSxkMzEKKyAgICBWTEQxLjggICB7ZDE2LGQxN30sW3IxMl0scjEKKyAgICBWTUxBTC5VOCBxOSxkNixkMzEKKyAgICBWTUxBTC5VOCBxMTAsZDYsZDMxCisgICAgVk1MU0wuVTggcTAsZDMsZDMwCisgICAgVkFEREwuVTggcTExLGQ0LGQxNAorICAgIFZNTFNMLlU4IHE5LGQyLGQzMAorICAgIFZBRERMLlU4IHExLGQzLGQxMworICAgIFZNTEFMLlU4IHEwLGQ3LGQzMQorICAgIFZNTEFMLlU4IHExMCxkOCxkMzEKKyAgICBWTUxTTC5VOCBxOSxkOCxkMzAKKyAgICBWTUxBTC5VOCBxMSxkNyxkMzEKKyAgICBWTUxTTC5VOCBxMCxkOSxkMzAKKyAgICBWTUxBTC5VOCBxMTEsZDgsZDMxCisgICAgVk1MU0wuVTggcTEwLGQ0LGQzMAorICAgIFZNTFNMLlU4IHExLGQ1LGQzMAorICAgIFZBRERMLlU4IHEyLGQ1LGQxNQorICAgIFZNTEFMLlU4IHExMSxkMTAsZDMxCisgICAgVk1MU0wuVTggcTEwLGQxMCxkMzAKKyAgICBWTUxBTC5VOCBxMSxkOSxkMzEKKyAgICBWTUxBTC5VOCBxMixkOSxkMzEKKyAgICBWQURETC5VOCBxMTIsZDYsZDE2CisgICAgVk1MU0wuVTggcTExLGQ2LGQzMAorICAgIFZNTFNMLlU4IHExLGQxMSxkMzAKKyAgICBWTUxTTC5VOCBxMixkNyxkMzAKKyAgICBWQURETC5VOCBxMyxkNyxkMTcKKyAgICBWTUxBTC5VOCBxMTIsZDEwLGQzMQorICAgIFZNTFNMLlU4IHExMSxkMTIsZDMwCisgICAgVk1MU0wuVTggcTIsZDEzLGQzMAorICAgIFZNTEFMLlU4IHEzLGQxMSxkMzEKKyAgICBWTUxBTC5VOCBxMTIsZDEyLGQzMQorICAgIFZFWFQuOCAgIGQyNixkMTgsZDE5LCMyCisgICAgVk1MQUwuVTggcTIsZDExLGQzMQorICAgIFZNTEFMLlU4IHEzLGQxMyxkMzEKKyAgICBWTUxTTC5VOCBxMTIsZDgsZDMwCisgICAgVkVYVC44ICAgZDI3LGQxOCxkMTksIzQKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTUxTTC5VOCBxMyxkOSxkMzAKKyAgICBWTUxTTC5VOCBxMTIsZDE0LGQzMAorICAgIFZFWFQuOCAgIGQyOSxkMTksZDAsIzIKKyAgICBWRVhULjggICBkMjgsZDE4LGQxOSwjNgorICAgIFZNTFNMLlU4IHEzLGQxNSxkMzAKKyAgICBWQURETC5TMTYgcTAsZDE4LGQyOQorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVk1PVi5JMTYgZDMwLCMweDUKKyAgICBWQURELkkxNiBkMjYsZDI2LGQxOQorICAgIFZNTEFMLlMxNiBxMCxkMjcsZDMxCisgICAgVkVYVC44ICAgZDI3LGQyMCxkMjEsIzQKKyAgICBWRVhULjggICBkMjgsZDIwLGQyMSwjNgorICAgIFZFWFQuOCAgIGQyOSxkMjEsZDIsIzIKKyAgICBWTUxTTC5TMTYgcTAsZDI2LGQzMAorICAgIFZFWFQuOCAgIGQyNixkMjAsZDIxLCMyCisgICAgVkFEREwuUzE2IHExLGQyMCxkMjkKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZBREQuSTE2IGQyNixkMjYsZDIxCisgICAgVkVYVC44ICAgZDI4LGQyMixkMjMsIzYKKyAgICBWTUxBTC5TMTYgcTEsZDI3LGQzMQorICAgIFZFWFQuOCAgIGQyOSxkMjMsZDQsIzIKKyAgICBWRVhULjggICBkMjcsZDIyLGQyMywjNAorICAgIFZFWFQuOCAgIGQ4LGQyMixkMjMsIzIKKyAgICBWQURETC5TMTYgcTIsZDIyLGQyOQorICAgIFZNTFNMLlMxNiBxMSxkMjYsZDMwCisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWQURELkkxNiBkMjYsZDgsZDIzCisgICAgVkVYVC44ICAgZDI4LGQyNCxkMjUsIzYKKyAgICBWTUxBTC5TMTYgcTIsZDI3LGQzMQorICAgIFZFWFQuOCAgIGQyNyxkMjQsZDI1LCM0CisgICAgVkVYVC44ICAgZDI5LGQyNSxkNiwjMgorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVkVYVC44ICAgZDgsZDI0LGQyNSwjMgorICAgIFZBRERMLlMxNiBxMyxkMjQsZDI5CisgICAgVk1MU0wuUzE2IHEyLGQyNixkMzAKKyAgICBWTUxBTC5TMTYgcTMsZDI3LGQzMQorICAgIFZBREQuSTE2IGQ4LGQ4LGQyNQorICAgIFZNTFNMLlMxNiBxMyxkOCxkMzAKKyAgICBWUVJTSFJVTi5TMzIgZDAscTAsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQyLHExLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCisgICAgVlFNT1ZOLlUxNiBkMCxxMAorICAgIFZRTU9WTi5VMTYgZDIscTEKKyAgICBWUU1PVk4uVTE2IGQ0LHEyCisgICAgVlFNT1ZOLlUxNiBkNixxMworICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTE0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMjIsZDIzfSxbcjBdLHIxCisgICAgVkVYVC44ICAgZDEwLGQyMixkMjMsIzUKKyAgICBWRVhULjggICBkMTIsZDIyLGQyMywjMQorICAgIFZFWFQuOCAgIGQxNCxkMjIsZDIzLCMyCisgICAgVkVYVC44ICAgZDE1LGQyMixkMjMsIzMKKyAgICBWRVhULjggICBkMTMsZDIyLGQyMywjNAorICAgIFZBRERMLlU4IHExMSxkMjIsZDEwCisgICAgVkFEREwuVTggcTQsZDE0LGQxNQorICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTEQxLjggICB7ZDI0LGQyNX0sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQyMixkOCxkMzEKKyAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCisgICAgVkVYVC44ICAgZDEwLGQyNCxkMjUsIzUKKyAgICBWRVhULjggICBkMTIsZDI0LGQyNSwjMQorICAgIFZFWFQuOCAgIGQxNixkMjQsZDI1LCMyCisgICAgVkVYVC44ICAgZDE3LGQyNCxkMjUsIzMKKyAgICBWRVhULjggICBkMTMsZDI0LGQyNSwjNAorICAgIFZBRERMLlU4IHExMixkMjQsZDEwCisgICAgVlNVQi5JMTYgZDIyLGQyMixkOAorICAgIFZBRERMLlU4IHE0LGQxNixkMTcKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVkxEMS44ICAge2QyNixkMjd9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMjQsZDgsZDMxCisgICAgVk1VTC5JMTYgZDgsZDEyLGQzMAorICAgIFZFWFQuOCAgIGQxMCxkMjYsZDI3LCM1CisgICAgVkVYVC44ICAgZDEyLGQyNixkMjcsIzEKKyAgICBWRVhULjggICBkMTgsZDI2LGQyNywjMgorICAgIFZFWFQuOCAgIGQxOSxkMjYsZDI3LCMzCisgICAgVkVYVC44ICAgZDEzLGQyNixkMjcsIzQKKyAgICBWQURETC5VOCBxMTMsZDI2LGQxMAorICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKKyAgICBWQURETC5VOCBxNCxkMTgsZDE5CisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZMRDEuOCAgIHtkMjgsZDI5fSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDI2LGQ4LGQzMQorICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKKyAgICBWRVhULjggICBkMTAsZDI4LGQyOSwjNQorICAgIFZFWFQuOCAgIGQxMixkMjgsZDI5LCMxCisgICAgVkVYVC44ICAgZDIwLGQyOCxkMjksIzIKKyAgICBWRVhULjggICBkMjEsZDI4LGQyOSwjMworICAgIFZFWFQuOCAgIGQxMyxkMjgsZDI5LCM0CisgICAgVkFEREwuVTggcTE0LGQyOCxkMTAKKyAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4CisgICAgVkFEREwuVTggcTQsZDIwLGQyMQorICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTUxBLkkxNiBkMjgsZDgsZDMxCisgICAgVk1MUy5JMTYgZDI4LGQxMixkMzAKKyAgICBWUVJTSFJVTi5TMTYgZDIyLHExMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjQscTEyLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyNixxMTMsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDI4LHExNCwjNQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTg0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMQorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDEyfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQorICAgIFZBRERMLlU4IHEwLGQ3LGQxMgorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDEzfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDE0fSxbcjEyXSxyMQorICAgIFZBRERMLlU4IHE4LGQ4LGQxMQorICAgIFZBRERMLlU4IHE5LGQ5LGQxMAorICAgIFZMRDEuOCAgIHtkMTV9LFtyMTJdLHIxCisgICAgVk1MUy5JMTYgZDAsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMCxkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDksZDEyCisgICAgVkFEREwuVTggcTksZDEwLGQxMQorICAgIFZBRERMLlU4IHExLGQ4LGQxMworICAgIFZNTFMuSTE2IGQyLGQxNixkMzAKKyAgICBWTVVMLkkxNiBkMjEsZDE4LGQzMQorICAgIFZBRERMLlU4IHE4LGQxMCxkMTMKKyAgICBWQURETC5VOCBxOSxkMTEsZDEyCisgICAgVkFEREwuVTggcTIsZDksZDE0CisgICAgVk1MUy5JMTYgZDQsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMixkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDExLGQxNAorICAgIFZBRERMLlU4IHEzLGQxMCxkMTUKKyAgICBWQURETC5VOCBxOSxkMTIsZDEzCisgICAgVk1MUy5JMTYgZDYsZDE2LGQzMAorICAgIFZBREQuSTE2IGQwLGQwLGQyMAorICAgIFZBREQuSTE2IGQyLGQyLGQyMQorICAgIFZBREQuSTE2IGQ0LGQ0LGQyMgorICAgIFZNTEEuSTE2IGQ2LGQxOCxkMzEKKyAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIscTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDQscTIsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDYscTMsIzUKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUyMGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybzoKKyAgICAud29yZCAgIFdpZHRoSXMyTVZJc05vdFplcm8sIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICAud29yZCAgIFdpZHRoSXM0TVZJc05vdFplcm8sIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICAud29yZCAgIFdpZHRoSXM4TVZJc05vdFplcm8KKworYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm86CisgICAgLndvcmQgICBXaWR0aElzMk1WSXNaZXJvLCBXaWR0aElzMk1WSXNaZXJvCisgICAgLndvcmQgICBXaWR0aElzNE1WSXNaZXJvLCBXaWR0aElzNE1WSXNaZXJvCisgICAgLndvcmQgICBXaWR0aElzOE1WSXNaZXJvCisKKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NzBdCisgICAgTERSRCAgICAgcjQscjUsW3NwLCMweDY4XQorICAgIFJTQiAgICAgIHI4LHI2LCM4CisgICAgUlNCICAgICAgcjkscjcsIzgKKyAgICBDTU4gICAgICByNixyNworICAgIE1PViAgICAgIHIxMCwjMQorICAgIExEUkVRICAgIHIxMSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCisgICAgU1VCICAgICAgbHIscjEscjEwCisgICAgTERSTkUgICAgcjExLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgU01VTEJCICAgcjEyLHI4LHI5CisgICAgU01VTEJCICAgcjkscjYscjkKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTTVVMQkIgICByOCxyOCxyNworICAgIFNNVUxCQiAgIHI2LHI2LHI3CisgICAgVkRVUC44ICAgZDEyLHIxMgorICAgIFZEVVAuOCAgIGQxMyxyOQorICAgIFZEVVAuOCAgIGQxNCxyOAorICAgIFZEVVAuOCAgIGQxNSxyNgorICAgIExEUiAgICAgIHBjLFtyMTEscjQsTFNMICMxXQorCitXaWR0aElzOE1WSXNOb3RaZXJvOgorICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKKyAgICBWTVVMTC5VOCBxMixkMCxkMTIKKyAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKKyAgICBWTVVMTC5VOCBxMyxkMixkMTIKKyAgICBWTEQxLjggICB7ZDE2fSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZMRDEuOCAgIHtkMTd9LFtyMF0sbHIKKyAgICBWTVVMTC5VOCBxMTEsZDE2LGQxMgorICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMTh9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDIsZDE0CisgICAgVk1MQUwuVTggcTExLGQxNyxkMTMKKyAgICBWTVVMTC5VOCBxMTIsZDE4LGQxMgorICAgIFZMRDEuOCAgIHtkMTl9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMyxkMTYsZDE0CisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHExMixkMTksZDEzCisgICAgVk1MQUwuVTggcTExLGQxOCxkMTQKKyAgICBWTUxBTC5VOCBxMixkMyxkMTUKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMTIsZDAsZDE0CisgICAgVk1MQUwuVTggcTMsZDE3LGQxNQorICAgIFZNTEFMLlU4IHExMSxkMTksZDE1CisgICAgU1VCUyAgICAgcjUscjUsIzQKKyAgICBWTUxBTC5VOCBxMTIsZDEsZDE1CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgorICAgIFZRUlNIUk4uVTE2IGQyMCxxMTEsIzYKKyAgICBWU1QxLjY0ICB7ZDh9LFtyMl0scjMKKyAgICBWUVJTSFJOLlUxNiBkMjEscTEyLCM2CisgICAgVlNUMS42NCAge2Q5fSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QyMH0sW3IyXSxyMworICAgIFZTVDEuNjQgIHtkMjF9LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXM0TVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMyxkMCxkMTQKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZNTEFMLlU4IHEzLGQxLGQxNQorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXMyTVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNTEFMLlU4IHEyLGQxLGQxMworICAgIFZNTEFMLlU4IHEzLGQzLGQxMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMyxkMCxkMTQKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZNTEFMLlU4IHEzLGQxLGQxNQorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKKyAgICBWU1QxLjE2ICB7ZDhbMF19LFtyMl0scjMKKyAgICBWU1QxLjE2ICB7ZDlbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzMk1WSXNOb3RaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXM4TVZJc1plcm86CisgICAgU1VCICAgICAgcjAscjAscjEKK1dpZHRoSXM4TG9vcE1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCisgICAgVlNUMS42NCAge2QwfSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QxfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczRNVklzWmVybzoKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFZTVDEuMzIgIHtkMVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczJNVklzWmVybzoKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZTVDEuMTYgIHtkMFswXX0sW3IyXSxyMworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQorICAgIFZTVDEuMTYgIHtkMVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc1plcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDZkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUwpAQCAtMCwwICsxLDY4IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGU6CisgICAgLndvcmQgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQorICAgIC53b3JkIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKKyAgICAud29yZCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCisgICAgLndvcmQgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgorICAgIC53b3JkIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKKyAgICAud29yZCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCisgICAgLndvcmQgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQorICAgIC53b3JkIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKKworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZToKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZToKKyAgICAuYnl0ZSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisgICAgLmJ5dGUgMTcsIDE3LCAxNywgMTcsIDE3LCAxNworICAgIC5ieXRlIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgICAuYnl0ZSAxOSwgMTksIDE5LCAxOSwgMTksIDE5CisgICAgLmJ5dGUgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAorICAgIC5ieXRlIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKKyAgICAuYnl0ZSAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCisgICAgLmJ5dGUgMjMsIDIzLCAyMywgMjMsIDIzLCAyMworICAgIC5ieXRlIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRkNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NDoKKyAgICBWUFVTSCAgICB7ZDh9CisgICAgVkxENC4xNiAge2QwLGQxLGQyLGQzfSxbcjFdCisgICAgVk1PVi5JMTYgZDQsIzAKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZSU0hSLlMxNiBkMCxkMCwjNgorICAgIFZSU0hSLlMxNiBkMSxkMSwjNgorICAgIFZSU0hSLlMxNiBkMixkMiwjNgorICAgIFZSU0hSLlMxNiBkMyxkMywjNgorICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIFZQT1AgICAgIHtkOH0KKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1MmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKK2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQ6CisgICAgUFVTSCAgICAge3I0LXI4LGxyfQorICAgIExEUiAgICAgIHIyLFtyMCwjMF0KKyAgICBNT1YgICAgICByNywjMHgxZgorICAgIE1PViAgICAgIHI0LCMwCisgICAgTU9WICAgICAgcjUsIzAKKyAgICBMRFJCICAgICByMyxbcjJdLCMxCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCMwXQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjOF0KKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MTBdCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCMweDE4XQordW5wYWNrTG9vcDoKKyAgICBUU1QgICAgICByMywjMHgxMAorICAgIExEUk5FU0IgIHI1LFtyMiwjMV0KKyAgICBMRFJORUIgICByNCxbcjJdLCMyCisgICAgQU5EICAgICAgcjYscjcscjMsTFNMICMxCisgICAgTERSRVFTQiAgcjQsW3IyXSwjMQorICAgIE9SUk5FICAgIHI0LHI0LHI1LExTTCAjOAorICAgIFRTVCAgICAgIHIzLCMweDIwCisgICAgTERSRVFCICAgcjMsW3IyXSwjMQorICAgIFNUUkggICAgIHI0LFtyMSxyNl0KKyAgICBCRVEgICAgICB1bnBhY2tMb29wCisgICAgU1RSICAgICAgcjIsW3IwLCMwXQorICAgIFBPUCAgICAgIHtyNC1yOCxwY30KKyAgICAuZW5kZnVuYworICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MTA1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCitvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0k6CisgICAgUFVTSCAgICAge3I0LXI5LGxyfQorICAgIE1PVlMgICAgIHI2LHIwCisgICAgU1VCICAgICAgc3Asc3AsIzB4YworICAgIE1PViAgICAgIHI5LHIxCisgICAgTU9WICAgICAgcjcscjIKKyAgICBNT1YgICAgICByOCxyMworICAgIExEUiAgICAgIHI0LFtzcCwjMHgyOF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4MmNdCisgICAgQkVRICAgICAgTDB4NTgKKyAgICBUU1QgICAgICByNiwjNworICAgIFRTVEVRICAgIHI5LCM3CisgICAgQk5FICAgICAgTDB4NTgKKyAgICBDTVAgICAgICByNywjMAorICAgIENNUE5FICAgIHI4LCMwCisgICAgQ01QTkUgICAgcjQsIzAKKyAgICBCRVEgICAgICBMMHg1OAorICAgIFRTVCAgICAgIHI0LCMzCisgICAgQk5FICAgICAgTDB4NTgKKyAgICBDTVAgICAgICByNSwjMAorICAgIEJFUSAgICAgIEwweDU4CisgICAgVFNUICAgICAgcjUsIzMKKyAgICBCRVEgICAgICBMMHg2NAorTDB4NTg6CisgICAgTVZOICAgICAgcjAsIzQKK0wweDVjOgorICAgIEFERCAgICAgIHNwLHNwLCMweGMKKyAgICBQT1AgICAgICB7cjQtcjkscGN9CitMMHg2NDoKKyAgICBTVFIgICAgICByNCxbc3AsIzBdCisgICAgTU9WICAgICAgcjMscjgKKyAgICBTVFIgICAgICByNSxbc3AsIzRdCisgICAgTU9WICAgICAgcjIscjcKKyAgICBNT1YgICAgICByMSxyOQorICAgIE1PViAgICAgIHIwLHI2CisgICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKKyAgICBDTVAgICAgICByMCwjMAorICAgIEJORSAgICAgIEwweDVjCisgICAgQUREICAgICAgcjMscjUsIzB4MTAKKyAgICBBREQgICAgICByMixyNCwjMHgxMAorICAgIFNUUiAgICAgIHIzLFtzcCwjNF0KKyAgICBTVFIgICAgICByMixbc3AsIzBdCisgICAgQUREICAgICAgcjMscjgsIzIKKyAgICBBREQgICAgICByMixyNywjMgorICAgIE1PViAgICAgIHIxLHI5CisgICAgTU9WICAgICAgcjAscjYKKyAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQorICAgIEFERCAgICAgIHNwLHNwLCMweGMKKyAgICBQT1AgICAgICB7cjQtcjkscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIxZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKK29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQ6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDl9CisgICAgU1VCICAgICAgc3Asc3AsIzB4MjAKKyAgICBBREQgICAgICByNCxzcCwjMAorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KKyAgICBNT1YgICAgICByNyxyMQorICAgIE1PViAgICAgIHI4LHIyCisgICAgTU9WICAgICAgcjkscjMKKyAgICBDTVAgICAgICByNSwjMAorICAgIEJFUSAgICAgIEwweDExNAorICAgIE1PViAgICAgIHIxLHI0CisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAgOy8vCisgICAgTERSICAgICAgcjEsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHIxMSwgPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgIExEUiAgICAgIHIxMCwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIExEUiAgICAgIHIyLCAgPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgIExEUlNCICAgIHIxMixbcjExLHIxXQorICAgIExEUlNCICAgIGxyLFtyMTAscjFdCisgICAgTERSICAgICAgcjEwLCA9MHgzMDIwNTA0CisgICAgTERSICAgICAgcjEsID0weDUwNDAxMDAKKyAgICBBREQgICAgICByMixyMixyMTIKKyAgICBWRFVQLjMyICBkNyxyMQorICAgIFZEVVAuMzIgIGQ5LHIxMAorICAgIFZEVVAuMTYgIGQ1LGxyCisgICAgVkxEMS44ICAge2Q2fSxbcjJdCisgICAgVlRCTC44ICAgZDgse2Q2fSxkNworICAgIFZUQkwuOCAgIGQ0LHtkNn0sZDkKKyAgICBDTVAgICAgICByOCwjMAorICAgIFZMRDEuMTYgIHtkMCxkMSxkMixkM30sW3I0XQorICAgIFZTSEwuVTE2IGQ4LGQ4LGQ1CisgICAgVlNITC5VMTYgZDQsZDQsZDUKKyAgICBCRVEgICAgICBMMQorICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCitMMToKKyAgICBWTVVMLkkxNiBkMCxkMCxkOAorICAgIFZNVUwuSTE2IGQxLGQxLGQ0CisgICAgVk1VTC5JMTYgZDIsZDIsZDgKKyAgICBWTVVMLkkxNiBkMyxkMyxkNAorICAgIFZNT1ZORS4xNiBkMFswXSxyMTAKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWTU9WLkkxNiBkNCwjMAorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlJTSFIuUzE2IGQwLGQwLCM2CisgICAgVlJTSFIuUzE2IGQxLGQxLCM2CisgICAgVlJTSFIuUzE2IGQyLGQyLCM2CisgICAgVlJTSFIuUzE2IGQzLGQzLCM2CisgICAgQiAgICAgICAgTDB4MTMwCitMMHgxMTQ6CisgICAgTERSU0ggICAgcjEwLFtyOCwjMF0KKyAgICBBREQgICAgICByMTAscjEwLCMweDIwCisgICAgQVNSICAgICAgcjEwLHIxMCwjNgorICAgIFZEVVAuMTYgIGQwLHIxMAorICAgIFZEVVAuMTYgIGQxLHIxMAorICAgIFZEVVAuMTYgIGQyLHIxMAorICAgIFZEVVAuMTYgIGQzLHIxMAorTDB4MTMwOgorICAgIExEUiAgICAgIHIxLFtzcCwjMHg1OF0KKyAgICBMRFIgICAgICByMTAsW3NwLCMweDVjXQorICAgIExEUiAgICAgIHIzLFtyN10scjEKKyAgICBMRFIgICAgICByNSxbcjddLHIxCisgICAgVk1PViAgICAgZDQscjMscjUKKyAgICBMRFIgICAgICByMyxbcjddLHIxCisgICAgTERSICAgICAgcjUsW3I3LCMwXQorICAgIFZNT1YgICAgIGQ1LHIzLHI1CisgICAgVkFERFcuVTggcTMscTAsZDQKKyAgICBWQUREVy5VOCBxNCxxMSxkNQorICAgIFZRTU9WVU4uUzE2IGQwLHEzCisgICAgVlFNT1ZVTi5TMTYgZDEscTQKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyOV0scjEwCisgICAgVlNUMS4zMiAge2QwWzFdfSxbcjldLHIxMAorICAgIFZTVDEuMzIgIHtkMVswXX0sW3I5XSxyMTAKKyAgICBWU1QxLjMyICB7ZDFbMV19LFtyOV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIEFERCAgICAgIHNwLHNwLCMweDIwCisgICAgVlBPUCAgICAge2Q4LWQ5fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSQorb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEwLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgVkxEMS44ICAge2QwW119LFtyMl0hCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAscjEKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjRdCisgICAgTERSICAgICAgcjUsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCisgICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIFZNT1YuSTE2IGQxLCMweDQKKyAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAorTDB4Mzg6CisgICAgTERSICAgICAgcjYsW3I0XSwjOAorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMQorICAgIENNUCAgICAgIHI2LCMwCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIEJFUSAgICAgIEwweGU0CisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNT1YuMzIgIGQyNlswXSxyNgorICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVk1PVkwuVTggcTEzLGQyNgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQU5EICAgICBkMTYsZDE2LGQyNworICAgIFRTVCAgICAgIHI2LHI5CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIFRTVCAgICAgIHI2LHI4CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVlRTVC4xNiAgZDI2LGQyNixkMQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2CisgICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorTDB4ZTQ6CisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZGRiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKKyAgICBTVUIgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTERSICAgICAgcjgsID0weDQwNDA0MDQKKyAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMworICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgVk1PVi5JMTYgZDEsIzB4NAorICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCitMMHgzNDoKKyAgICBMRFIgICAgICByNixbcjRdLCM4CisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgQUREICAgICAgbHIscjEscjEKKyAgICBWTEQxLjggICB7ZDd9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDh9LFtyMTBdLGxyCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2QxMH0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDZ9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDl9LFtyMTBdLGxyCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2QxMX0sW3IxMF0sbHIKKyAgICBWWklQLjggICBkNyxkOAorICAgIFZaSVAuOCAgIGQ1LGQxMAorICAgIFZaSVAuOCAgIGQ2LGQ5CisgICAgVlpJUC44ICAgZDQsZDExCisgICAgVlpJUC4xNiAgZDcsZDUKKyAgICBWWklQLjE2ICBkOCxkMTAKKyAgICBWWklQLjE2ICBkNixkNAorICAgIFZaSVAuMTYgIGQ5LGQxMQorICAgIFZUUk4uMzIgIGQ3LGQ2CisgICAgVlRSTi4zMiAgZDUsZDQKKyAgICBWVFJOLjMyICBkMTAsZDExCisgICAgVlRSTi4zMiAgZDgsZDkKKyAgICBDTVAgICAgICByNiwjMAorICAgIFZBQkQuVTggIGQxOSxkNixkNAorICAgIFZBQkQuVTggIGQxMyxkNCxkOAorICAgIEJFUSAgICAgIEwweDE3MAorICAgIFZBQkQuVTggIGQxMixkNSxkNAorICAgIFZBQkQuVTggIGQxOCxkOSxkOAorICAgIFZNT1YuMzIgIGQyNlswXSxyNgorICAgIFZDR1QuVTggIGQxNixkMCxkMTMKKyAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgorICAgIFZNT1ZMLlU4IHExMyxkMjYKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVkNHVC5TMTYgZDI3LGQyNiwjMAorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWQ0dULlU4ICBkMTksZDIsZDE5CisgICAgVkFORCAgICAgZDE2LGQxNixkMjcKKyAgICBUU1QgICAgICByNixyOQorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICBUU1QgICAgICByNixyOAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICBWQklUICAgICBkMjksZDEzLGQyNgorICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2CisgICAgQUREICAgICAgcjEwLHIwLCMzCisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIEFERCAgICAgIHIxMixyMTAscjEKKyAgICBBREQgICAgICBscixyMSxyMQorICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZTVDEuOCAgIHtkMjlbMF19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVsxXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzJdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbM119LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyOVs0XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzVdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjlbNl19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVs3XX0sW3IxMl0sbHIKKyAgICBBREQgICAgICByMTIscjAsIzQKKyAgICBBREQgICAgICByMTAscjEyLHIxCisgICAgVlNUMS44ICAge2QyNFswXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzFdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjRbMl19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFszXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzRdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbNV19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyNFs2XX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzddfSxbcjEwXSxscgorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQk5FICAgICAgTDB4MzQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK0wweDE3MDoKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgQUREUyAgICAgcjcscjcscjcKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgQk5FICAgICAgTDB4MzQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NTg5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgQUREICAgICAgcjcscjIsIzEKKyAgICBBREQgICAgICByOCxyMywjMQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY4XQorICAgIE1PViAgICAgIHIxMSwjMAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgQUREICAgICAgcjEwLHIxLHIxCisgICAgTU9WICAgICAgcjksIzB4NTUwMDAwMDAKK0wweDM4OgorICAgIExEUkggICAgIHIxMixbcjRdLCMyCisgICAgQUREICAgICAgcjYscjAscjEKKyAgICBDTVAgICAgICByMTIsIzAKKyAgICBCRVEgICAgICBMMHhlNAorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDZ9LFtyNl0scjEwCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkNH0sW3I2XSxyMTAKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEwCisgICAgVkFCRC5VOCAgZDEyLGQ0LGQ1CisgICAgVkxEMS44ICAge2Q5fSxbcjZdCisgICAgVkFCRC5VOCAgZDEzLGQ4LGQ0CisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIFZBQkQuVTggIGQxOCxkOSxkOAorICAgIFZBQkQuVTggIGQxOSxkNixkNAorICAgIFZDR1QuVTggIGQxNixkMCxkMTMKKyAgICBUU1QgICAgICByMTIsIzB4ZmYKKyAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWTU9WRVEuMzIgZDE2WzBdLHIxMQorICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWTU9WRVEuMzIgZDE2WzFdLHIxMQorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWTEQxLjggICB7ZDExfSxbcjBdCisgICAgVkFORCAgICAgZDE2LGQxNixkMTIKKyAgICBUU1QgICAgICByMTIsIzQKKyAgICBWQU5EICAgICBkMTIsZDE2LGQxNworICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5CisgICAgQk5FICAgICAgTDB4ZjgKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBTVUIgICAgICByMCxyMCxyMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgorICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0KKyAgICBBREQgICAgICByMCxyNiwjOAorICAgIEJDQyAgICAgIEwweDM4CisgICAgQiAgICAgICAgTDB4MTMwCitMMHhlNDoKKyAgICBBREQgICAgICByMCxyMCwjOAorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgQUREICAgICAgcjUscjUsIzIKKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDEzMAorTDB4Zjg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIFZTVDEuOCAgIHtkMzF9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgorICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0scjEKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIFZTVDEuOCAgIHtkMjh9LFtyMF0KKyAgICBBREQgICAgICByMCxyNiwjOAorICAgIEJDQyAgICAgIEwweDM4CitMMHgxMzA6CisgICAgU1VCICAgICAgcjAscjAsIzB4MTAKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYzMyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgQUREICAgICAgcjcscjIsIzEKKyAgICBBREQgICAgICByOCxyMywjMQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgU1VCICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTU9WICAgICAgcjYsIzAKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIE1PViAgICAgIHI5LCMweDExMDAwMDAwCisgICAgQUREICAgICAgcjExLHIxLHIxCitMMHgzODoKKyAgICBMRFJIICAgICByMTIsW3I0XSwjNAorICAgIENNUCAgICAgIHIxMiwjMAorICAgIEJFUSAgICAgIEwweDE2MAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTEKKyAgICBWTEQxLjggICB7ZDh9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMTEKKyAgICBWWklQLjggICBkNyxkOAorICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMTEKKyAgICBWWklQLjggICBkNSxkMTAKKyAgICBWTEQxLjggICB7ZDl9LFtyMTBdLHIxMQorICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMTEKKyAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxyMTEKKyAgICBWWklQLjggICBkNixkOQorICAgIFZaSVAuMTYgIGQ4LGQxMAorICAgIFZaSVAuOCAgIGQ0LGQxMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZaSVAuMTYgIGQ3LGQ1CisgICAgVlpJUC4xNiAgZDksZDExCisgICAgVlpJUC4xNiAgZDYsZDQKKyAgICBWVFJOLjMyICBkOCxkOQorICAgIFZUUk4uMzIgIGQ1LGQ0CisgICAgVlRSTi4zMiAgZDEwLGQxMQorICAgIFZUUk4uMzIgIGQ3LGQ2CisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVFNUICAgICAgcjEyLCMweGZmCisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZNT1ZFUS4zMiBkMTZbMF0scjYKKyAgICBUU1QgICAgICByMTIsIzB4ZmYwMAorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVk1PVkVRLjMyIGQxNlsxXSxyNgorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFRTVCAgICAgIHIxMiwjNAorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTkUgICAgICBMMHgxN2MKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgVlpJUC44ICAgZDcsZDYKKyAgICBWWklQLjggICBkMzAsZDI5CisgICAgVlpJUC44ICAgZDI0LGQyNQorICAgIFZaSVAuOCAgIGQxMCxkMTEKKyAgICBWWklQLjE2ICBkNyxkMzAKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBWWklQLjE2ICBkMjQsZDEwCisgICAgVlpJUC4xNiAgZDI1LGQxMQorICAgIFZaSVAuMTYgIGQ2LGQyOQorICAgIFZUUk4uMzIgIGQ3LGQyNAorICAgIFZUUk4uMzIgIGQzMCxkMTAKKyAgICBWVFJOLjMyICBkNixkMjUKKyAgICBWVFJOLjMyICBkMjksZDExCisgICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QxMH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2Q2fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVkxEMS44ICAge2QwW119LFtyN10KKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxZjAKK0wweDE2MDoKKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVkxEMS44ICAge2QwW119LFtyN10KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxZjAKK0wweDE3YzoKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgVlpJUC44ICAgZDcsZDMxCisgICAgVlpJUC44ICAgZDMwLGQyOQorICAgIFZaSVAuOCAgIGQyNCxkMjUKKyAgICBWWklQLjggICBkMjgsZDExCisgICAgVlpJUC4xNiAgZDcsZDMwCisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgVlpJUC4xNiAgZDI0LGQyOAorICAgIFZaSVAuMTYgIGQyNSxkMTEKKyAgICBWWklQLjE2ICBkMzEsZDI5CisgICAgVlRSTi4zMiAgZDcsZDI0CisgICAgVlRSTi4zMiAgZDMwLGQyOAorICAgIFZUUk4uMzIgIGQzMSxkMjUKKyAgICBWVFJOLjMyICBkMjksZDExCisgICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyOH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDI1fSxbcjEwXSxyMTEKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjExCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBWU1QxLjggICB7ZDExfSxbcjEwXSxyMTEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorTDB4MWYwOgorICAgIFNVQiAgICAgIHI0LHI0LCMweGUKKyAgICBTVUIgICAgICByNSxyNSwjMHhlCisgICAgU1VCICAgICAgcjAscjAsIzB4MTAKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjM2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCitvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgU1VCICAgICAgc3Asc3AsIzB4MTAKKyAgICBMRFIgICAgICByNixbc3AsIzB4NzhdCisgICAgTERSICAgICAgcjcsW3NwLCMweDdjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg4MF0KKyAgICBMRFIgICAgICByNCxbc3AsIzB4ODRdCisgICAgQUREICAgICAgcjYscjYscjcsTFNMICMyCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgVk1PVi5JMTYgZDMxLCMweDE0CisgICAgVk1PVi5JMTYgZDMwLCMweDUKK0wweDJjOgorICAgIFNUTSAgICAgIHIxMSx7cjAtcjN9CisgICAgQUREICAgICAgcGMscGMscjYsTFNMICMyCisgICAgQiAgICAgICAgTDB4M2YwCisgICAgQiAgICAgICAgTDB4NzgKKyAgICBCICAgICAgICBMMHhhOAorICAgIEIgICAgICAgIEwweGRjCisgICAgQiAgICAgICAgTDB4MTAwCisgICAgQiAgICAgICAgTDB4MTM0CisgICAgQiAgICAgICAgTDB4MTY4CisgICAgQiAgICAgICAgTDB4MWE4CisgICAgQiAgICAgICAgTDB4MWYwCisgICAgQiAgICAgICAgTDB4MjM0CisgICAgQiAgICAgICAgTDB4MjU4CisgICAgQiAgICAgICAgTDB4MmIwCisgICAgQiAgICAgICAgTDB4MmQ4CisgICAgQiAgICAgICAgTDB4MzMwCisgICAgQiAgICAgICAgTDB4MzY0CisgICAgQiAgICAgICAgTDB4M2E4CisgICAgQiAgICAgICAgTDB4M2YwCitMMHg3ODoKKyAgICBBREQgICAgICByMTIscjAscjEsTFNMICMxCisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxMX0sW3IxMl0scjEKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdCisgICAgVkxEMS44ICAge2QxMn0sW3IxMl0KKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2Q5WzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QxMVswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QxMlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweGE4OgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMTQKKyAgICBWUkhBREQuVTggZDI2LGQyNixkMTgKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMTYKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHhkYzoKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MTAwOgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMTUKKyAgICBWUkhBREQuVTggZDI2LGQyNixkMTkKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMTcKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkMjEKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxMzQ6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDAsZDAsZDkKKyAgICBWUkhBREQuVTggZDQsZDQsZDExCisgICAgVlJIQURELlU4IGQyLGQyLGQxMAorICAgIFZSSEFERC5VOCBkNixkNixkMTIKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDE2ODoKKyAgICBNT1YgICAgICByOCxyMAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgU1VCICAgICAgcjAscjgsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCisgICAgVlJIQURELlU4IGQyNixkMjYsZDQKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2CisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MWE4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgVlFSU0hSVU4uUzE2IGQxNCxxNywjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE4LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTAsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxZjA6CisgICAgTU9WICAgICAgcjgscjAKKyAgICBBREQgICAgICByMCxyMCwjMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgU1VCICAgICAgcjAscjgsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCisgICAgVlJIQURELlU4IGQyNixkMjYsZDQKKyAgICBWUkhBREQuVTggZDI0LGQyNCxkMgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2CisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MjM0OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyNTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAorICAgIFZFWFQuOCAgIGQyMCxkMjAsZDIxLCM0CisgICAgVkVYVC44ICAgZDIyLGQyMixkMjMsIzQKKyAgICBWRVhULjggICBkMjQsZDI0LGQyNSwjNAorICAgIFZRUlNIUlVOLlMxNiBkMTQscTksIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE2LHExMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTExLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTIsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyYjA6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDJkODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM2CisgICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzYKKyAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNgorICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM2CisgICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDMzMDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTAKKyAgICBWUkhBREQuVTggZDQsZDQsZDEyCisgICAgVlJIQURELlU4IGQyLGQyLGQxMQorICAgIFZSSEFERC5VOCBkNixkNixkMTMKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDM2NDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjAscjgscjEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgzYTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE4LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyMCxxMTEsIzUKKyAgICBWUkhBREQuVTggZDAsZDAsZDE0CisgICAgVlJIQURELlU4IGQ0LGQ0LGQxOAorICAgIFZSSEFERC5VOCBkMixkMixkMTYKKyAgICBWUkhBREQuVTggZDYsZDYsZDIwCisgICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgzZjA6CisgICAgTU9WICAgICAgcjgscjAKKyAgICBBREQgICAgICByMCxyMCwjMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgQUREICAgICAgcjAscjgscjEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCitMMHg0MzQ6CisgICAgTERNICAgICAgcjExLHtyMC1yM30KKyAgICBTVUJTICAgICByNSxyNSwjNAorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQUREICAgICAgcjIscjIsIzQKKyAgICBCR1QgICAgICBMMHgyYworICAgIFNVQlMgICAgIHI0LHI0LCM0CisgICAgTERSICAgICAgcjUsW3NwLCMweDgwXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIEFERCAgICAgIHIyLHIyLHIzLExTTCAjMgorICAgIFNVQiAgICAgIHIwLHIwLHI1CisgICAgU1VCICAgICAgcjIscjIscjUKKyAgICBCR1QgICAgICBMMHgyYworICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgc3Asc3AsIzB4MTAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0OWU0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4OgorICAgIC53b3JkICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAud29yZCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUKKworYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDg6CisgICAgLmh3b3JkICAgMywgMiwgMSw0CisgICAgLmh3b3JkICAtMywtMiwtMSwwCisgICAgLmh3b3JkICAgMSwgMiwgMyw0CisKKworICAgIC50ZXh0CisgICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAorb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4OgorICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBMRFIgICAgICByOCwgPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKKyAgICBMRFIgICAgICByNixbc3AsIzB4NjhdCisgICAgTERSICAgICAgcjQsW3NwLCMweDYwXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KKyAgICBMRFIgICAgICByNyxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcGMsW3I4LHI2LExTTCAjMl0KK09NWF9WQ19DSFJPTUFfREM6CisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHhlOAorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVsxXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzNdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4Y2MKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMixkMAorICAgIFZQQURETC5VMTYgZDMsZDIKKyAgICBWUEFEREwuVTggZDIsZDEKKyAgICBWUEFEREwuVTE2IGQxLGQyCisgICAgVkFERC5JMzIgZDIsZDMsZDEKKyAgICBWUlNIUi5VMzIgZDIsZDIsIzMKKyAgICBWUlNIUi5VMzIgZDMsZDMsIzIKKyAgICBWUlNIUi5VMzIgZDEsZDEsIzIKKyAgICBWTU9WLkk4ICBkNSwjMHhjCisgICAgVk1PVi5JOCAgZDYsIzB4NAorICAgIFZTSEwuSTY0IGQ1LGQ1LCMzMgorICAgIFZTSFIuVTY0IGQ2LGQ2LCMzMgorICAgIFZBREQuSTggIGQ2LGQ2LGQ1CisgICAgVlRCTC44ICAgZDAse2QyLWQzfSxkNQorICAgIFZUQkwuOCAgIGQ0LHtkMS1kMn0sZDYKK0wweDljOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3I5XQorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK0wweGNjOgorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQxCisgICAgVlBBRERMLlUxNiBkMSxkMgorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgVkRVUC44ICAgZDQsZDFbNF0KKyAgICBCICAgICAgICBMMHg5YworTDB4ZTg6CisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHgxMTQKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMixkMAorICAgIFZQQURETC5VMTYgZDMsZDIKKyAgICBWUlNIUi5VMzIgZDMsZDMsIzIKKyAgICBWTU9WLkk4ICBkNSwjMHg0CisgICAgVlNITC5JNjQgZDUsZDUsIzMyCisgICAgVlRCTC44ICAgZDAse2QzfSxkNQorICAgIEIgICAgICAgIEwweDExYworTDB4MTE0OgorICAgIFZNT1YuSTggIGQwLCMweDgwCisgICAgTU9WICAgICAgcjAsIzAKK0wweDExYzoKKyAgICBBREQgICAgICByOSxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0KKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CitPTVhfVkNfQ0hST01BX1ZFUlQ6CisgICAgVkxEMS44ICAge2QwfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBCICAgICAgICBMMHgxMWMKK09NWF9WQ19DSFJPTUFfSE9SOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QyW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2Q0W119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q1W119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2Q2W119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q3W119LFtyOV0KKyAgICBCICAgICAgICBMMHgyOGMKK09NWF9WQ19DSFJPTUFfUExBTkU6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBWTEQxLjggICB7ZDJbMF19LFtyMl0KKyAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzddfSxbcjldCisgICAgVlJFVjY0LjggZDMsZDAKKyAgICBWU1VCTC5VOCBxMyxkMyxkMgorICAgIFZTSFIuVTY0IGQzLGQzLCM4CisgICAgVlNVQkwuVTggcTIsZDMsZDAKKyAgICBWUkVWNjQuOCBkMyxkMQorICAgIFZTVUJMLlU4IHE3LGQzLGQyCisgICAgVlNIUi5VNjQgZDMsZDMsIzgKKyAgICBWU1VCTC5VOCBxNixkMyxkMQorICAgIExEUiAgICAgIHIyLCA9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgKKyAgICBWU0hMLkk2NCBkNCxkNCwjMTYKKyAgICBWRVhULjggICBkOSxkNCxkNiwjMgorICAgIFZMRDEuMTYgIHtkMTB9LFtyMl0hCisgICAgVlNITC5JNjQgZDEyLGQxMiwjMTYKKyAgICBWRVhULjggICBkMTYsZDEyLGQxNCwjMgorICAgIFZNVUwuSTE2IGQxMSxkOSxkMTAKKyAgICBWTVVMLkkxNiBkMyxkMTYsZDEwCisgICAgVlBBREQuSTE2IGQzLGQxMSxkMworICAgIFZQQURETC5TMTYgZDMsZDMKKyAgICBWU0hMLkkzMiBkMixkMywjNAorICAgIFZBREQuSTMyIGQzLGQzLGQyCisgICAgVkxEMS4xNiAge2QxMCxkMTF9LFtyMl0KKyAgICBWUlNIUi5TMzIgZDMsZDMsIzUKKyAgICBWQURETC5VOCBxMCxkMCxkMQorICAgIFZEVVAuMTYgIHEwLGQxWzNdCisgICAgVlNITC5JMTYgcTAscTAsIzQKKyAgICBWRFVQLjE2ICBxMixkM1swXQorICAgIFZEVVAuMTYgIHEzLGQzWzJdCisgICAgVk1VTC5JMTYgcTIscTIscTUKKyAgICBWTVVMLkkxNiBxMyxxMyxxNQorICAgIFZBREQuSTE2IHEyLHEyLHEwCisgICAgVkRVUC4xNiAgcTAsZDZbMF0KKyAgICBWRFVQLjE2ICBxMSxkNlsxXQorICAgIFZEVVAuMTYgIHE0LGQ2WzJdCisgICAgVkRVUC4xNiAgcTUsZDZbM10KKyAgICBWRFVQLjE2ICBxNixkN1swXQorICAgIFZEVVAuMTYgIHE3LGQ3WzFdCisgICAgVkRVUC4xNiAgcTgsZDdbMl0KKyAgICBWRFVQLjE2ICBxOSxkN1szXQorICAgIFZBREQuSTE2IHEwLHEyLHEwCisgICAgVkFERC5JMTYgcTEscTIscTEKKyAgICBWQURELkkxNiBxNCxxMixxNAorICAgIFZBREQuSTE2IHE1LHEyLHE1CisgICAgVkFERC5JMTYgcTYscTIscTYKKyAgICBWQURELkkxNiBxNyxxMixxNworICAgIFZBREQuSTE2IHE4LHEyLHE4CisgICAgVkFERC5JMTYgcTkscTIscTkKKyAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDEscTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIscTQsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDMscTUsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDQscTYsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDUscTcsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDYscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDcscTksIzUKK0wweDI4YzoKKyAgICBBREQgICAgICByOSxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDF9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QyfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkM30sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q1fSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNn0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDd9LFtyOV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNjhmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisKKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNjoKKyAgICAud29yZCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IKKyAgICAud29yZCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorCisKKworYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNjoKKyAgICAuaHdvcmQgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOAorICAgIC5od29yZCAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3CisgICAgLmh3b3JkICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2CisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNgorb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTY6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUiAgICAgIHI5LCA9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgTERSICAgICAgcjYsW3NwLCMweDcwXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcjcsW3NwLCMweDc0XQorICAgIE1PViAgICAgIHIxMiwjMHgxMAorICAgIExEUiAgICAgIHBjLFtyOSxyNixMU0wgIzJdCitPTVhfVkNfMTZYMTZfVkVSVDoKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBBREQgICAgICByOCxyMyxyNQorICAgIEFERCAgICAgIHIxMCxyNSxyNQorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfSE9SOgorICAgIEFERCAgICAgIHI4LHIwLHI0CisgICAgQUREICAgICAgcjQscjQscjQKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByNSxyNSxyNQorTDB4OGM6CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0CisgICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQorICAgIEJORSAgICAgIEwweDhjCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfREM6CisgICAgTU9WICAgICAgcjExLCMwCisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHgxNGMKKyAgICBBREQgICAgICByOCxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQorICAgIFZQQURETC5VOCBxMCxxMQorICAgIEFERCAgICAgIHIxMSxyMTEsIzEKKyAgICBWUEFERC5JMTYgZDAsZDAsZDEKKyAgICBWUEFEREwuVTE2IGQwLGQwCisgICAgVlBBRERMLlUzMiBkNixkMAorICAgIFZSU0hSLlU2NCBkOCxkNiwjNAorTDB4MTRjOgorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4MTcwCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCisgICAgQUREICAgICAgcjExLHIxMSwjMQorICAgIFZQQURETC5VOCBxMCxxMAorICAgIFZQQURELkkxNiBkMCxkMCxkMQorICAgIFZQQURETC5VMTYgZDAsZDAKKyAgICBWUEFEREwuVTMyIGQ3LGQwCisgICAgVlJTSFIuVTY0IGQ4LGQ3LCM0CitMMHgxNzA6CisgICAgQ01QICAgICAgcjExLCMyCisgICAgQk5FICAgICAgTDB4MTgwCisgICAgVkFERC5JNjQgZDgsZDcsZDYKKyAgICBWUlNIUi5VNjQgZDgsZDgsIzUKK0wweDE4MDoKKyAgICBWRFVQLjggICBxMyxkOFswXQorICAgIENNUCAgICAgIHIxMSwjMAorICAgIEFERCAgICAgIHI4LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgQk5FICAgICAgTDB4MTk4CisgICAgVk1PVi5JOCAgcTMsIzB4ODAKK0wweDE5ODoKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitPTVhfVkNfMTZYMTZfUExBTkU6CisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2CisgICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCisgICAgVkxEMS44ICAge2Q0WzBdfSxbcjJdCisgICAgQUREICAgICAgcjgscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDJbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzFdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMlsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbM119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMls1XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzddfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1swXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1szXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbN119LFtyOF0KKyAgICBWUkVWNjQuOCBkNSxkMQorICAgIFZTVUJMLlU4IHEzLGQ1LGQ0CisgICAgVlNIUi5VNjQgZDUsZDUsIzgKKyAgICBWU1VCTC5VOCBxNCxkNSxkMAorICAgIFZTSEwuSTY0IGQ5LGQ5LCMxNgorICAgIFZFWFQuOCAgIGQ5LGQ5LGQ2LCMyCisgICAgVlJFVjY0LjggZDEyLGQzCisgICAgVlNVQkwuVTggcTcsZDEyLGQ0CisgICAgVlNIUi5VNjQgZDEyLGQxMiwjOAorICAgIFZTVUJMLlU4IHE4LGQxMixkMgorICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQorICAgIFZTSEwuSTY0IGQxNyxkMTcsIzE2CisgICAgVkVYVC44ICAgZDE3LGQxNyxkMTQsIzIKKyAgICBWTVVMTC5TMTYgcTExLGQ4LGQyMAorICAgIFZNVUxMLlMxNiBxMTIsZDE2LGQyMAorICAgIFZNTEFMLlMxNiBxMTEsZDksZDIxCisgICAgVk1MQUwuUzE2IHExMixkMTcsZDIxCisgICAgVlBBREQuSTMyIGQyMixkMjMsZDIyCisgICAgVlBBREQuSTMyIGQyMyxkMjUsZDI0CisgICAgVlBBRERMLlMzMiBxMTEscTExCisgICAgVlNITC5JNjQgcTEyLHExMSwjMgorICAgIFZBREQuSTY0IHExMSxxMTEscTEyCisgICAgVlJTSFIuUzY0IHExMSxxMTEsIzYKKyAgICBWU0hMLkk2NCBxMTIscTExLCMzCisgICAgVlNVQi5JNjQgcTEyLHExMixxMTEKKyAgICBWTEQxLjE2ICB7ZDIwLGQyMX0sW3I5XSEKKyAgICBWRFVQLjE2ICBxNixkMjJbMF0KKyAgICBWRFVQLjE2ICBxNyxkMjNbMF0KKyAgICBWQURETC5VOCBxMTEsZDEsZDMKKyAgICBWU0hMLkkxNiBxMTEscTExLCM0CisgICAgVkRVUC4xNiAgcTExLGQyM1szXQorICAgIFZBREQuSTY0IGQxLGQyNCxkMjUKKyAgICBWTEQxLjE2ICB7ZDI0LGQyNX0sW3I5XQorICAgIFZEVVAuMTYgIHExMyxkMVswXQorICAgIFZTVUIuSTE2IHExMyxxMTEscTEzCisgICAgVk1VTC5JMTYgcTUscTYscTEwCisgICAgVk1VTC5JMTYgcTYscTYscTEyCisgICAgVkFERC5JMTYgcTAscTUscTEzCisgICAgVkFERC5JMTYgcTEscTYscTEzCitMMHgyZDQ6CisgICAgVlFSU0hSVU4uUzE2IGQ2LHEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQ3LHExLCM1CisgICAgU1VCUyAgICAgcjEyLHIxMiwjMQorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyNQorICAgIFZBREQuSTE2IHEwLHEwLHE3CisgICAgVkFERC5JMTYgcTEscTEscTcKKyAgICBCTkUgICAgICBMMHgyZDQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZkN2VmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisKKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQ6CisgICAgLndvcmQgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IKKyAgICAud29yZCBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAud29yZCBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgLndvcmQgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAorICAgIC53b3JkIE9NWF9WQ180eDRfSFUKKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NAorICAgIC5mdW5jICAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQ6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDEyfQorICAgIExEUiAgICAgIHI4LCA9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBMRFJEICAgICByNixyNyxbc3AsIzB4NThdCisgICAgTERSRCAgICAgcjQscjUsW3NwLCMweDUwXQorICAgIExEUiAgICAgIHBjLFtyOCxyNixMU0wgIzJdCitPTVhfVkNfNHg0X0hPUjoKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdCisgICAgVkxEMS44ICAge2QzW119LFtyOV0KKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDJbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDNbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X1ZFUlQ6CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CitMMHg1ODoKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0RDOgorICAgIFRTVCAgICAgIHI3LCMyCisgICAgQkVRICAgICAgTDB4ZGMKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMFswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDBbMV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QwWzJdfSxbcjBdCisgICAgVkxEMS44ICAge2QwWzNdfSxbcjldCisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHhiYworICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZQQURETC5VMzIgZDEsZDEKKyAgICBWUlNIUi5VNjQgZDEsZDEsIzMKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRFVQLjggICBkMCxkMVswXQorICAgIEIgICAgICAgIEwweDU4CitMMHhiYzoKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQQURETC5VOCBkMSxkMAorICAgIFZQQURETC5VMTYgZDEsZDEKKyAgICBWUlNIUi5VMzIgZDEsZDEsIzIKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRFVQLjggICBkMCxkMVswXQorICAgIEIgICAgICAgIEwweDU4CitMMHhkYzoKKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweDEwOAorICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweDEwODoKKyAgICBWTU9WLkk4ICBkMCwjMHg4MAorICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgQiAgICAgICAgTDB4NTgKK09NWF9WQ180eDRfRElBR19ETDoKKyAgICBUU1QgICAgICByNywjMHg0MAorICAgIEJFUSAgICAgIEwweDEzOAorICAgIFZMRDEuOCAgIHtkM30sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQzWzddCisgICAgVkVYVC44ICAgZDQsZDMsZDIsIzEKKyAgICBWRVhULjggICBkNSxkMyxkMiwjMgorICAgIEIgICAgICAgIEwweDE0YworTDB4MTM4OgorICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQwWzddCisgICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMCxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2CitMMHgxNGM6CisgICAgVkhBREQuVTggZDYsZDMsZDUKKyAgICBWUkhBREQuVTggZDYsZDYsZDQKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfRElBR19EUjoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIEFERCAgICAgIHIxLHIzLHI1CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KKyAgICBWRVhULjggICBkMyxkMSxkMCwjMworICAgIEFERCAgICAgIHI0LHIxLHI1CisgICAgVkVYVC44ICAgZDQsZDEsZDAsIzQKKyAgICBBREQgICAgICByNixyNCxyNQorICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCM1CisgICAgVkhBREQuVTggZDYsZDMsZDUKKyAgICBWUkhBREQuVTggZDYsZDYsZDQKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyNl0KKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3I0XQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjFdCisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVlI6CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgVkxEMS44ICAge2QwWzddfSxbcjJdCisgICAgVkxEMS44ICAge2QxWzddfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QyWzddfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdCisgICAgVkVYVC44ICAgZDEyLGQwLGQwLCM3CisgICAgVkVYVC44ICAgZDMsZDEsZDEyLCM2CisgICAgVkVYVC44ICAgZDQsZDIsZDEyLCM3CisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzcKKyAgICBWRVhULjggICBkNixkMixkMCwjNworICAgIFZFWFQuOCAgIGQxMSxkMSxkMTIsIzcKKyAgICBWSEFERC5VOCBkOCxkNixkMTIKKyAgICBWUkhBREQuVTggZDgsZDgsZDExCisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWRVhULjggICBkMTAsZDgsZDgsIzEKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWRVhULjggICBkOSxkNyxkNywjMQorICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q5WzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjExXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9IRDoKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdCisgICAgVkxEMS44ICAge2QxWzNdfSxbcjldCisgICAgVkVYVC44ICAgZDMsZDEsZDAsIzMKKyAgICBWRVhULjggICBkNCxkMSxkMCwjMgorICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCMxCisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWUkhBREQuVTggZDgsZDQsZDMKKyAgICBWU0hMLkk2NCBkOCxkOCwjMjQKKyAgICBWU0hMLkk2NCBkNixkNywjMTYKKyAgICBWWklQLjggICBkOCxkNgorICAgIFZFWFQuOCAgIGQ3LGQ3LGQ3LCM2CisgICAgVkVYVC44ICAgZDgsZDYsZDcsIzIKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBWU1QxLjMyICB7ZDhbMV19LFtyM10scjEyCisgICAgVlNUMS4zMiAge2Q2WzFdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X1ZMOgorICAgIFRTVCAgICAgIHI3LCMweDQwCisgICAgQkVRICAgICAgTDB4MmI0CisgICAgVkxEMS44ICAge2QzfSxbcjFdCisgICAgVkVYVC44ICAgZDQsZDMsZDMsIzEKKyAgICBWRVhULjggICBkNSxkNCxkNCwjMQorICAgIEIgICAgICAgIEwweDJjOAorTDB4MmI0OgorICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQorICAgIFZEVVAuOCAgIGQyLGQwWzddCisgICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMCxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2CitMMHgyYzg6CisgICAgVlJIQURELlU4IGQ3LGQ0LGQzCisgICAgVkhBREQuVTggZDEwLGQzLGQ1CisgICAgVlJIQURELlU4IGQxMCxkMTAsZDQKKyAgICBWRVhULjggICBkOCxkNyxkNywjMQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZFWFQuOCAgIGQ5LGQxMCxkOCwjMQorICAgIFZTVDEuMzIgIHtkN1swXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjExXSxyMTIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0hVOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KKyAgICBWRFVQLjggICBkMixkMVs3XQorICAgIFZFWFQuOCAgIGQzLGQxLGQyLCM0CisgICAgVkVYVC44ICAgZDQsZDEsZDIsIzUKKyAgICBWRVhULjggICBkNSxkMSxkMiwjNgorICAgIFZIQURELlU4IGQ3LGQzLGQ1CisgICAgVlJIQURELlU4IGQ3LGQ3LGQ0CisgICAgVlJIQURELlU4IGQ4LGQ0LGQzCisgICAgVlpJUC44ICAgZDgsZDcKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkOCxkOCxkOCwjMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1CisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdCitMMHgzNDg6CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDEyfQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGE4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcgorICAgIC5mdW5jICAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcgorb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcjoKKyAgICBwdXNoICAgIHtyNC1yMTAsIGxyfQorICAgIGxkciAgICAgcjksIFtyMCwjMF0KKyAgICB2bW92LmkxNiAgICBkMCwgIzAKKyAgICBtb3YgICAgIHI4LCAjMHgxZgorICAgIHZzdDEuMTYgICAge2QwfSwgW3IxXQorICAgIGxkcmIgICAgcjYsIFtyOV0sICMxCit1bnBhY2tMb29wOgorICAgIHRzdCAgICAgcjYsICMweDEwCisgICAgbGRybmVzYiByNSwgW3I5LCAjMV0KKyAgICBsZHJuZWIgIHI0LCBbcjldLCAjMgorICAgIGFuZCAgICAgcjcsIHI4LCByNiwgbHNsICMxCisgICAgbGRyZXFzYiByNCwgW3I5XSwgIzEKKyAgICBvcnJuZSAgIHI0LCByNCwgcjUsIGxzbCAjOAorICAgIHRzdCAgICAgcjYsICMweDIwCisgICAgbGRyZXFiICByNiwgW3I5XSwgIzEKKyAgICBzdHJoICAgIHI0LCBbcjEsIHI3XQorICAgIGJlcSAgICAgdW5wYWNrTG9vcAorICAgIGxkbWlhICAgcjEsIHtyMywgcjR9CisgICAgc3RyICAgICByOSwgW3IwLCAjMF0KKyAgICBsZHIgICAgIHI1LCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgbGRyICAgICByNiwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICBzYWRkc3VieCAgICAgICAgcjMsIHIzLCByMworICAgIHNhZGRzdWJ4ICAgICAgICByNCwgcjQsIHI0CisgICAgbGRyc2IgICByOSwgW3I1LCByMl0KKyAgICBsZHJzYiAgIHIyLCBbcjYsIHIyXQorICAgIHNhZGQxNiAgcjUsIHIzLCByNAorICAgIHNzdWIxNiAgcjYsIHIzLCByNAorICAgIGxzbCAgICAgcjIsIHIyLCByOQorICAgIHZtb3YgICAgZDAsIHI1LCByNgorICAgIHZyZXYzMi4xNiAgZDAsIGQwCisgICAgdmR1cC4xNiAgICBkMSwgcjIKKyAgICB2bXVsbC5zMTYgICBxMSwgZDAsIGQxCisgICAgdnNocm4uaTMyICAgZDIsIHExLCAjMQorICAgIHZzdDEuMTYgICAge2QyfSwgW3IxXQorICAgIG1vdiAgICAgcjAsICMwCisgICAgcG9wICAgICB7cjQtcjEwLCBwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0CisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKK2FybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NDoKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxM30KKyAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KKyAgICBMRFIgICAgICByMiwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIExEUiAgICAgIHIzLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIFZBREQuSTE2IGQ0LGQwLGQxCisgICAgVkFERC5JMTYgZDUsZDIsZDMKKyAgICBWU1VCLkkxNiBkNixkMCxkMQorICAgIExEUlNCICAgIHI0LFtyMixyMV0KKyAgICBWU1VCLkkxNiBkNyxkMixkMworICAgIExEUlNCICAgIHI1LFtyMyxyMV0KKyAgICBWQURELkkxNiBkMCxkNCxkNQorICAgIFZTVUIuSTE2IGQxLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBMU0wgICAgICByNSxyNSxyNAorICAgIFZBREQuSTE2IGQzLGQ2LGQ3CisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVkFERC5JMTYgZDQsZDAsZDEKKyAgICBWQURELkkxNiBkNSxkMixkMworICAgIFZTVUIuSTE2IGQ2LGQwLGQxCisgICAgVlNVQi5JMTYgZDcsZDIsZDMKKyAgICBWQURELkkxNiBkMCxkNCxkNQorICAgIFZTVUIuSTE2IGQxLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWQURELkkxNiBkMyxkNixkNworICAgIFZEVVAuMTYgIGQ1LHI1CisgICAgVk1PVi5JMzIgcTMsIzB4MgorICAgIFZNT1YuSTMyIHE0LCMweDIKKyAgICBWTU9WLkkzMiBxNSwjMHgyCisgICAgVk1PVi5JMzIgcTYsIzB4MgorICAgIFZNTEFMLlMxNiBxMyxkMCxkNQorICAgIFZNTEFMLlMxNiBxNCxkMSxkNQorICAgIFZNTEFMLlMxNiBxNSxkMixkNQorICAgIFZNTEFMLlMxNiBxNixkMyxkNQorICAgIFZTSFJOLkkzMiBkMCxxMywjMgorICAgIFZTSFJOLkkzMiBkMSxxNCwjMgorICAgIFZTSFJOLkkzMiBkMixxNSwjMgorICAgIFZTSFJOLkkzMiBkMyxxNiwjMgorICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIFZQT1AgICAgIHtkOC1kMTN9CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKy5nbG9iYWwgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKKy5mdW5jICAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKK29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBNT1YgICAgICByNCxyMQorICAgIE1PViAgICAgIHI1LHIyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIE1PViAgICAgIHIwLHI0CisgICAgTU9WICAgICAgcjEscjUKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICBNT1YgICAgICByMCwjMAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGI1NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWEhVRkZUQUJfSF8KKyNkZWZpbmUgX09NWEhVRkZUQUJfSF8KKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF07CisKKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdOworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdOworLy9leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFszMl07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdOworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXQorCisjZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTk1MjAzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAorCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVmZTZkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCkBAIC0wLDAgKzEsODIgQEAKKzsgLyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBDbGlwcGluZyAxNiBiaXQgdmFsdWUgdG8gWzAsMjU1XSBSYW5nZQorOyAqLyAKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIAorCisgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgIElGIENvcnRleEE4Cis7Ly9JbnB1dCBBcmd1bWVudHMKKworcFNyYyAgICAgICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgICAgICAgUk4gMQorc3RlcCAgICAgICAgICAgICAgICAgUk4gMgorCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworcXgwICAgICAgICAgICAgICAgICAgUU4gIFEwLlMxNiAgICAgICAgICAgICAgICAgIAorZHgwMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZHgwMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorcXgxICAgICAgICAgICAgICAgICAgUU4gIFExLlMxNgorZHgxMCAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZHgxMSAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCitxeDIgICAgICAgICAgICAgICAgICBRTiAgUTIuUzE2ICAgICAgICAgICAgICAgICAgCitkeDIwICAgICAgICAgICAgICAgICBETiAgRDQuUzE2CitkeDIxICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitxeDMgICAgICAgICAgICAgICAgICBRTiAgUTMuUzE2CitkeDMwICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkeDMxICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CisKKworZGNsaXAwICAgICAgICAgICAgICAgRE4gIEQwLlU4CitkY2xpcDEgICAgICAgICAgICAgICBETiAgRDIuVTggCitkY2xpcDIgICAgICAgICAgICAgICBETiAgRDQuVTgKK2RjbGlwMyAgICAgICAgICAgICAgIEROICBENi5VOAorIAorICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4CisKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCisgICAgICAgCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgwMCxkeDAxLGR4MTAsZHgxMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCAxNiBlbnRyaWVzIGZyb20gcFNyYworICAgICAgIFZMRDEgICAgICAgICAge2R4MjAsZHgyMSxkeDMwLGR4MzF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgbmV4dCAxNiBlbnRyaWVzIGZyb20gcFNyYyAgCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDAscXgwLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAwW2ldPWNsaXAgcXgwW2ldIHRvIFswLDI1NV0KKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMSxxeDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDFbaV09Y2xpcCBxeDFbaV0gdG8gWzAsMjU1XQorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMH0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAxfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMixxeDIsIzAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMyxxeDMsIzAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDJ9LFtwRHN0XSxzdGVwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAzfSxbcERzdF0sc3RlcAorCisKKyAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE3ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpAQCAtMCwwICsxLDM5OCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIsIGludHJhIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIAorOyAqCis7ICogCis7ICoKKzsgKiAKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIAorCisKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CisKK2Z0eXBlICAgICAgICAgICAgICAgIFJOIDAKK3RlbXAzICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAgICAgICAgICAgICAgICAgIFJOIDUKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKK0VzY2FwZSAgICAgICAgICAgICAgIFJOIDUKKworOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCit6aWd6YWcgICAgICAgICAgICAgICBSTiAwCitzdG9yZUxldmVsICAgICAgICAgICBSTiAxCit0ZW1wMiAgICAgICAgICAgICAgICBSTiA0Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CitzaWduICAgICAgICAgICAgICAgICBSTiA1CitMYXN0ICAgICAgICAgICAgICAgICBSTiA3CitzdG9yZVJ1biAgICAgICAgICAgICBSTiAxNAorCisKK3BhY2tSZXRJbmRleCAgICAgICAgIFJOIDUKKworCittYXJrZXJiaXQgICAgICAgICAgICBSTiA1CisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgIFJOIDE0ICAgICAgICAKKyAgICAgICAgCisKKworICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwT2Zmc2V0LDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBMaW5rUmVnaXN0ZXIsNCAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworICAgICAgICA7Ly8gZ2V0IHRoZSB0YWJsZSBhZGRyZXNzZXMgZnJvbSBzdGFjayAgICAgICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgQUxMIHplcm9zIGF0IHBEc3QKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSBDb3VudCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIExhc3QsIzAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMaW5rIFJlZ2lzdGVyIG9uIFN0YWNrCisgICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMiwjMAorICAgICAgICBNT1YgICAgICAgICAgICAgTFIsIzAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgTWFjcm8gYW5kIFN0b3JlIGFsbCB6ZXJvcyB0byBwRHN0IAorICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBwQml0c3RyZWFtIG9uIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcEJpdE9mZnNldCBvbiBzdGFjaworICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgICAgICBwRHN0LHBEc3QsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRHN0CisKKyAgICAgICAgOy8vIFRoZSBhcm1WQ000UDJfR2V0VkxDQml0cyBiZWdpbnMKKworZ2V0VkxDYml0cworICAgICAgICAKKyAgICAgICAgTV9CRF9MT09LOCAgICAgIEVzY2FwZSw3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEVzY2FwZSBWYWx1ZQorICAgICAgICBMU1IgICAgICAgICAgICAgRXNjYXBlLEVzY2FwZSwjMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRXNjYXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGZvciBlc2NhcGUgbW9kZQorICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzAKKyAgICAgICAgQk5FICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggaWYgbm90IGluIEVzY2FwZSBtb2RlIDMKKworICAgICAgICBNX0JEX1ZTS0lQOCAgICAgIzcsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBzaG9ydFZpZGVvSGVhZGVyIGZsYWcgdG8ga25vdyB0aGUgdHlwZSBvZiBFc2NhcGUgbW9kZQorICAgICAgICBCRVEgICAgICAgICAgICAgZW5kRmlsbFZMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEVzY2FwZSBNb2RlIDQKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZUxldmVsLDgsVDEKKworICAgICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHdoZXRoZXIgdGhlIFJlc2VydmVkIHZhbHVlcyBmb3IgTGV2ZWwgYXJlIHVzZWQgYW5kIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGl0IGlzIHNvCisKKyAgICAgICAgVEVRICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKKyAgICAgICAgVEVRTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIzEyOCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGVycm9yIGlmIENvdW50K3N0b3JlUnVuID49IDY0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBBZGRyZXNzIG9mIFppZ3phZyB0YWJsZQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICAgICAgICAgICAgICAgIAorICAgICAgICBTWFRCICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gRXh0ZW5kIHN0b3JlTGV2ZWwgdG8gMzIgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBMZXZlbAorICAgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgIAorICAgICAgICAKKworZW5kRmlsbFZMRAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBGdHlwZSggRXNjYXBlIE1vZGUpIHZhbHVlIGJhc2VkIG9uIHRoZSB0d28gc3VjY2Vzc2l2ZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0KKyAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgIAorICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzEKKyAgICAgICAgQkVRICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMxCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMworICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgCisKK25vdEVzY2FwZW1vZGUKKworICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyB0YWJsZSB3aXRoIGxhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQ29tYmluZWQgVkxDIFRhYmxlCisgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZnR5cGUgPj0zIGdldCBwZXJmb3JtIEZpeGVkIExlbmd0aCBEZWNvZGluZyAoRXNjYXBlIE1vZGUgMykKKyAgICAgICAgQkdFICAgICAgICAgICAgIEVzY2FwZU1vZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIGNvbnRpbnVlIG5vcm1hbCBWTEMgRGVjb2RpbmcKKyAgICAgICAgCisgICAgICAgIDsvLyBWYXJpYWJsZSBsZW5naCBkZWNvZGluZywgImFybVVuUGFja1ZMQzMyIiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgcGFja1JldEluZGV4LFQxLFQyLHBWbGNUYWJsZUwwTDEsNCwyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHRlbXAzLD0weEZGRgorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIHBhY2tSZXRJbmRleCx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBmb3IgaW52YWxpZCBzeW1ib2wKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBpbnZhbGlkIHN5bWJvbCBvY2N1cnMgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgICAgICBMYXN0LHBhY2tSZXRJbmRleCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IExhc3QgZnJvbSBwYWNrZWQgSW5kZXgKKyAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgCisKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlUnVuLHBhY2tSZXRJbmRleCwjNyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgUnVuIFZhbHVlIGZyb20gUGFja2VkIGluZGV4CisgICAgICAgIEFORCAgICAgICAgICAgICBzdG9yZUxldmVsLHBhY2tSZXRJbmRleCwjMHg3YyAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmVMZXZlbD1wYWNrUmV0SW5kZXhbMi02XSxzdG9yZUxldmVsWzAtMV09MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggdGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTGV2ZWwgdmFsdWUKKworICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGZ0eXBlMgorICAgICAgICAKKyAgICAgICAgOy8vIGZ0eXBlPT0xOyBFc2NhcGUgbW9kZSA9MQorICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBMTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgOy8vIElmIHRoZSBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSxzdG9yZVJ1bl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVMZXZlbCx0ZW1wMSxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgCisKK2Z0eXBlMgorCisgICAgICAgIDsvLyBmdHlwZSA9MjsgRXNjYXBlIG1vZGUgPTIKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzIKKyAgICAgICAgQk5FICAgICAgICAgICAgIEZpbGxWTERMMQorICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwUk1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgICA7Ly8gSWYgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCisgICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wMixzdG9yZUxldmVsLCMxCisgICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsdGVtcDJdCisKKyAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHN0b3JlUnVuLCMxCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bix0ZW1wMQorICAgICAgICAKK0ZpbGxWTERMMSAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHNpZ24sMSxUMQorCisgICAgICAgIENNUCAgICAgICAgICAgICBzaWduLCMxCisgICAgICAgIFJTQkVRICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzAKKyAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ2h0CisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisgCitzdG9yZUxldmVsTDEKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgTGV2ZWwgdmFsIGlzIExhc3Qgbm9uIHplcm8gdmFsCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBMU1IgICAgICAgICAgICAgTGFzdCxMYXN0LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAKKworCisgICAgICAgIDsvLyBGaXhlZCBMZW5naCBEZWNvZGluZyBFc2NhcGUgTW9kZSAzCisKK0VzY2FwZU1vZGUzCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKKyAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICBURVEgICAgICAgICAgICAgbWFya2VyYml0LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG1hcmtlciBiaXQgaXMgemVybworICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQxNiAgICAgc3RvcmVMZXZlbCwxMixUMQorCisgICAgICAgIFRTVCAgICAgICAgICAgICBzdG9yZUxldmVsLCMweDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVzdCBpZiB0aGUgbGV2ZWwgaXMgbmVnYXRpdmUKKyAgICAgICAgU1VCTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjNDA5NgorICAgICAgICBDTVAgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBDTVBORSAgICAgICAgICAgc3RvcmVMZXZlbCwjLTIwNDgKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBMZXZlbD09MCBvciAgLTIwNDggCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKKyAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQorICAgICAgICAgICAKKworICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIgKCBTaWduIG5vdCB1c2VkIGFzIHN0b3JlTGV2ZWwgaXMgcHJlcHJvY2Vzc2VkKQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW4gTGVuZ3RoCisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisKKworIAorc3RvcmVMZXZlbExhc3QKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZW5kIAorICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAgICAgICAgCitlbmQKKworICAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vUnVuIHRoZSBMb29wIHVudGlsbCBDb3VudCByZWFjaGVzIDY0CisKKyAgICAgICAgQkxUICAgICAgICAgICAgIGdldFZMQ2JpdHMKKworICAgICAgICAKK0V4aXRPaworICAgICAgICA7Ly8gRXhpdCBXaGVuIFZMQyBEZWNvZGluZyBpcyBkb25lIFN1Y2Nlc3NmdWxseSAKKyAgIAorICAgICAgICA7Ly8gTG9hZGluZyBwcEJpdFN0cmVhbSBhbmQgcEJpdE9mZnNldCBmcm9tIHN0YWNrCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0CisKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgICAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTU9WTkUgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIExpbmsgUmVnaXN0ZXIgQmFjaworICAgICAgICBCICAgICAgICAgICAgICAgZXhpdDIKKworRXhpdEVycm9yCisgICAgICAgIDsvLyBFeGl0IFdoZW4gYW4gRXJyb3Igb2NjdXJzIAorCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKyAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK2V4aXQyCisgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhhZjk3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSwyMTEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisKKworCisvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKKworLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6CisvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cworLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKKy8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCisvLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0CisvLworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCisvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCisvLworLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorCisvLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQorLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCisvLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKKyAKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCisgICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCisgICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCisgICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCisgICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCisgICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCisgICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCisgICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCisgICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCisgICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCisgICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCisgICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCisgICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCisgICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCisgICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCisgICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCisgICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCisgICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCisgICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCisgICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCisgICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCisgICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKK307CisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKKworCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKKyAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKKyAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKKyAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKKyAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKKyAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKKyAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKKyAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKKyAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKKyAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAoreworICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCisgICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAoreworICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKKyAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisKKwk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEKK307CisKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Cit7CisgICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCisJCisJMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NDhmODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpAQCAtMCwwICsxLDc1IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIExvb2t1cCB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworICAgIC8qICogVGFibGUgRW50cmllcyBjb250YWluIERjIFNjYWxlciB2YWx1ZXMKKyAgICAgICAqIGFybVZDTTRQMl9EQ1NjYWxlcltpXT0gOCAgICAgICAgICAgZm9yIGk9MSAgdG8gIDQgYW5kIGk9MzMgdG8gMzYKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippICAgICAgICAgZm9yIGk9NSAgdG8gIDgKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaSs4ICAgICAgICAgZm9yIGk9OSAgdG8gIDI1CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaS0xNiAgICAgIGZvciBpPTI2IHRvICAzMQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAoaS0zMisxMykvMiBmb3IgaT0zNyB0byAgNTkKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaS02LTMyICAgICAgZm9yIGk9NjAgdG8gIDYzCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgIGZvciBpPTAgYW5kIGk9MzIKKyAgICAgICAqLworICAgICAgIAorY29uc3QgT01YX1U4IGFybVZDTTRQMl9EQ1NjYWxlcls2NF09eworCTB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4YSwgIDB4YywgIDB4ZSwgIAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAorICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisgICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwKKyAgICAweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweDksICAweDksICAweGEsICAKKyAgICAweGEsICAweGIsICAweGIsICAweGMsICAweGMsICAweGQsICAweGQsICAweGUsICAKKyAgICAweGUsICAweGYsICAweGYsICAweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAKKyAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAorCit9OworCisgICAgICAgICAgICAgIAorICAgICAvKiAgVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2W2ldPXJvdW5kKDMyNzY3L2kpCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbMF09IDAKKyAgICAgICovCisKK2NvbnN0IE9NWF9TMTYgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzY0XT17CisJMHgwMDAwLDB4N2ZmZiwweDQwMDAsMHgyYWFhLDB4MjAwMCwweDE5OTksMHgxNTU1LDB4MTI0OSwKKyAgICAweDEwMDAsMHgwZTM5LDB4MGNjZCwweDBiYTMsMHgwYWFiLDB4MDlkOSwweDA5MjUsMHgwODg4LAorICAgIDB4MDgwMCwweDA3ODcsMHgwNzFjLDB4MDZiZCwweDA2NjYsMHgwNjE4LDB4MDVkMSwweDA1OTEsCisgICAgMHgwNTU1LDB4MDUxZiwweDA0ZWMsMHgwNGJlLDB4MDQ5MiwweDA0NmEsMHgwNDQ0LDB4MDQyMSwKKyAgICAweDA0MDAsMHgwM2UxLDB4MDNjNCwweDAzYTgsMHgwMzhlLDB4MDM3NiwweDAzNWUsMHgwMzQ4LAorICAgIDB4MDMzMywweDAzMWYsMHgwMzBjLDB4MDJmYSwweDAyZTksMHgwMmQ4LDB4MDJjOCwweDAyYjksCisgICAgMHgwMmFiLDB4MDI5ZCwweDAyOGYsMHgwMjgyLDB4MDI3NiwweDAyNmEsMHgwMjVmLDB4MDI1NCwKKyAgICAweDAyNDksMHgwMjNmLDB4MDIzNSwweDAyMmIsMHgwMjIyLDB4MDIxOSwweDAyMTEsMHgwMjA4CisJICAgCit9OworICAgICAKKyAgICAgIC8qIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMltpXT1yb3VuZCgxMzEwNzEvaSkKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMlswXT0gMAorICAgICAgICovCisKK2NvbnN0IE9NWF9TMzIgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzY0XT17CisJMHgwMDAwMDAwMCwweDAwMDFmZmZmLDB4MDAwMTAwMDAsMHgwMDAwYWFhYSwgMHgwMDAwODAwMCwgMHgwMDAwNjY2NiwgMHgwMDAwNTU1NSwgMHgwMDAwNDkyNCwKKyAgICAweDAwMDA0MDAwLDB4MDAwMDM4ZTMsMHgwMDAwMzMzMywweDAwMDAyZThjLCAweDAwMDAyYWFiLCAweDAwMDAyNzYyLCAweDAwMDAyNDkyLCAweDAwMDAyMjIyLAorICAgIDB4MDAwMDIwMDAsMHgwMDAwMWUxZSwweDAwMDAxYzcyLDB4MDAwMDFhZjIsIDB4MDAwMDE5OWEsIDB4MDAwMDE4NjEsIDB4MDAwMDE3NDYsIDB4MDAwMDE2NDMsCisgICAgMHgwMDAwMTU1NSwweDAwMDAxNDdiLDB4MDAwMDEzYjEsMHgwMDAwMTJmNiwgMHgwMDAwMTI0OSwgMHgwMDAwMTFhOCwgMHgwMDAwMTExMSwgMHgwMDAwMTA4NCwKKyAgICAweDAwMDAxMDAwLDB4MDAwMDBmODQsMHgwMDAwMGYwZiwweDAwMDAwZWExLCAweDAwMDAwZTM5LCAweDAwMDAwZGQ2LCAweDAwMDAwZDc5LCAweDAwMDAwZDIxLAorICAgIDB4MDAwMDBjY2QsMHgwMDAwMGM3ZCwweDAwMDAwYzMxLDB4MDAwMDBiZTgsIDB4MDAwMDBiYTMsIDB4MDAwMDBiNjEsIDB4MDAwMDBiMjEsIDB4MDAwMDBhZTUsCisgICAgMHgwMDAwMGFhYiwweDAwMDAwYTczLDB4MDAwMDBhM2QsMHgwMDAwMGEwYSwgMHgwMDAwMDlkOSwgMHgwMDAwMDlhOSwgMHgwMDAwMDk3YiwgMHgwMDAwMDk0ZiwKKyAgICAweDAwMDAwOTI1LDB4MDAwMDA4ZmIsMHgwMDAwMDhkNCwweDAwMDAwOGFlLCAweDAwMDAwODg5LCAweDAwMDAwODY1LCAweDAwMDAwODQyLCAweDAwMDAwODIwCisJCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRmMjQ2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKQEAgLTAsMCArMSwxMDQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOyAqKgorOyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKzsgKiBbb3V0XXByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtvdXRdcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorOyAqCis7ICovCisKKyAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICBJTkNMVURFIG9teFZDX3MuaAorCisKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKyAgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvLyBJbnB1dCBBcmd1bWVudHMKK0Jsb2NrSW5kZXggICAgICAgICBSTiAwCitwQ29lZkJ1ZlJvdyAgICAgICAgUk4gMQorcENvZWZCdWZDb2wgICAgICAgIFJOIDIKK3ByZWREaXIgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgICAgUk4gNAorcFFwQnVmICAgICAgICAgICAgIFJOIDUKKworOy8vIExvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgUk4gMAorYmxvY2tEQ0xlZnQgICAgICAgIFJOIDYgIAorYmxvY2tEQ1RvcCAgICAgICAgIFJOIDcKK2Jsb2NrRENUb3BMZWZ0ICAgICBSTiA4Cit0ZW1wMSAgICAgICAgICAgICAgUk4gOQordGVtcDIgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBNX1NUQVJUICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyLHI5CisKKyAgICAgICBNX0FSRyAgICAgICBwcHJlZFFQLDQKKyAgICAgICBNX0FSRyAgICAgICBwcFFwQnVmLDQKKyAgICAKKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDVG9wTGVmdCxbcENvZWZCdWZSb3csIy0xNl0KKyAgICAgICBMRFJIICAgICAgICBibG9ja0RDTGVmdCxbcENvZWZCdWZDb2xdCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgQmxvY2tJbmRleCwjMworICAgICAgIExEUkVRSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmQ29sLCMtMTZdCisgICAgICAgTERSTkVIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZSb3ddCisgICAgICAgICAgICAgCisgICAgICAgU1VCUyAgICAgICAgdGVtcDEsYmxvY2tEQ0xlZnQsYmxvY2tEQ1RvcExlZnQKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMSx0ZW1wMSwjMAorICAgICAgIFNVQlMgICAgICAgIHRlbXAyLGJsb2NrRENUb3BMZWZ0LGJsb2NrRENUb3AKKyAgICAgICBSU0JMVCAgICAgICB0ZW1wMix0ZW1wMiwjMAorICAgICAgCisgICAgICAgTV9MRFIgICAgICAgcFFwQnVmLHBwUXBCdWYKKyAgICAgICBNX0xEUiAgICAgICBwcmVkUVAscHByZWRRUAorICAgICAgIENNUCAgICAgICAgIHRlbXAxLHRlbXAyCisgICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19WRVJUSUNBTAorICAgICAgIExEUkxUQiAgICAgIHRlbXAxLFtwUXBCdWYsIzFdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgU1RSTFQgICAgICAgdGVtcDEsW3ByZWRRUF0KKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX0hPUklaT05UQUwgICAgICAgICAgIAorICAgICAgIExEUkdFQiAgICAgIHRlbXAxLFtwUXBCdWZdCisgICAgICAgU1RSR0UgICAgICAgdGVtcDIsW3ByZWREaXJdCisgICAgICAgTU9WICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgU1RSR0UgICAgICAgdGVtcDEsW3ByZWRRUF0gCisKKyAgICAgICAgIAorICAgIAorICAgICAgIE1fRU5ECisgCisgICAgICAgRU5ESUYKKworICAgICAgIEVORCAgICAKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjFmYTcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKy8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCisgKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAorICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKK3sKKyAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKKyAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAorICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKKyAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCisgICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAorICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCisgICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAorICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCisKKwkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAorICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAorICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKKyAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKKyAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAorICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKKyAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCisgICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKKworICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCisgICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAorICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKKyAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCisgICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAorICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCisgICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2CisKKworfTsKKworCisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5NmFkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAorICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkKKyAqIG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yCisgKiBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10KKyAqIFtpbl0JUVAJCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBpbmRpY2F0ZXMgdXNpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBkZWZpbmVkIGluIHNob3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGhlYWRlciBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBpbmRpY2F0ZXMgbm9ybWFpbCBxdWFudGl6YXRpb24gbWV0aG9kLgorICogW291dF0gcHBCaXRTdHJlYW0gCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdIHBEc3QJCQlwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGRhdGEgdHlwZSkuIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6CisgKiAgIC0gKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgUVAgPD0gMDsKKyAqCSAtIHBEc3Qgbm90IDE2LWJ5dGUgYWxpZ25lZAorICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgUVApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKwkgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI4NjU3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyogRnVuY3Rpb24gZm9yIHNhdHVyYXRpbmcgMTYgYml0IHZhbHVlcyB0byB0aGUgWzAsMjU1XSByYW5nZSBhbmQgICovCisvKiB3cml0aW5nIG91dCBhcyA4IGJpdCB2YWx1ZXMuICBEb2VzIDY0IGVudHJpZXMgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgYXJtVkNNNFAyX0NsaXA4KE9NWF9TMTYgKnBTcmMsIE9NWF9VOCAqcERzdCwgT01YX0lOVCBkc3RTdGVwICk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgorICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKKyAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddLgorICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKKyAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKKyAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCisgKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KKyAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgorICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAorICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCisgKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQworICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQorICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCisgKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0CisgKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKKyAqCQkJCQkJCQltYWNyb2Jsb2NrLgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgorICogICAgICBvcgorICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKKyAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCisgKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCisgKiAgICAgIG9yCisgKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICAKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7CisgICAgfQorCisgICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGlmIChpbnRyYURDVkxDID09IDEpCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgdmlkZW9Db21wKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgIGN1clFQLAorICAgICAgICBwcmVkUVAsCisgICAgICAgIHByZWREaXIsCisgICAgICAgIEFDUHJlZEZsYWcsCisgICAgICAgIHZpZGVvQ29tcCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIGN1clFQLAorICAgICB2aWRlb0NvbXAsCisgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCisgICAgICAgaXQgdG8gMCB0byAyNTUgKi8KKyAgICAKKwlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7CisJCisJCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MxNmY1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKQEAgLTAsMCArMSwzNjQgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICoqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgorOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKKzsgKiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKzsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKKzsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Cis7ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCis7ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCis7ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAorOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Cis7ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgorOyAqIAorOyAqICAgICAgICAgICAgICAgICAgICAgCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKgorOyAqCisgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIElOQ0xVREUgb214VkNfcy5oCisgICAgICAgIAorICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgICAgICAgICAgCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQorcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKK3BTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCitwU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAorcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKK2Zjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2CitNQlR5cGUgICAgICAgICAgICAgICAgUk4gNworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworemVybyAgICAgICAgICAgICAgICAgIFJOIDQKK29uZSAgICAgICAgICAgICAgICAgICBSTiA0CitzY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQorCisKK1JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKK1ZsY01WRCAgICAgICAgICAgICAgICBSTiAwCitpbmRleCAgICAgICAgICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKKworbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKK212SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCisKK212VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAorbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKKwordGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKKwordGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKK0hpZ2ggICAgICAgICAgICAgICAgICBSTiA0CitMb3cgICAgICAgICAgICAgICAgICAgUk4gMgorUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKKworQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0CisKK2RpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCitkaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQorCis7Ly8gU2NyYXRjaCBSZWdpc3RlcnMKKworUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKK1JCaXRDb3VudCAgICAgICAgICAgICBSTiA5CitSQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKKworVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgICBSTiAxNAorCisgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECisgICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0CisgICAgICAgCisgICAgICAgICAgICAgIAorCisKKyAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCisgICAgICAgCisgICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAorICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjaworCisgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KKworICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjaworCisgICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjaworCisgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICAgICAgIAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKKyAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKKworCitMb29wCisKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQorCisgICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAorICAgICAgIAorICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCitWZXJ0aWNhbERhdGEKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAorICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKKyAgICAgICAgICAgICAKKworICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCisKKyAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAorICAgICAgICAKK0ZpbmRNVlByZWQKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCisKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCisgICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKKyAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCisgICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4CisgICAgICAgCisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgCisgICAgICAgCisgICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKKyAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKKyAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQorCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCisgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KKworICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAorCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5CisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93CisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorCisgICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCisKKworICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCisgICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQorICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKKworICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgCitFeGl0RXJyb3IKKworICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK0V4aXRPSyAgICAgICAgICAgICAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjA4YzIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCkBAIC0wLDAgKzEsMTMyIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CisKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcworICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKKworICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgorICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcworICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAgIAorCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCisgICAgICAgICAKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhMzdlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpAQCAtMCwwICsxLDEzNiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KKworCisKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc4YWFmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCkBAIC0wLDAgKzEsMjI0IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAKKyAgICAgIAorCisKKyAgICAgIElGIENvcnRleEE4CisKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCisgICAgICAgIAorCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwordmlkZW9Db21wICAgICAgICAgICAgUk4gNQorOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAorcERDQ2hyb21hSW5kZXggICAgICAgUk4gNworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgorcG93T2ZTaXplICAgICAgICAgICAgUk4gNwordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0RDVmFsICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0CisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCisgICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCisKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCisKKyAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCisKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQorCisgICAgCisgICAgICAgCisKK0RlY29kZURDCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAorICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCisgICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKKyAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCisgICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCisKK0NoZWNrRENWYWx1ZVNpemUKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAorCisgICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQorCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICAKKworICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50CisKK0FDRGVjb2RlCisKKyAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCisgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjaworICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgorCisgICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjaworICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgICAgICAgIAorICAgICAgICAgICAgICAKKworRXhpdEVycm9yCisgCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKK0V4aXRPSworICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhZjcxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCkBAIC0wLDAgKzEsMTk0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1WQ0NPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQorICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCisgICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCitwU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKK3BTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQorcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCitwU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKK3BEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAorcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1CitpQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0CitDYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCisKK3BDYW5kTVYxICAgICAgICAgICAgICAgUk4gNworcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4CitwQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKKworQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAorQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAorQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCitDYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKK0NhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKK0NhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKKwordGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAorCit6ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKKyAgICAgICAgCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFpbiByb3V0aW5lCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAorCisgICAgICAgIE1fQUxMT0M0IE1WLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0CisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAorICAgICAgICBNX0FSRyAgIEJsaywgNAorICAgICAgICAKKyAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgorICAgICAgICBNT1YgICB6ZXJvLCAjMAorICAgICAgICBNX0xEUiBpQmxrLCBCbGsKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCisgICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKKyAgICAKKyAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KKworICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKKyAgICAgICAgTV9TV0lUQ0ggaUJsaworICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorT01YVkNCbGswCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAorCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMworICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKyAgICAKK09NWFZDQmxrMQorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgorICAgIAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazMKKyAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgIAorQmxrRW5kCisKKyAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybworICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5CisgICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCisgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQorCisgICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQorICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KKyAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCisKKyAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAorCisgICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKKyAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKKworICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KKyAgICAgICAgICAgCisgICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCisKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKKworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAorICAgIAorICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgorICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCisKKyAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAKKyAgICAgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVlM2QwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKQEAgLTAsMCArMSw3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAgICAgT01YUmVzdWx0CisgICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKKyAgICAgICAgOy8vICAgIAorICAgICAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0CisgICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0CisgICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAorICAgIEVORElGCisgICAgCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExLCBkMTUKKyAgICBFTkRJRgorICAgICAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1Jlc3VsdCAgICAgICAgICBSTiAwCisKKzsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAorOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCis7Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKKzsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCis7Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworcFNyYyAgICBSTiAwICAgIAorU3RyaWRlICBSTiAxICAgIAorcERlc3QgICBSTiAyICAgIAorcFNjYWxlICBSTiAzICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAorICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCisgICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQgICAgICAgCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDAwZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCkBAIC0wLDAgKzEsNDQ0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLworOy8vCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKyAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKworICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBJRiAgQ29ydGV4QTgKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNQUNSTyBERUZJTklUSU9OUworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIEp1c3QgY29waWVzIGEgYmxvY2sgZnJvbSBwU3JjIHRvIHBEc3QKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czogTm9uZQorICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKK0Nhc2VJbnRlZ2VyUGl4ZWxfUm5kMAorQ2FzZUludGVnZXJQaXhlbF9SbmQxCisKKyAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAorCisgICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWCIgcHJlZGljdFR5cGUuIFRoZSB0d28gCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCisgICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIHJpZ2h0IHRvIGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCisgICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCisgICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiAKKyAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwKKworICAgIExDTFMgTV9WSEFERFIKKyAgICBJRiAkcm5kVmFsID0gMAorTV9WSEFERFIgU0VUUyAiVlJIQUREIgorICAgIEVMU0UKK01fVkhBRERSIFNFVFMgIlZIQUREIgorICAgIEVORElGCisKK0Nhc2VIYWxmUGl4ZWxYX1JuZCRybmRWYWwKKworICAgIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzNTaGZ0LCBkUm93MywgZFJvdzNTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzRTaGZ0LCBkUm93NCwgZFJvdzRTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NiwgZFJvdzZTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NywgZFJvdzdTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQorICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzBTaGZ0CisgICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzIsIGRSb3cyLCBkUm93MlNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93M1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NFNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzUsIGRSb3c1LCBkUm93NVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NlNoZnQKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93N1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIAorICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWSIgcHJlZGljdFR5cGUuIFRoZSB0d28gCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCisgICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIGJlbG93IGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCisgICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCisgICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiAKKyAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwKKworICAgIExDTFMgTV9WSEFERFIKKyAgICBJRiAkcm5kVmFsID0gMAorTV9WSEFERFIgU0VUUyAiVlJIQUREIgorICAgIEVMU0UKK01fVkhBRERSIFNFVFMgIlZIQUREIgorICAgIEVORElGCisKK0Nhc2VIYWxmUGl4ZWxZX1JuZCRybmRWYWwKKyAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzEKKyAgICBWTEQxICAgICAgICBkUm93OCwgW3BTcmNdLCBzcmNTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MgorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3czCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3czLCBkUm93MywgZFJvdzQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NQorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c2CisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3c2LCBkUm93NiwgZFJvdzcKKyAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93OAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUuIEJvdGggCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkLiAKKyAgICA7Ly8gVHlwaWNhbCBjb21wdXRhdGlvbiBmb3IgYSByb3cgZ29lcyBsaWtlIHRoaXMKKyAgICA7Ly8gICAgIDEuIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwIDsvLyBMb2FkIHRoZSByb3cgYW5kIG5leHQgOCBieXRlcworICAgIDsvLyAgICAgMi4gVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMSAgICAgOy8vIEdlbmVyYXRlIHRoZSBzaGlmdGVkIHJvdworICAgIDsvLyAgICAgMy4gVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQgICAgICAgICAgICAgOy8vIEdlbmVyYXRlIHRoZSBzdW0gb2Ygcm93IGFuZCBzaGlmdGVkIHJvdworICAgIDsvLyAgICAgNS4gVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMSAgICAgICAgICAgICAgICAgOy8vIEFkZCB0byB0aGUgc3VtIG9mIG5leHQgcm93IChvZGQgcm93IHN1bSBoYXMgcm91bmRpbmcgdmFsdWUgYWRkZWQgdG8gaXQpCisgICAgOy8vICAgICA2LiBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyICAgICAgICAgICAgICAgICAgICA7Ly8gRGl2aWRlIGJ5IDQKKyAgICA7Ly8gICAgIDcuIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAgICAgICAgICAgIDsvLyBTdG9yZQorICAgIDsvLyBPZGQgcm93cyB1bmRlcmdvIGZvbGxvd2luZyBjb21wdXRhdGlvbiBhZnRlciBzdGVwIDMKKyAgICA7Ly8gICAgIDQuIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCisgICAgOy8vIFRoaXMgc2F2ZXMgZm9yIGFkZGluZyByb3VuZGluZyB2YWx1ZSB0byBlYWNoIGZpbmFsIHN1bSAob3ZlcmFsbCBzYXZlcyA0IAorICAgIDsvLyBpbnN0cnVjdGlvbnMpLgorICAgIDsvLyBUaGVyZSBpcyByZXVzZSBvZiByZWdpc3RlcnMgZm9yIHFTdW02LCBxU3VtNyAmIHFTdW04LiBPdmVyYWxsIHNjaGVkdWxpbmcgdGFrZXMgCisgICAgOy8vIGNhcmUgb2YgdGhpcyBhbmQgYWxzbyBtaW5pbWl6ZXMgc3RhbGxzLiBSb3VuZGluZyB2YWx1ZSB3YXMgbW9kaWZpZWQgaW4gCisgICAgOy8vIEFSTSByZWdpc3RlciBybmRWYWwgKG9yaWdpbmFsbHkgdXNlZCBmb3Igcm91bmRpbmcgZmxhZykgYmVmb3JlIHRoZSBzd2l0Y2guCisgICAgOy8vIEl0IGlzIHRoZW4gcG9wdWxhdGVkIGludG8gYWxsIGxhbmVzIGluIHRoaXMgbWFjcm8uIE5vIGJyYW5jaGluZyBvdXQgdG8gCisgICAgOy8vIGxhYmVsICJTd2l0Y2hQcmVkaWN0VHlwZUVuZCIgaXMgcmVxdWlyZWQgaW4gdGhlIGVuZCBvZiB0aGUgbWFjcm8gYXMgdGhlc2UgCisgICAgOy8vIGFyZSB0aGUgbGFzdCBvZiBzd2l0Y2ggY2FzZXMuCisgICAgOy8vIAorICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IE5vbmUKKyAgICA7Ly8gT3V0cHV0czogTm9uZQorCisgICAgTUFDUk8gCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKKworQ2FzZUhhbGZQaXhlbFhZX1JuZDAKK0Nhc2VIYWxmUGl4ZWxYWV9SbmQxCisgICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRFVQICAgICAgICBxUm91bmQsIHJuZFZhbAorICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQorICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQKKyAgICBWTEQxICAgICAgICB7ZFJvdzUsIGRSb3c1U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZBRERMICAgICAgIHFTdW0xLCBkUm93MSwgZFJvdzFTaGZ0CisgICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c4LCBkUm93OFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFSb3VuZAorICAgIFZBRERMICAgICAgIHFTdW0yLCBkUm93MiwgZFJvdzJTaGZ0CisgICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQorICAgIFZBREQgICAgICAgIHFTdW0wLCBxU3VtMCwgcVN1bTEKKyAgICBWQURETCAgICAgICBxU3VtMywgZFJvdzMsIGRSb3czU2hmdAorICAgIFZFWFQgICAgICAgIGRSb3c2U2hmdCwgZFJvdzYsIGRSb3c2U2hmdCwgIzEKKyAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFTdW0yCisgICAgVlNIUk4gICAgICAgZFJvdzAsIHFTdW0wLCAjMgorICAgIFZBRERMICAgICAgIHFTdW00LCBkUm93NCwgZFJvdzRTaGZ0CisgICAgVlNIUk4gICAgICAgZFJvdzEsIHFTdW0xLCAjMgorICAgIFZBREQgICAgICAgIHFTdW0zLCBxU3VtMywgcVJvdW5kCisgICAgVkFEREwgICAgICAgcVN1bTUsIGRSb3c1LCBkUm93NVNoZnQKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWRVhUICAgICAgICBkUm93OFNoZnQsIGRSb3c4LCBkUm93OFNoZnQsICMxCisgICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxUm91bmQKKyAgICBWQUREICAgICAgICBxU3VtMiwgcVN1bTIsIHFTdW0zCisgICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxU3VtNAorICAgIFZBREQgICAgICAgIHFTdW00LCBxU3VtNCwgcVN1bTUKKyAgICBWU0hSTiAgICAgICBkUm93MiwgcVN1bTIsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzMsIHFTdW0zLCAjMgorICAgIFZTSFJOICAgICAgIGRSb3c0LCBxU3VtNCwgIzIKKyAgICBWQURETCAgICAgICBxU3VtNiwgZFJvdzYsIGRSb3c2U2hmdAorICAgIFZBRERMICAgICAgIHFTdW03LCBkUm93NywgZFJvdzdTaGZ0CisgICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZBRERMICAgICAgIHFTdW04LCBkUm93OCwgZFJvdzhTaGZ0CisgICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxUm91bmQKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZBREQgICAgICAgIHFTdW01LCBxU3VtNSwgcVN1bTYKKyAgICBWQUREICAgICAgICBxU3VtNiwgcVN1bTYsIHFTdW03CisgICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxU3VtOAorICAgIFZTSFJOICAgICAgIGRSb3c1LCBxU3VtNSwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93NiwgcVN1bTYsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzcsIHFTdW03LCAjMgorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycworcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCitwU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMgorcERzdCAgICAgICAgICAgICAgICAgIFJOIDMKK2RzdFN0ZXAgICAgICAgICAgICAgICBSTiA0CitwcmVkaWN0VHlwZSAgICAgICAgICAgUk4gNQorcm5kVmFsICAgICAgICAgICAgICAgIFJOIDYKKworOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRHN0Q29weSAgICAgICAgICAgICAgUk4gMAorcmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworOy8vIE5lb24gUmVnaXN0ZXJzCitkUm93MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKK2RSb3cwU2hmdCAgICAgICAgICAgICBETiBEMS5VOAorZFJvdzEgICAgICAgICAgICAgICAgIEROIEQyLlU4CitkUm93MVNoZnQgICAgICAgICAgICAgRE4gRDMuVTgKK2RSb3cyICAgICAgICAgICAgICAgICBETiBENC5VOAorZFJvdzJTaGZ0ICAgICAgICAgICAgIEROIEQ1LlU4CitkUm93MyAgICAgICAgICAgICAgICAgRE4gRDYuVTgKK2RSb3czU2hmdCAgICAgICAgICAgICBETiBENy5VOAorZFJvdzQgICAgICAgICAgICAgICAgIEROIEQ4LlU4CitkUm93NFNoZnQgICAgICAgICAgICAgRE4gRDkuVTgKK2RSb3c1ICAgICAgICAgICAgICAgICBETiBEMTAuVTgKK2RSb3c1U2hmdCAgICAgICAgICAgICBETiBEMTEuVTgKK2RSb3c2ICAgICAgICAgICAgICAgICBETiBEMTIuVTgKK2RSb3c2U2hmdCAgICAgICAgICAgICBETiBEMTMuVTgKK2RSb3c3ICAgICAgICAgICAgICAgICBETiBEMTQuVTgKK2RSb3c3U2hmdCAgICAgICAgICAgICBETiBEMTUuVTgKK2RSb3c4ICAgICAgICAgICAgICAgICBETiBEMTYuVTgKK2RSb3c4U2hmdCAgICAgICAgICAgICBETiBEMTcuVTgKKworCitxU3VtMCAgICAgICAgICAgICAgICAgUU4gUTkuVTE2CitxU3VtMSAgICAgICAgICAgICAgICAgUU4gUTEwLlUxNgorcVN1bTIgICAgICAgICAgICAgICAgIFFOIFExMS5VMTYKK3FTdW0zICAgICAgICAgICAgICAgICBRTiBRMTIuVTE2CitxU3VtNCAgICAgICAgICAgICAgICAgUU4gUTEzLlUxNgorcVN1bTUgICAgICAgICAgICAgICAgIFFOIFExNC5VMTYKK3FTdW02ICAgICAgICAgICAgICAgICBRTiBRMC5VMTYKK3FTdW03ICAgICAgICAgICAgICAgICBRTiBRMS5VMTYKK3FTdW04ICAgICAgICAgICAgICAgICBRTiBRMi5VMTYKKworcVJvdW5kICAgICAgICAgICAgICAgIFFOIFExNS5VMTYKKworZERzdDAgICAgICAgICAgICAgICAgIEROIEQwLlU4CitkRHN0MSAgICAgICAgICAgICAgICAgRE4gRDEuVTgKK2REc3QyICAgICAgICAgICAgICAgICBETiBEMi5VOAorZERzdDMgICAgICAgICAgICAgICAgIEROIEQzLlU4CitkRHN0NCAgICAgICAgICAgICAgICAgRE4gRDQuVTgKK2REc3Q1ICAgICAgICAgICAgICAgICBETiBENS5VOAorZERzdDYgICAgICAgICAgICAgICAgIEROIEQ2LlU4CitkRHN0NyAgICAgICAgICAgICAgICAgRE4gRDcuVTgKKworcVJlczAgICAgICAgICAgICAgICAgIFFOIFE0LlMxNgorcVJlczEgICAgICAgICAgICAgICAgIFFOIFE1LlMxNgorcVJlczIgICAgICAgICAgICAgICAgIFFOIFE2LlMxNgorcVJlczMgICAgICAgICAgICAgICAgIFFOIFE3LlMxNgorcVJlczQgICAgICAgICAgICAgICAgIFFOIFE4LlMxNgorcVJlczUgICAgICAgICAgICAgICAgIFFOIFE5LlMxNgorcVJlczYgICAgICAgICAgICAgICAgIFFOIFExMC5TMTYKK3FSZXM3ICAgICAgICAgICAgICAgICBRTiBRMTEuUzE2CisKKyAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgTV9TVEFSVCAgICAgb214VkNNNFAyX01DUmVjb25CbG9jaywgcjYsIGQxNQorICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0CisgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAorICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKKyAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKKyAgICBBREQgICAgICAgICBwcmVkaWN0VHlwZSwgcm5kVmFsLCBwcmVkaWN0VHlwZSwgTFNMICMxCisgICAgUlNCICAgICAgICAgcm5kVmFsLCBybmRWYWwsICMyICAgICAgICAgICAgICA7Ly8gcHJlcGFyaW5nIHJuZFZhbCBmb3IgSGFsZlBpeGVsWFkKKyAgICAKKyAgICA7Ly8gVGhlIGZvbGxvd2luZyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBzd2l0Y2hpbmcgdG8gZGlmZmVyZW50IGNvZGUgc2VnbWVudHMKKyAgICA7Ly8gYmFzZWQgb24gZGlmZmVyZW50IHByZWRpY3RUeXBlIGFuZCBybmRWYWwgZmxhZ3MuIFRoZSBjb3JyZXNwb25kaW5nIAorICAgIDsvLyBsYWJlbHMgKGUuZy4gQ2FzZUludGVnZXJQaXhlbF9SbmQwKSBhcmUgZW1iZWRkZWQgaW4gdGhlIG1hY3JvcyBmb2xsb3dpbmcKKyAgICA7Ly8gTV9FTkRTV0lUQ0ggKGUuZy4gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsKS4gV2hpbGUgIk1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCIgCisgICAgOy8vIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkiIGhhbmRsZSBmb3IgYm90aCByb3VuZGluZyBjYXNlczsgCisgICAgOy8vICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYIiBhbmQgIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkiIG1hY3JvcyBoYW5kbGUgCisgICAgOy8vIHRoZSB0d28gcm91bmRpbmcgY2FzZXMgaW4gc2VwYXJhdGUgY29kZSBiYXNlcy4KKyAgICA7Ly8gQWxsIHRoZXNlIHRvZ2V0aGVyIGltcGxlbWVudCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbmFsaXR5CisgICAgCisgICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VJbnRlZ2VyUGl4ZWxfUm5kMQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWF9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDEKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFlfUm5kMAorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQxCisgICAgTV9FTkRTV0lUQ0gKKworICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMQorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMQorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCitTd2l0Y2hQcmVkaWN0VHlwZUVuZAorCisgICAgOy8vIEFmdGVyIGludGVycG9sYXRpb24gaXMgZG9uZSwgcmVzaWR1ZSBuZWVkcyB0byBiZSBhZGRlZC4gVGhpcyBpcyBkb25lIAorICAgIDsvLyBvbmx5IGluIGNhc2UgInBTcmNSZXNpZHVlIiBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLgorICAgIDsvLyBGb2xsb3dpbmcgaXMgYSBjb21wbGV0ZWx5IHVucm9sbGVkIGNvZGUgdG8gZG8gc28uIEVhY2ggcm93IGFuZCAKKyAgICA7Ly8gY29ycmVzcG9uZGluZyByZXNpZHVlIGlzIGxvYWRlZCBhbmQgcmVzaWR1ZSBpcyBhZGRlZCBhbmQgdmFsdWUgCisgICAgOy8vIHN0b3JlZAorICAgIAorICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAorICAgIFNVQk5FICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMyAgICAgOy8vIFJlc3RvcmluZyBwRHN0CisgICAgTU9WTkUgICAgICAgcERzdENvcHksIHBEc3QKKyAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAorICAgIFZMRDEgICAgICAgIGREc3QwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWTEQxICAgICAgICBxUmVzMCwgW3BTcmNSZXNpZHVlQDEyOF0hCisgICAgVkxEMSAgICAgICAgZERzdDEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZMRDEgICAgICAgIHFSZXMxLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWTEQxICAgICAgICBkRHN0MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkxEMSAgICAgICAgcVJlczIsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMwLCBxUmVzMCwgZERzdDAKKyAgICBWTEQxICAgICAgICBkRHN0MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFERFcgICAgICAgcVJlczEsIHFSZXMxLCBkRHN0MQorICAgIFZMRDEgICAgICAgIHFSZXMzLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzMiwgcVJlczIsIGREc3QyCisgICAgVkxEMSAgICAgICAgZERzdDQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QwLCBxUmVzMAorICAgIFZMRDEgICAgICAgIHFSZXM0LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzMywgcVJlczMsIGREc3QzCisgICAgVkxEMSAgICAgICAgZERzdDUsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QxLCBxUmVzMQorICAgIFZMRDEgICAgICAgIHFSZXM1LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNCwgcVJlczQsIGREc3Q0CisgICAgVkxEMSAgICAgICAgZERzdDYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QyLCBxUmVzMgorICAgIFZMRDEgICAgICAgIHFSZXM2LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNSwgcVJlczUsIGREc3Q1CisgICAgVkxEMSAgICAgICAgZERzdDcsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3QzLCBxUmVzMworICAgIFZMRDEgICAgICAgIHFSZXM3LCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWQUREVyAgICAgICBxUmVzNiwgcVJlczYsIGREc3Q2CisgICAgVlNUMSAgICAgICAgZERzdDAsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NCwgcVJlczQKKyAgICBWU1QxICAgICAgICBkRHN0MSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZBRERXICAgICAgIHFSZXM3LCBxUmVzNywgZERzdDcKKyAgICBWU1QxICAgICAgICBkRHN0MiwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q1LCBxUmVzNQorICAgIFZTVDEgICAgICAgIGREc3QzLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDYsIHFSZXM2CisgICAgVlNUMSAgICAgICAgZERzdDQsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NywgcVJlczcKKyAgICBWU1QxICAgICAgICBkRHN0NSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGREc3Q2LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZERzdDcsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICAKK3BTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCisgICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICBFTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzNmNjRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCkBAIC0wLDAgKzEsMzIwIEBACis7ICoqKioqKioqKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICogRGVzY3JpcHRpb246Cis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCis7ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKzsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCis7ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KKzsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCis7ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAorOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCis7ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCis7ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKzsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCis7ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCis7ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCis7ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCis7ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCis7ICogICA0LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqKioqKioqKioKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgIAorICAgICAgICAgICAgIAorCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICAgCisgICAgICAgIElGIENvcnRleEE4Cis7Ly8gSW5wdXQgQXJndW1lbnRzCisKK3BTcmNEc3QgICAgICAgICAgUk4gMAorcFByZWRCdWZSb3cgICAgICBSTiAxCitwUHJlZEJ1ZkNvbCAgICAgIFJOIDIKK2N1clFQICAgICAgICAgICAgUk4gMworUVAgICAgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgIFJOIDQKK3ByZWREaXIgICAgICAgICAgUk4gNQorQUNQcmVkRmxhZyAgICAgICBSTiA2Cit2aWRlb0NvbXAgICAgICAgIFJOIDcKKworOy8vIExvY2FsIFZhcmlhYmxlcworCitzaG9ydFZpZGVvSGVhZGVyIFJOIDQKK2RjU2NhbGVyICAgICAgICAgUk4gNAoraW5kZXggICAgICAgICAgICBSTiA2CitwcmVkQ29lZmZUYWJsZSAgIFJOIDcKK3RlbXAxICAgICAgICAgICAgUk4gNgordGVtcDIgICAgICAgICAgICBSTiA5Cit0ZW1wICAgICAgICAgICAgIFJOIDE0CitDb25zdCAgICAgICAgICAgIFJOIDgKK3RlbXBwUHJlZENvbEJ1ZiAgUk4gOAordGVtcFByZWQgICAgICAgICBSTiA5CisKK2Fic0NvZWZmREMgICAgICAgUk4gOAorbmVnZGNTY2FsZXIgICAgICBSTiAxMAorUmVtICAgICAgICAgICAgICBSTiAxMQordGVtcDMgICAgICAgICAgICBSTiAxMgorCitkY1Jvd2J1ZkNvZWZmICAgIFJOIDEwCitkY0NvbEJ1ZmZDb2VmZiAgIFJOIDExCitSZXR1cm4gICAgICAgICAgIFJOIDAKKworOy8vTkVPTiBSZWdpc3RlcnMKKworcVByZWRSb3dCdWYgICAgICAgUU4gUTAuUzE2CitkUHJlZFJvd0J1ZjAgICAgICBETiBEMC5TMTYKK2RQcmVkUm93QnVmMSAgICAgIEROIEQxLlMxNgorCisKKworCitxQ29lZmZUYWIgICAgICAgICBRTiBRMS5TMzIKKworcVByZWRRUCAgICAgICAgICAgUU4gUTIuUzE2CitkUHJlZFFQMCAgICAgICAgICBETiBENC5TMTYKK2RQcmVkUVAxICAgICAgICAgIEROIEQ1LlMxNgorCisKK3F0ZW1wMSAgICAgICAgICAgIFFOIFEzLlMzMgorcXRlbXAgICAgICAgICAgICAgUU4gUTMuUzE2CisKK2R0ZW1wMCAgICAgICAgICAgIEROIEQ2LlMxNgorZHRlbXAxICAgICAgICAgICAgRE4gRDcuUzE2CisKK2R0ZW1wMiAgICAgICAgICAgIEROIEQ4LlMxNgorZHRlbXAzICAgICAgICAgICAgRE4gRDkuUzE2CisKK2R0ZW1wNCAgICAgICAgICAgIEROIEQyLlMxNgorZHRlbXA1ICAgICAgICAgICAgRE4gRDMuUzE2CitkdGVtcDYgICAgICAgICAgICBETiBENC5TMTYKK2R0ZW1wNyAgICAgICAgICAgIEROIEQ1LlMxNgorIAorcXRlbXBQcmVkMSAgICAgICAgUU4gUTUuUzMyCitxdGVtcFByZWQgICAgICAgICBRTiBRNS5TMTYKKworZHRlbXBQcmVkMCAgICAgICAgRE4gRDEwLlMxNgorZHRlbXBQcmVkMSAgICAgICAgRE4gRDExLlMxNgorIAorICAKKworICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjExLGQxMQorCisgICAgICA7Ly8gQXNzaWduaW5nIHBvaW50ZXJzIHRvIElucHV0IGFyZ3VtZW50cyBvbiBTdGFjaworICAgIAorICAgICAgTV9BUkcgICAgICAgICAgIHByZWRRUG9uU3RhY2ssNCAgCisgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAorICAgICAgTV9BUkcgICAgICAgICAgIEFDUHJlZEZsYWdvblN0YWNrLDQKKyAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvblN0YWNrLDQKKyAgICAgIAorICAgICAgOy8vIERDIFByZWRpY3Rpb24KKworICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvblN0YWNrICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmlkZW9Db21wIEZyb20gU3RhY2sgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgTV9MRFIgICAgICAgICAgIHByZWREaXIscHJlZERpcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUHJlZGljdGlvbiBkaXJlY3Rpb24KKyAgICAgIDsvLyBEQyBTY2FsZXIgY2FsY3VsYXRpb24gICAKKyAgICAgIExEUiAgICAgICAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgQUREICAgICAgICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisKKyAgICAgICAKKyAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAorICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAorCisgICAgICA7Ly8gQ2F1bHVjYXRlIHRlbXBQcmVkCisgICAgICAgICAgICAKKyAgICAgIExEUkVRU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB2ZXRpY2FsIGxvYWQgdGhlIGNvZWZmIGZyb20gUm93IFByZWRpY3Rpb24gQnVmZmVyCisgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgCisgICAgICBSU0IgICAgICAgICAgICAgbmVnZGNTY2FsZXIsZGNTY2FsZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmVnZGNTY2FsZXI9LWRjU2NhbGVyICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgUHJlZGljdGlvbiBjb2VmZiB0byB0ZW1wIGZvciBjb21wYXJpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBhYnNvbHV0ZSB2YWwgb2YgcHJlZGljdGlvbiBjb2VmZgorICAgICAgCisgICAgICBBREQgICAgICAgICAgICAgdGVtcCxkY1NjYWxlcixkY1NjYWxlcgorICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3ByZWRDb2VmZlRhYmxlLHRlbXBdICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmFsdWUgZnJvbSBjb2VmZiB0YWJsZSBmb3IgcGVyZm9ybWluZyBkaXZpc2lvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgorICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBwZWQ9cFByZWRCdWZSb3coQ29sKVswXSozMjc2Ny9kY1NjYWxlcgorICAgICAgQUREICAgICAgICAgICAgIHRlbXAzLGRjU2NhbGVyLCMxCisgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdL2RjU2NhbGVyICAgICAgICAgICAgICAgICAgCisgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikgICAgICAgICAgIAorICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdkY1NjYWxlcix0ZW1wUHJlZCxhYnNDb2VmZkRDICAgICAgICAgICAgOy8vIFJlbWFpbmRlciBSZW09YWJzKHBQcmVkQnVmUm93KENvbClbMF0pLXRlbXBQcmVkKmRjU2NhbGVyCisgICAgICAKKyAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAKKyAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIFJlbSx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgUmVtIHdpdGggKGRjU2NhbGVyLzIpCisgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PShkY1NjYWxlci8yKQorICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9LXRlbXBQcmVkIGlmIAorICAgICAgIAorICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCisgICAgICAgCisKKyAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0KKyAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0rdGVtcFByZWQKKyAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBTTVVMQkIgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgQUNQcmVkRmxhZyxBQ1ByZWRGbGFnb25TdGFjaworICAgICAgU1RSSCAgICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLFtwUHJlZEJ1ZkNvbF0gICAgICAKKyAgICAgIAorCisgICAgICAgOy8vIEFDIFByZWRpY3Rpb24KKyAgICAgIAorICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCisgICAgICAKKyAgICAgIENNUCAgICAgICAgICAgICBBQ1ByZWRGbGFnLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgQUMgcHJlZGljdGlvbiBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgIEJORSAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBub3Qgc2V0IEV4aXQKKyAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAweDFmZmZmLygxIHRvIDYzKSAKKyAgICAgIE1PViAgICAgICAgICAgICBDb25zdCwjNAorICAgICAgTVVMICAgICAgICAgICAgIGN1clFQLGN1clFQLENvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPTQqY3VyUVAKKyAgICAgIFZEVVAgICAgICAgICAgICBkUHJlZFFQMCxwcmVkUVAKKyAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMixbcHJlZENvZWZmVGFibGUsY3VyUVBdICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPTB4MWZmZmYvY3VyUVAKKyAgICAgIFZEVVAgICAgICAgICAgICBxQ29lZmZUYWIsdGVtcDIKKyAgICAgIEJORSAgICAgICAgICAgICBIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCBicmFuY2ggdG8gSG9yaXpvbnRhbAorICAgICAgCisgICAgIAorICAgICAgCisgICAgICA7Ly8gVmVydGljYWwKKyAgICAgIDsvL0NhbGN1bGF0aW5nIHRlbXBQcmVkCisKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmUm93XSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmUm93W2ldOmk9MCB0MCA3CisgICAgICAKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMworICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMworICAgICAgCisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCisKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMworICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIAorICAgICAgCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3CisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3CisgICAgICBWTEQxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIHBTcmNEc3RbaV0gOiBpPTAgdG8gNworICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCisgICAgICAKKyAgICAgIDsvL3VwZGF0aW5nIHNvdXJjZSBhbmQgcm93IHByZWRpY3Rpb24gYnVmZmVyIGNvbnRlbnRzICAgICAgCisgICAgICBWQUREICAgICAgICAgICAgcXRlbXAscXRlbXAscXRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9wU3JjRHN0W2ldPXBTcmNEc3RbaV0rcXRlbXBQcmVkW2ldOiBpPTAgdG8gNyAKKyAgICAgIFZRU0hMICAgICAgICAgICBxdGVtcCxxdGVtcCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBMRFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkaW5nIERjIFZhbHVlIG9mIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcgorICAgICAgVlNIUiAgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0CisgICAgICAKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCB2YWx1ZXMgCisgICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICA7Ly9zdG9yaW5nIGJhY2sgdGhlIHVwZGF0ZWQgcm93IHByZWRpY3Rpb24gdmFsdWVzICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgU1RSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JpbmcgdGhlIHVwZGF0ZWQgREMgUm93IFByZWRpY3Rpb24gY29lZmYKKyAgICAgIAorICAgICAgQiAgICAgICAgICAgICAgIEV4aXQKKworSG9yaXpvbnRhbAorCisgICAgICA7Ly8gQ2FsY3VsYXRpbmcgVGVtcHByZWQKKworICAgICAgICAgICAgCisKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZFByZWRSb3dCdWYwLGRQcmVkUm93QnVmMX0sW3BQcmVkQnVmQ29sXSAgICAgIDsvLyBMb2FkaW5nIHBQcmVkQnVmQ29sW2ldOmk9MCB0MCA3CisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMCxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXTogaT0wIHQwIDMKKyAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT0wIHQwIDMKKyAgICAgIAorICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjEsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0gOiBpPTQgdDAgNyAgICAgIAorCisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApIDogaT0wIHQwIDMKKyAgICAgIFZTSFJOICAgICAgICAgICBkUHJlZFFQMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCisgICAgICAKKyAgICAgIAorICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTQgdDAgNworICAgICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcHBQcmVkQ29sQnVmLHBQcmVkQnVmQ29sCisgICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0vY3VyUVApICA6IGk9NCB0MCA3CisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gTG9hZGluZyBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIFZTSFJOICAgICAgICAgICBkdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCisgICAgICBWTU9WICAgICAgICAgICAgZHRlbXBQcmVkMCxkUHJlZFFQMQorICAgICAgCisgICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGFuZCBjb2x1bW4gcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgIAorICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHBTcmNEc3QsIzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0gICAgICAgICAgOy8vIExvYWRpbmcgbmV4dCAxNiBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAorICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZGluZyB0ZW1wUHJlZCB0byBjb2VmZnMKKyAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdISAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGluZyBQcmlkaWN0aW9uIGNvbHVtbiBidWZmZXIKKyAgICAgIFZaSVAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkZWludGVybGVhdmluZworICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFtwU3JjRHN0XSAgICAgICAgOy8vIFVwZGF0aW5nIHNvdXJjZSBjb2VmZnMgICAgICAgICAKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdIQorICAgICAgCisgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsdGVtcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3RlbXAyXSEgICAgICAgICA7Ly8gTG9hZGluZyAgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0CisgICAgICAKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCisgICAgICBWVVpQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW50ZXJsZWF2aW5nIGJ5IDgKKyAgICAgIFZBREQgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLGR0ZW1wUHJlZDEKKyAgICAgIFZRU0hMICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgVlNIUiAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwfSxbcFByZWRCdWZDb2xdIQorICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDFdCisgICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3RlbXBwUHJlZENvbEJ1Zl0gCisgICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXQorICAgICAgCitFeGl0CisKKyAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XQorICAgICAgICAgIAorIAorICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKKyAKKyAgICAgIE1fRU5ECisgICAgICBFTkRJRgorCisKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDBhZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCkBAIC0wLDAgKzEsMTYyIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKKyAgICAgCisKKzsvL0xvY2FsIFZhcmlhYmxlcworQ291bnQgICAgICAgICAgICAgIFJOIDMKK2RvdWJsZVFQICAgICAgICAgICBSTiA0CitSZXR1cm4gICAgICAgICAgICAgUk4gMAorOy8vIE5lb24gcmVnaXN0ZXJzCisKKworZFFQMTAgICAgICAgICAgICAgIEROIEQwLlMzMlswXQorcVFQMSAgICAgICAgICAgICAgIFFOIFEwLlMzMgorCitkUVAxICAgICAgICAgICAgICAgRE4gRDAuUzE2CitkTWludXNRUDEgICAgICAgICAgRE4gRDEuUzE2CisKK2RDb2VmZjAgICAgICAgICAgICBETiBEMi5TMTYKK2RDb2VmZjEgICAgICAgICAgICBETiBEMy5TMTYgICAKKworcVJlc3VsdDAgICAgICAgICAgIFFOIFEzLlMzMgorZFJlc3VsdDAgICAgICAgICAgIEROIEQ3LlMxNgorcVNpZ24wICAgICAgICAgICAgIFFOIFEzLlMzMgorZFNpZ24wICAgICAgICAgICAgIEROIEQ2LlMxNgorCitxUmVzdWx0MSAgICAgICAgICAgUU4gUTQuUzMyCitkUmVzdWx0MSAgICAgICAgICAgRE4gRDguUzE2CitxU2lnbjEgICAgICAgICAgICAgUU4gUTQuUzMyCitkU2lnbjEgICAgICAgICAgICAgRE4gRDguUzE2CisKK2QyUVAwICAgICAgICAgICAgICBETiBEMTAuUzMyWzBdCitxMlFQMCAgICAgICAgICAgICAgUU4gUTUuUzMyCitkMlFQICAgICAgICAgICAgICAgRE4gRDEwLlMxNgorCitkWmVybzAgICAgICAgICAgICAgRE4gRDExLlMxNgorZFplcm8xICAgICAgICAgICAgIEROIEQxMi5TMTYKK2RDb25zdDAgICAgICAgICAgICBETiBEMTMuUzE2CisKKyAgICAKKyAgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI0LGQxMworICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBBREQgICAgICBkb3VibGVRUCxRUCxRUCAgICAgICAgICAgICAgICAgICA7Ly8gZG91YmxlUVA9IDIqUVAKKyAgICAgICAgIFZNT1YgICAgIGQyUVAwLGRvdWJsZVFQCisgICAgICAgICBWRFVQICAgICBxMlFQMCxkMlFQMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTW92ZSBkb3VibGVRUCBpbiB0byBhIHNjYWxhcgorICAgICAgICAgVFNUICAgICAgUVAsIzEgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZCBmaXJzdCA4IHZhbHVlcyB0byBDb2VmZjAsQ29lZmYxCisgICAgICAgICBTVUJFUSAgICBRUCxRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZNT1YgICAgIGRRUDEwLFFQICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBRUCBpcyBldmVuIHRoZW4gUVAxPVFQLTEgZWxzZSBRUDE9UVAgICAgIAorICAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgICBWRFVQICAgICBxUVAxLGRRUDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRlIHRlbXBSZXN1bHQgd2l0aCBRUDEKKyAgICAgICAgIFZTSFJOICAgIGQyUVAscTJRUDAsIzAKKyAgICAgICAgIFZFT1IgICAgIGRDb25zdDAsZENvbnN0MCxkQ29uc3QwCisgICAgICAgICBWU0hSTiAgICBkUVAxLHFRUDEsIzAgICAgICAgICAgICAgICAgICAgICA7Ly8gUVAxIHRydW5jYXRlZCB0byAxNiBiaXRzCisgICAgICAgICBWU1VCICAgICBkTWludXNRUDEsZENvbnN0MCxkUVAxICAgICAgICAgICA7Ly8gZE1pbnVzUVAxPS1RUDEKKworTG9vcCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vUGVyZm9ybWluZyBJbnZlcnNlIFF1YW50aXphdGlvbgorICAgICAgICAgCisgICAgICAgICBWQ0xUICAgICBkU2lnbjAsZENvZWZmMCwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgMAorICAgICAgICAgVkNMVCAgICAgZFNpZ24xLGRDb2VmZjEsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IDAKKyAgICAgICAgIFZDRVEgICAgIGRaZXJvMCxkQ29lZmYwLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCB6ZXJvCisgICAgICAgICBWQlNMICAgICBkU2lnbjAsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24wID0gLVFQMSBpZiBDb2VmZjA8IDAgZWxzZSBRUDEKKyAgICAgICAgIFZDRVEgICAgIGRaZXJvMSxkQ29lZmYxLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCB6ZXJvCisgICAgICAgICBWQlNMICAgICBkU2lnbjEsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24xID0gLVFQMSBpZiBDb2VmZjE8IDAgZWxzZSBRUDEKKyAgICAgICAgIFZNT1ZMICAgIHFTaWduMCxkU2lnbjAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIGV4dGVuZCBxU2lnbjAgdG8gMzIgYml0cworICAgICAgICAgVk1PVkwgICAgcVNpZ24xLGRTaWduMQorICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDAsZENvZWZmMCxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldK3FDb2VmZjBbaV0qKC0yKSBpZiBDb2VmZiA8MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAorICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDEsZENvZWZmMSxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldK3FDb2VmZjFbaV0qKC0yKSBpZiBDb2VmZiA8MCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAorICAgICAgICAgOy8vIENsaXAgUmVzdWx0IHRvIFstMjA0OCwyMDQ3XSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBWUVNITCAgICBxUmVzdWx0MCxxUmVzdWx0MCwjMjAgICAgICAgICAgICA7Ly8gY2xpcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQxLHFSZXN1bHQxLCMyMAorICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQwLHFSZXN1bHQwLCM0ICAKKyAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQxLHFSZXN1bHQxLCM0CisgICAgICAgICBWU0hSTiAgICBkUmVzdWx0MCxxUmVzdWx0MCwjMTYgICAgICAgICAgICA7Ly8gTmFycm93IHRoZSBjbGlwcGVkIFZhbHVlIHRvIEhhbGZ3b3JkCisgICAgICAgICBWU0hSTiAgICBkUmVzdWx0MSxxUmVzdWx0MSwjMTYgCisgICAgICAgICBWQklUICAgICBkUmVzdWx0MCxkQ29uc3QwLGRaZXJvMCAgCisgICAgICAgICBWQklUICAgICBkUmVzdWx0MSxkQ29uc3QwLGRaZXJvMSAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZTVDEgICAgIHtkUmVzdWx0MCxkUmVzdWx0MX0sW3BTcmNEc3RdISAgIDsvLyBTdG9yZSB0aGUgcmVzdWx0CisgICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjOAorICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgQkdUICAgICAgTG9vcAorCisgICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKworCisgICAgICAgICBNX0VORAorICAgICAgICAgRU5ESUYKKyAgICAgICAgIAorCisgICAgICAgIEVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAwNTkxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpAQCAtMCwwICsxLDIxMCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKyAKKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgIAorICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgCisgICAKKyAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCit2aWRlb0NvbXAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKKyAgICAgCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitkY1NjYWxlciAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgIFJOIDE0CitpbmRleCAgICAgICAgICAgICAgUk4gNQorCisKK0NvdW50ICAgICAgICAgICAgICBSTiA1Citkb3VibGVRUCAgICAgICAgICAgUk4gNAorUmV0dXJuICAgICAgICAgICAgIFJOIDAKKworCis7Ly8gTmVvbiByZWdpc3RlcnMKKworCitkUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCitxUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCisKK2RRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKK2RNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKKworZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgorZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAorCitxUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCitkUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2CitxU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCitkU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2CisKK3FSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKK2RSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKK3FTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKK2RTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKKworZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KK3EyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKK2QyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2CisKK2RaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2CitkWmVybzEgICAgICAgICAgICAgRE4gRDQuUzE2CitkQ29uc3QwICAgICAgICAgICAgRE4gRDUuUzE2CisKKworCisKKyAgICAgCisgICAgIAorICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjUsZDExCisKKworICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgREMgY29lZmZpY2llbnQKKworICAgICAgICBURVEgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgIDsvLyBUZXN0IGlmIHNob3J0IFZpZGVvIEhlYWRlciBmbGFnID0wICAgICAgICAgICAgIAorICAgICAgICBNT1ZORSAgICAgZGNTY2FsZXIsIzggICAgICAgICAgICAgIDsvLyBpZiBzaG9ydFZpZGVvSGVhZGVyIGlzIG5vbiB6ZXJvIGRjU2NhbGVyPTgKKyAgICAgICAgQk5FICAgICAgIGNhbERDVmFsCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorCisgICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAorCitjYWxEQ1ZhbAorCisgICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCisgICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQorICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cworICAgICAgCisKKworICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgQWMgQ29lZmZpY2llbnRzCisgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAorICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKKyAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCisgICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKKyAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCisgICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQorICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAorICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKKyAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKKyAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQorCitMb29wICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCisgICAgICAgICAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCisgICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAorICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQorICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQorICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCisgICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4CisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBCR1QgICAgICBMb29wCisgICAgICAgICAKKyAgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4CisgICAgICAgICAKKyAgICAgICAgIDsvLyBTdG9yZSB0aGUgSW52ZXJzZSBxdWFudGl6ZWQgRGMgY29lZmZpY2llbnQKKyAgICAgICAgIAorICAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKKyAgICAgICAgCisgICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgIAorCisKKyAgICAgICAgIE1fRU5ECisgICAgICAgICBFTkRJRgorICAgICAgICAgCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQ5MzY4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWYzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApAQCAtMCwwICsxLDYzIEBACitUaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcworb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgorCitJdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgorCitUaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAoraXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCisKK0lmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAorcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDEyPi4KKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCistIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxCisgIFZpZGVvIGNvZGVjcyAtIHNhbXBsZSBjb2RlCisgIFNhbXBsZSBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQorICBpbnRlcm5hbCBhY2Nlc3MKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgorYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KKworQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKK211c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQorc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCitjb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KK0J1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAordGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5CithbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCit0aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQorYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKK3JlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCitndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAorZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KK0J5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCit0byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKK2RlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCit3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCit3aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCittYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgorCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCit0d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgorCitUaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTIuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKK25vdGUuCisKK1RoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDEyLlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKK2ZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgorCitUaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KKworVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCisibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKKworICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDFiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKQEAgLTAsMCArMSwxNDAgQEAKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitlODhlYzg0ZTEyMjUzNDA5MmI5MGM2Nzg0MTU0OWQ2ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAorOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCithMDY5ODNhYmIzOWM0NzZiMDgxZTg3ZWEyNzEzNjFhNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKK2MwMWY4YjkzYWI3M2Q4YzAwZGRmMjQ5OWYwMWRhNWZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KKzI2ZTJmZjNmNjMzNzY0ZWI3MjBkZWIzNDA5NzhkYzJkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworNzlhYTIzZDk4MTdlZmQxMWQwYzRjMmJlMzZlYzFlNWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlNDUyOTc3MDRkNzIzMDJkNGE5NDdkMDc5OGM2NjZmYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworMjA1ZGZhZmUxZmU3YmIxNjBiZjM2ZDI2MDBlMTEwMGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworYmY5MjY0MWU4NTQ4NTc3Yjc3ZTA0ZTAzZWMwNGMzNTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCitmNWVlNmY3YmU4MjJkODc0NzFjZWYzYjE4MDFkYmZjMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworMjgxMTBiM2ExM2NlY2Y0ZjIxNmQxMGJjYzc2MWM0MDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCis5YTFhMjUyNDVjOTc1ZDY0MWUxYzYzNzg4MzRhZWE0ZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworM2E2NDNlYWFhZWIxMmU4ZDI3NGRjNTlhNzM1N2E1ODYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCis0YzRkZTU5NzNhNmI3NDI1MGNlOTFhYzBiMzE3YTYxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworNGVjZGJlOTE5M2FhYmExZjliYjBlMjRjOTM4YjM0ZjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKKzY2ZTkxMmY4Yzg4ZjYwMTljYmEzZWRlMjcxNTBhNDA3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworMjY2ZGE0MmY0ZTMwMTVlNjdiMmNiYjU4MTY5ZDQzN2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCitkOTA1MjQ3ZWVhYTUyZDRlMmNmNWY2YmMzZjYxYjM0OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKzViMjk0NDhkYjA0OTVjZDE3MTdhNGI5MjVmMTMzNzdjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYworZjY0NTFkZjI3ZjZkY2M5OTAzNmI0YjEyNTNjMjNiYjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKzg5Mjc4N2Q4NTBlZWYwOWRjMjE0OGQ0NWI0MTZiMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCiszM2RhMWMwMWEzMWY0N2MwZjNhZWE5YTdhNWVhYTliZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKK2U5ZmIxMWIwNjY3NzUyODNkY2ZlYWU4ZDEyYTZjOTdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCithZGQ5N2JlYzA4ZTVlMWE1MzhhYTg2MDcxNjhlNjFiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCitiNjk1ZWNmYzkxN2IzOTQ3MGQxZjQwNzczYjkyMzk3MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworNTFiYzU5NmZkMmZmNjFhZDU0NTBkNzEzODQ2MWY0YTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCitkYzZiYWEwYTM4OGRjNWVhOGZmNjVjMjRiMTc5ZTY3MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCithNTQ5OTkwMjk5NjU3NmY2NzEyODQ5ZGIzNGQ1YWQ2NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKzBjM2I3Njc0NWQ1M2U3NGE4ZTY0ZTgwZGVmMzFmYWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKzRmMjc0MmJhNWEzYzIyMDhmNTNiYzBmNmE0NDNiZTE0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKK2I0YWUyZGM5NDhlOGNhNjQ4MzFmZTNiYmZiZDg5NTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCitlMTUxMThjYmUzNzJkYjdjYWRiYTIyNWM5NDU2ZjE4OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCis2MjNjZjMzNmNmY2U3ZDAxNzRmNGU1NDA3MjQ1NmYzMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworODllNDUyYzgwZTMwMzU3Y2FkZmIwNGMwNWI2ZmUwMGMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzNhNTU1MWNjNTRlODViYmUzNGZjOTY2YzdkYzAwZjFjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworMTE0MDMwZmEwZDhmMDBhZjZkMzI4OWY0N2E1ZTg1YmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKzllMzczYWIyOTZmYjg1YmI0NTU2NWE2YzM4NGY2ZWQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKzJkMjAwZjdjYzIzMGYzMDJkYTQ4YzU4OWRhNDJjMDJmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCitlYTNmMWQxZDE1MDdiNTU2MTBiMTM0OWM3YjU5NDZlOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworYmQyYmYxNzQzYWVmMmE5Mzk2NTQ1ZWQwMjUzNjJiZTIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworY2E2OGU4MDk1NjdiZjg5MDQ0NjMxYjY3ZDIyOGM3Y2UgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCis3N2NhZjJiNWNiZWU5NmQzNjBhOTE5ZjI3ZTFmMTRmNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworMjYwODFlMzg0ZWM2MjdmZWRhZDQ3NGEwZTdkYWQ4NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworMWM4M2FlOTIwN2E1NDk0NDkzNmY0YTYzYzY2NWJkOTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCis0YzM2ZTA0ZGIyMDIwMGY0ZWM3MmU1YWJhNTc0NDZmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworZjc1YjdjNWE4MGQ4YmYzM2UzMTUzODBlNGVmMGFiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKzQ4ODkyNWJiN2FlZWFlMGNjZjkzZWM0NGFmOWZjZTM1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCitjOTFhNTM0NWI1Zjg3N2IzODMxZWQxYWJjYzYwZDU3OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKKzM1NTE1YTExNWEzMmZjYWM4NDc5MDcyYTlhNWIwZGI5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKK2ZkY2Y0NjIyYmM1ZjBhZTc1YmRiMGE1MWRjZDAzMzk3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworNzRjOTI3ODE3NzQwMGExZjdjYzZkNzk5YThjOGFiMzQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCis1NmFhMmQ1MDZkMGNmZGI0ZWJkMzY2YzA3YWRiMmQ4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKzM2YjIxNjVmZDRkMmE3ZjNmM2UxZjhkYWZmNGY5NGU1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCis0YjZiMWI5MzNmYzdiYzhmMTRhMTg0YzAyYzAyODA4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworY2YwZmYwOTNhOWIzNzJkZDMyNzFlM2U1YzI4OTg0ZDQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCis5Y2NhZDlmODk0ZmJkMzIxOTRmNWI1M2RhMjE3MDcyYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCis0OTQzYTdhMmRmN2U5ZDcwMDY3NWY4YzFkZWJmNGQ5MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKzI5ZTRhN2YzOGY4YzJlODI0NmVkNzU2ZGIwM2MwMTJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisyN2JjNjRlN2MxOGRhMGFhYjljOTg3YTM4OGY2MTYwOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCis4NTkxODU2MTRiYjlkMDAxMzg2MWU0NTRkN2I5MThmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLworNjNlM2I2NGI5NmNjNDJhMjM1YzA0ZjNhMGY5OTEzMTYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KKzBhYWU0ZjY4M2Q4OTAzY2JhOTk1NmQzMzAxZWQ5ZmZlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworOGQ2YzFiNDQ5MTUzMjkxNjVkZjY0MzA4MWNjMTFhOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworMDQzNWVjYTkzMGVhY2RhMGYyYTU5ZTg0M2Q0MDVlZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworOWE4MmRkMGIxZjA1Zjc5ODU2NzQzNmEwMDlkMDI5NjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKK2UxZTI0NjQ2YzRiZDAzZjVkZjc4Mjk1NDUyZGQ0ZWIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCis3NDZlNmIzMzRlNGEyNmQ0YTliZmFlNmQ3MzU4MjZmNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCis4YjFkODdiNzRkODBmZjEzYTE2MjE1YjYxZDVlNTJiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYworMzA5MzU4ZDM1N2JhYWZjMzhkMmIzN2JmMWU5NzY4YTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYworY2M3N2M3MjQyYjUzYzE1M2Y4ZDA5NTI3NTgzZjI3NzEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKKzdjZDhlNzc5NjAxN2UzZGQwMGI0OTRkMzRmNjI5ZjNmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKK2E0OTA1Y2I1ZjhkNGIyNDQ0NTRlZTRmNjBkMTgzNThiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCis1NTk2YjMxZTQzMzIyMmMxZTQ4NjBkZWViZmE5OGVmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCiszNjVkMDcyYmU2ZWFiMjAxZjZlMDQwMDU4YTNiYWNmYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCis3OGVkMjIxMjU4NWIwY2NhNzU5MTNhNDczYjJlYzQzMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKzUwYjJkOGRhOGYyMGY2YjFkMzliOGQzZGYzOGFmNTVkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworNGE4NTFhMmFkNmQzNTdjZGMyMzNkOWMwYmY0NzVlMDIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworMGQ2ZDYzODc4ZjI4MjdlMDBlNWY4NWIxZThlMjYwMTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKzQ4Yjg2NWE5ODNmZTViZjMwNzVlZGRmNjUyOTUwNzIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKzVmNDhmYTc5NDE4MzVjNDZhYzc2N2U2M2ZjMjk0MDNiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworYmJhZjQ1NGI2NGIzMmIyYzQyYTc2YTdlYzM5M2Q5NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYworZWViZmY3NzJmODdhNDE0NDM2YzVjNTI4NmYyY2QyMTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYworNjVhZTI0MmViOGNiNmQxMDI3Njc3YzhlZjhmNzdjYTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKzEyNTY0MmIxZWEwYzEyNTZkNzlhZjFlMGRkZWNhZTkzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKK2NlMjRiYTNkODNkYTRjYjc5MTQ4NWQzMTI4MjY4YmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYworMDliYzA5YTJlNmZkOTYyZTcxOTk0NDU4MmUzOGE4ZmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworNmIwZWU3YTExNjQ3MWE0ZGFkYmU1YmM4ZGJmNDI1YjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKzIxMzIyZGNhMDI3YzI4MzUzZTNlN2ViOGYzNjIwMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKK2VmMzUzZDgzMjQ0Mjg4ZDhjMzdlMGY3MDI0OTE3N2NjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCis1NDFkZTgyNGY4YWViZTRhNWNhYzZmMTVkYTk0M2VmYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworMGI0MGIxNTRiNTkxYzdmODg0MmNmZmU0MDQyZDE3YzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworMmZmY2VjODhkM2ZjYjM3MjU0M2E4ZjQ1MDhlYTFhYzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworZTA2ZDg1Y2EwMDBhZmNiYjUwNTgwZjk4ZjAyMDNhYzggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCithZTgyYjZmY2ZjZjczMWE2MWQ3MGUxYWE0MmU2Mjc3YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisxZDA0Mzk1ZTIzMWI1OTc1NjIyNTdlOThjZGE2Y2ZiMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCis3MmMwYTM2MzI3YjZiOWI0MzZkM2JjZTdjODk2YzUyMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKzFiNjVhYTdmMzExMTI0ZWE2ZmI0N2UzODRlYzA2YTUwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKzcxNDk1NzEwNGE2ZWY3MTM0MWZiZTZhOWVjNjVjMTM2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCis4NjQ5M2YwZWU4NTNmNjUzMzU0YTczODlmMTcyN2Y3MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKzVkZThhZmNmYjMwNTI5Njg3OTQ3ODJhN2MzYTBiNDFhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKzUwYmNjMjI4Y2M2NjBkYmRhMDM3NzI1MzA5ZGUzZjhiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKzRmNWNmYTFlY2M2Njg5MTNkZGU5NGUzY2FmOTdhMmUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKK2MyZWM4MDRkZGY2NGVlODQxMTQ2ZTM5YzNhNzgzNDUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKzQwODdmNmE4Mjc5MTJlZTViNDVlZDQyMTdmMWE2ZDc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLworNWM3MTE3MDJkZGRjZWM4NTI5ODAwMzg2MGQ3NjBjZWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorMWI5MmM5NGI3ODVjMDNlYzc2ZDRmYWUyZjJiYmRiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKK2FkOWM2OTg2ZDJhMzIwMGRkNWUxZjYxMDNhNTRhOTliICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KK2U2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCis3Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKKzEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLworM2E2ZGYwMDg1NzM2Y2JjYmUyZTNmNDVkMDhhZjQyMjEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKKzBiZjNjYjUyODYzYzgyOWIyOGMwMzUyODM1MTcwMjExICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCis1MzhiNjJmNTEwYjVhOGJkY2VkNGEzOWZhMTJkOWEyMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworNjY5OTNlZGQ5ZDQ0MWJmM2I1YjZjOTEyZjY0MDBiNmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKzhlNTI2YTkwMDdlYjBkNDNlYmYzNjJjNDk4YjM3NDE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCis4N2Y4ZjI2ZTZlOTE3OGRmMGFiNzQxOTMzNGQ1YTNkYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYworMWE4NTc3NjQ2MTMyYWQ5YjYzYTE0NzdmZGFlYzI0NjQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCis0ODUyOWM0ZjcwYzdlOTU0ZTgzMmVlY2UxYWVlNTdiZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisyNTI5Nzc3NjRkNGYzODI4MmI2YTU2YzU5Y2NmNGYwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCitjYzc4Y2ZhZWQ5NTAyYzJlMDI4MmM5MWZiOTVlZWFjNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYworZTQ2ODc1MWMxNWE1ODFlYmQyMmRhMDMxZTIyMTE3ZDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworM2Y0NDhkMTkxZWFlYjgyZWNiN2UyN2VmOGJhMjc4NzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworYjEyOTFjMzA3ODA4NjMxZmE4MzM2ODRhYmI5YzM0Y2UgIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCkBAIC0wLDAgKzEsNzg1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaApAQCAtMCwwICsxLDQzIEBACisvKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLworI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCisjZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgorCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KKyNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCisjZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKKworLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KKyNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKKworCisvKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLworI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOworI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCisKKworLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCisvKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLworCisvKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLworI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCisKKy8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQU5TSSBDIgorCisvKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKKworCisjZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjlmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaApAQCAtMCwwICsxLDI3NCBAQAorLyogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCisgKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCisgKgorICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCisgKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQorICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3CisgKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCisgKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucworICogICBhdCBydW50aW1lLgorICoKKyAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4CisgKiAKKyAqLworCisgIAorI2lmbmRlZiBfYXJtT01YX0hfCisjZGVmaW5lIF9hcm1PTVhfSF8KKworCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCisjZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgorI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQorCisvKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLworI2RlZmluZSBCQVJFX1NVRkZJWCAKKworCisKKy8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCisjZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAorI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAorCisKKworCisvKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKworCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKKworI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorCisjZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKKworI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKworCisjZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qKgorICogRmlsZTogb214dHlwZXMuaAorICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisgIAorI2lmbmRlZiBfT01YVFlQRVNfSF8KKyNkZWZpbmUgX09NWFRZUEVTX0hfCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gCisKKyNkZWZpbmUgT01YX0lOCisjZGVmaW5lIE9NWF9PVVQKKyNkZWZpbmUgT01YX0lOT1VUCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICAKKyAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLworICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCisgICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCisgICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCisgICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLworICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KKyAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKKyAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKKwlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCisKKyAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KKyAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCisKKyAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKKworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCisKKyAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KKworICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KKyAgICAKKyB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCisKKyAKKy8qIE9NWF9VOCAqLworI2lmIFVDSEFSX01BWCA9PSAweGZmCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OworI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTggdW5kZWZpbmVkCisjZW5kaWYgCisKKyAKKy8qIE9NWF9TOCAqLworI2lmIFNDSEFSX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7CisjZWxpZiBTSFJUX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCisjZWxzZQorI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKKyNlbmRpZgorIAorIAorLyogT01YX1UxNiAqLworI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7CisjZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MxNiAqLworI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OworI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTMyICovCisjaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzMyICovCisjaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKKyAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKKyNlbHNlCisgICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCisjZW5kaWYKKworCisvKiBPTVhfU0M4ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MxNiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzMyICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDNjQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfRjMyICovCit0eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0Y2NCAqLwordHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfSU5UICovCit0eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCisKKworI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQorI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKKyNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKKyNkZWZpbmUgT01YX01JTl9VMTYJCQkwCisjZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAorCisjZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQorI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKKyNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCisjZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKKyNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKKyNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKKwordHlwZWRlZiB2b2lkIE9NWFZvaWQ7CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKKyAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgorICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCisgICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLworCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KK31PTVhSZWN0OworCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLworIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLworCQorfSBPTVhQb2ludDsKKworCisvKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLworIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLworCQorfSBPTVhTaXplOworCisjZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMGI0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApAQCAtMCwwICsxLDExMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIAorIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAorIyBPcGVuTUFYIERMOiB2MS4wLjIKKyMgUmV2aXNpb246ICAgOTY0MQorIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorIyAKKyMgKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIAorIyAKKyMKKyMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgorIworCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBzdHJpY3Q7CisKK215ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7CisKKyRDQyAgICAgICA9ICdhcm1jYyc7CiskQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JIC1jJzsKKyRBUyAgICAgICA9ICdhcm1hc20nOworJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk03VERNSSc7CisjICRMSUIgICAgICA9ICdhcm1saW5rJzsKKyMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7CisjICRMSUJfVFlQRSA9ICcubyc7CiskTElCICAgICAgPSAnYXJtYXInOworJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKKyRMSUJfVFlQRSA9ICcuYSc7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KK0BoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KK29wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOworQGZpbGVsaXN0ID0gPEZJTEVTPjsKK2Nsb3NlKEZJTEVTKTsKKworIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCitmb3JlYWNoICRoIChAaGVhZGVybGlzdCkKK3sKKyAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOworfQorCisjIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7CisKKyMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKK21rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKK21rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKKworJG9iamxpc3QgPSAnJzsKKworIyBDb21waWxlIGVhY2ggZmlsZQorZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQoreworCW15ICRmOworCW15ICRiYXNlOworCW15ICRleHQ7CisJbXkgJG9iamZpbGU7CisKKwljaG9tcCgkZmlsZSk7CisJJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOworCisJKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKKwlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKKwl7CisJCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7CisKKwkJaWYoJGV4dCBlcSAnYycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzaWYoJGV4dCBlcSAncycpCisJCXsKKwkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOworCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKKwkJCXByaW50ICIkY29tbWFuZFxuIjsKKwkJCXN5c3RlbSgkY29tbWFuZCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7CisJfQorfQorCisjIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgorJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7CiskY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OworcHJpbnQgIiRjb21tYW5kXG4iOworKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjM0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dApAQCAtMCwwICsxLDEyMyBAQAorLi9hcGkvYXJtQ09NTS5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKy4vYXBpL29teHR5cGVzLmgKKy4vc3JjL2FybUNPTU0uYworLi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworLi92Yy9hcGkvYXJtVkMuaAorLi92Yy9hcGkvb214VkMuaAorLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCisuL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYworLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisuL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYwpAQCAtMCwwICsxLDkzNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0CisgKgorICovCisKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKworT01YX0lOVCBhcm1TaWduQ2hlY2sgKAorICAgIE9NWF9TMTYgdmFyCispCisKK3sKKyAgICBPTVhfSU5UIFNpZ247CisgICAgCisgICAgaWYgKHZhciA8IDApCisgICAgeworICAgICAgICBTaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCB2YXIgPiAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNpZ24gPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gU2lnbjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgT01YX0lOVCBtaW4sCisgICAgT01YX0lOVCBtYXgsIAorICAgIE9NWF9TMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICBPTVhfRjMyIG1pbiwKKyAgICBPTVhfRjMyIG1heCwgCisgICAgT01YX0YzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAoreworICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7CisgICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7CisgICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOworICAgIE9NWF9VMzIgdkludDsKKyAgICBPTVhfVTMyIHZJbnRTYXQ7CisgICAgCisgICAgaWYodiA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKKyAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7CisgICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOworICAgIHZJbnRTYXQgPSB2SW50OworICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKKyAgICAgICAgdkludFNhdCA9IG1heFY7CisgICAgcmV0dXJuIHZJbnRTYXQ7Cit9CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbSgKKyAgICAgICAgT01YX1U4ICpwQnVmMSwKKyAgICAgICAgT01YX1U4ICpwQnVmMiwKKyAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQorICAgICAgICkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgT01YX1U4IHRlbXA7CisgICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCisgICAgeworICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOworICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7CisgICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKykKK3sKKyAgICBPTVhfUzMyIGEsIGIsIGM7CisgICAgCisgICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOworICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOworICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAorICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKykKK3sKKyAgICBPTVhfVTggaTsgICAgCisgICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKKyAgICB7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQoreworICAgIE9NWF9TNjQgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCisgICAgeworICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7CisgICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7CisKKyAgICByZXR1cm4gUmVzdWx0OyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQoreworICAgIAorICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCisKKyAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOworICAgIH0KKyAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOworICAgIH0KKworICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7CisgICAgCisgICAgcmV0dXJuIG1hYzsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKK3sKKyAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOworCisgICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7CisgICAgfQorCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKiAgICAgCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMixsbzE7CisgICAgT01YX1UxNiBsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKyAgICAKKyAgICBsbzEgID0gaW5wdXQxOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKKyAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkxLGhpMjsKKyAgICBPTVhfVTE2IGxvMSxsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKKyAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gICBoaTEgKiBoaTI7CisgICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7CisgICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCit7CisgICAgT01YX0Y2NCByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOworICAgIAorICAgIGlmIChyZXN1bHQgPj0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAwLjU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCAtPSAwLjU7CisgICAgfQorCisgICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOworfQorCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY5MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpAQCAtMCwwICsxLDMyOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIAorICAgIGlmKE4gPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQoreworICAgIGlmKCpwT2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICAgICpwcEJpdFN0cmVhbSArPSAxOworICAgICAgICAqcE9mZnNldCA9IDA7CisgICAgfSAgICAKK30KKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQoreworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICpwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKyNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKQoreyAgICAKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIE9NWF9JTlQgSW5kZXg7CisgICAgICAgIAorICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCisgICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOworICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOworICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEluZGV4OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcENvZGVCb29rKys7CisgICAgfQorCisgICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLworICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKQoreworICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgICAgICAKKyAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7CisgICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7CisKKyAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KKyAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKKyAgICB7CisgICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOworICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7CisgICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKKyAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCisgICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKKyAgICAKKyAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKQoreworICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCkBAIC0wLDAgKzEsMTE1MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybVZpZGVvLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgorICoKKyAqLworCisKKyNpZm5kZWYgX2FybVZpZGVvX0hfCisjZGVmaW5lIF9hcm1WaWRlb19IXworCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RydWN0IG00cDJfTUVTcGVjCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOworfTsKKworc3RydWN0IG00cDEwX01FU3BlYworeworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Cit0eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECisgKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0CisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECisgKi8KKworT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKKyAgICBPTVhfUzE2IG12WCwKKyAgICBPTVhfUzE2IG12WSwKKyAgICBPTVhfSU5UIGNhbmRTQUQsCisgICAgT01YX1MxNiBiZXN0TVZYLAorICAgIE9NWF9TMTYgYmVzdE1WWSwKKyAgICBPTVhfSU5UIGJlc3RTQUQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KKyAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKyAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KKyAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCisgKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKKyAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaworICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKKyAgICAgT01YX0lOVCBjdXJRUCwKKyAgICAgT01YX0lOVCBwcmVkUVAsCisgICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAorICAgICBPTVhfVTggIHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIGluZGV4LAorICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispOworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKKyAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAorICAgICBPTVhfVTggKiBwVHJhbnNwCispOworCisvKiAKKyAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKKyAqLworLyogRGVmaW5lcyAqLworI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKKworCisvKiBEZXF1YW50IHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKK2V4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCisgKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgorICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCisgKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYworICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAorICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQorICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAorICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCisgKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKKyAqIAorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCisgICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCisgICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCisgICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCisgICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KKyAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLworICAgIGludCBDaHJvbWFGbGFnCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAorCQlPTVhfVTMyIAlpU3JjU3RlcCwgCisJCU9NWF9VOCogCXBEc3QsIAorCQlPTVhfVTMyIAlpRHN0U3RlcCwgCisJCU9NWF9VMzIgCWlXaWR0aCwgCisJCU9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQorCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKKwkgT01YX1UzMiAJaVNyY1N0ZXAsIAorIAkgT01YX1U4KiAJcERzdCwKKyAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKKyAJIE9NWF9VMzIgCWlXaWR0aCwgCisgCSBPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKKyAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCisgKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgorICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKKyAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCisgKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKKyAgICAgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYgKnBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9TMTYqIHBEQywKKyAgICAgaW50IEFDCispOworCisjZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCkBAIC0wLDAgKzEsNDM4MSBAQAorLyoqCisgKiBGaWxlOiBvbXhWQy5oCisgKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09NWFZDX0hfCisjZGVmaW5lIF9PTVhWQ19IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCisvKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MxNiBkeDsKKyAgICBPTVhfUzE2IGR5OworfSBPTVhWQ01vdGlvblZlY3RvcjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCisgKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAorICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAorICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCisgKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKKyAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKKyAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKKyAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAorICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCisgKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAorICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAorICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAorICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAorICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAorICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKKyAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCisgKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCisgICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKKyAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKKyAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAorICAgIE9NWF9VMzIgaVBsYW5lU3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCisgKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKKyAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKKyAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKKyAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKKyAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCisgKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCisgKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKKyAqICAgICAgICAgICAgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAorICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCisgKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKKyAgICBPTVhfSU5UIFhjb29yZCwKKyAgICBPTVhfSU5UIFljb29yZCwKKyAgICBPTVhfSU5UIHNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMipwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLworLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCisKK2VudW0geworICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKKyAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCisgICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAorfTsKKworCisKKy8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KKy8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCit9OworCisKKworLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KKy8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCisKK2VudW0geworICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfQ0VOVEVSID0gNCwKKyAgICBPTVhfVkNfUklHSFQgPSA4LAorICAgIE9NWF9WQ19MT1dFUiA9IDE2LAorICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKKyAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCit9OworCisKKworLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCit9IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OworCisKKworLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCit9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KKy8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgeDsKKyAgICBPTVhfSU5UIHk7Cit9IE9NWFZDTTRQMkNvb3JkaW5hdGU7CisKKworCisvKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAyTUVNb2RlOworCisKKworLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLworICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLworICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLworICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCit9IE9NWFZDTTRQMk1FUGFyYW1zOworCisKKworLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLworICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKKyAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCisgKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKKyAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAorICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCisgKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAorICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAorICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAorICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKKyAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAorICogICAgICAgICAgICByZXR1cm4gTVZzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAorICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKKyAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKKyAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCisgKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKKyAgICBPTVhfSU5UIGlCbGsKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAorICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCisgICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9VMTYgKnBEc3RTQUQsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAorICogW0lTTzE0NDk2LTJdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAorICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNi4xLjMuOC4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCAqcFJlYywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAorICAgIE9NWF9JTlQgKnBTdW1FcnIsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9VOCBjdXJRcCwKKyAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAorICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKKyAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAorICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgICAgLSBwU3JjIAorICogICAgICAgICAgICAtIHBEc3QKKyAqICAgICAgICAgICAgLSBwUmVjCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9TMTYgKnBSZWMsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCisgKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAorICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAorICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAorICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKKyAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKKyAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKKyAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKKyAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKKyAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKKyAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCisgKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBpZjoKKyAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKKyAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAorICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAorICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAorICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAorICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKKyAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAorICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAorICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCisgKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKKyAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAorICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAorICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAorICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKKyAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAorICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCisgKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCisgKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAorICogICAgICAgICAgICAgIHRydWU6IAorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKKyAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCisgKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAorICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAorICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKKyAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAorICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAorICoKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgYmVsb25ncyB0byAKKyAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCisgKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKKyAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAorICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKKyAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAorICogICAgICAgICBwUVBCdWYsIHBEc3QuIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAorICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKKyAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCisgKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4CisgKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAsCisgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgT01YX1U4IGN1clFQLAorICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIGludHJhRENWTEMsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAorICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCisgKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKKyAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKKyAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAorICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBRUCA8PSAwLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKKyAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAorICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCisgKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCisgKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIGN1clFQID4zMSwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCisgKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQorICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKKyAgICBPTVhfSU5UIGN1clFQLAorICAgIE9NWF9JTlQgcHJlZFFQLAorICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCisgICAgT01YX0lOVCBybmRWYWwKKyk7CisKKworCisvKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KKyAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLworICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLworICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLworICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAorfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLworICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCisgICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKK30gT01YVkNNNFAxME1FTW9kZTsKKworCisKKy8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAorICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKKyAgICBPTVhfVkNfUF84eDggID0gMywKKyAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCisgICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKKyAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCisgICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCisgICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAorfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAorICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAorICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAorfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCisgICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KKyAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KKyAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KKyAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KK30gT01YVkNNNFAxMFZMQ0luZm87CisKKworCisvKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KKyAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCisgICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KKyAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLworICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KKyAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLworfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKKworCisKKy8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KKyAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7CisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKK30gT01YVkNNNFAxME1FUGFyYW1zOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKKyAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKKyAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCisgKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCisgKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKKyAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAorICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKKyAqICAgICAgICAgICAgMC4uMTUpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCisgKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAorICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqIE5vdGU6IAorICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCisgKiAgICAgICAgICAgIDAuLjcpLiAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAorICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKKyAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKKyAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAorICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCisgKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGggCisgKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAorICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aC4gCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6CisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAorICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCisgKiAgICAgICAgICAgICAgaXMgTlVMTC4gCisgKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKKyAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAorICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKKyAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCisgKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKKyAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCisgKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAorICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKKyAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKKyAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAorICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCisgKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAorICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCisgKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCisgKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAorICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCisgKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCisgKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKKyAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKKyAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMipwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCisgKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCisgKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCisgKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKKyAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCisgKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCisgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKKyAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKKyAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCisgKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCisgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKKyAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCisgKgorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX1MzMiAqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCisgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgIE9NWF9JTlQgc01heE51bUNvZWZmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAorICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKKyAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAorICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCisgKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAorICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCisgKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKKyAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKKyAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAorICogMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAorICogICAgICAgICAgICBleGlzdCAKKyAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAorICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAorICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCisgKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBwcmVkU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIEFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAorICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCisgKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCisgKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCisgKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKKyAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCisgKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKKyAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCisgKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAorICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCisgKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCisgKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAorICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0LAorICAgIHZvaWQgKnBNRVNwZWMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCisgKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAorICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCisgKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAorICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKKyAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAorICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKKyAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAorICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAorICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAorICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKKyAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKKyAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAorICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAorICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAorICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCisgKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uIAorICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRFUi4gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVFJBLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKKyAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAorICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAorICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCisgKiAgICAgICAgICAgIC0gIE1iVHlwZSAKKyAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAorICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAorICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAorICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCisgKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAorICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCisgKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKKyAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIE9NWF9VMzIgTGFtYmRhLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisgICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9JTlQgKnBEc3RDb3N0LAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKKyAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCisgKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCisgKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9VMzIgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAorICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCisgKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgtMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCisgKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0TGVmdCwKKyAgICBPTVhfVTggKnBEc3RSaWdodCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCisgKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdFVwLAorICAgIE9NWF9VOCAqcERzdERvd24sCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKKyAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAorICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKKyAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKKyAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIG1hdHJpeC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAorICAgIE9NWF9VOCAqcERzdFJlY29uLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKKyAgICBPTVhfVTggYkFDCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKKyAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKKyAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKKyAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCisgKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKKyAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgNC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAorICogICAgICAgICAgICBvZiA0LiAKKyAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAorICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKKyAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAorICogICAgICAgICAgICAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAorICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAorICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKKyAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAorICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAorICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERDQ29lZmYsCisgICAgT01YX1M4ICpwTnVtQ29lZmYsCisgICAgT01YX1UzMiBuVGhyZXNoU0FELAorICAgIE9NWF9VMzIgaVFQLAorICAgIE9NWF9VOCBiSW50cmEKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKKyAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKKyAqIHN0cnVjdHVyZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKKyAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKKyAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKKyAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKKyAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKKyAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCisgKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCisgKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKKyAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKKyAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAorICAgIE9NWF9VOCBiQUMsCisgICAgT01YX1UzMiBNYXhOdW1Db2VmLAorICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCispOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KKworLyoqIEVPRiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwpAQCAtMCwwICsxLDc4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX0F2ZXJhZ2UuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gYmxvY2tzIGlmIHNpemUgaVdpZHRoIFggaUhlaWdodAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgT01YX1UzMiAgICAgeCwgeTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0UHJlZCBbeSAqIGlEc3RTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICAoT01YX1U4KSgoKE9NWF9VMzIpcFByZWQwIFt5ICogaVByZWRTdGVwMCArIHhdICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZWQxIFt5ICogaVByZWRTdGVwMSArIHhdICsgMSkgPj4gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxYWM5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fU0FELmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgTnhNIGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jaworICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0LAorCU9NWF9VMzIJCWlXaWR0aAorKQoreworICAgIE9NWF9JTlQgICAgIHgsIHk7CisgICAgCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgKnBEc3RTQUQgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwU3JjT3JnIFsoeSAqIGlTdGVwT3JnKSArIHhdIC0gCisgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWYgWyh5ICogaVN0ZXBSZWYpICsgeF0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxNDQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzE2eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KKyBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCAxNiwgaUhlaWdodCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiMTMyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0F2ZXJhZ2VfOHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gOHg0IG9yIDh4OCBvciA4eDE2IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAorICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCisgKgorICovCisgT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgJCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKyAgICAgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDQpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA4LCBpSGVpZ2h0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU5YWRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgY29tcHV0aW5nIHRoZSBlcnJvciBmb3IgYSBNQiBvZiBzaXplIDh4OAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrKAorICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgICBPTVhfUzE2ICogcERzdAorKQoreworCisgICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwOworICAgICAgICAgeSA8IDg7CisgICAgICAgICB5KyssIHBTcmMgKz0gc3JjU3RlcCkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1t4XSAtIHBTcmNSZWZbY291bnRdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDczMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4CisgKiAKKyAqLworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEKAorICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworCisgICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCAqcERzdFNBRCA9IDA7CisgICAgICAgICB5IDwgODsKKyAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07CisgICAgICAgICAgICAqcERzdFNBRCArPSBhcm1BYnMocERzdFtjb3VudF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1NzAyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29weTE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBNUEVHNCAxNngxNiBDb3B5IG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCisgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNigKKwkJY29uc3QgT01YX1U4ICpwU3JjLCAKKwkJT01YX1U4ICpwRHN0LCAKKwkJT01YX0lOVCBzdGVwKQorIHsKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKHN0ZXAgPCAxNikgfHwgKHN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgCisgICAgLyogQ29weWluZyB0aGUgcmVmIDE2eDE2IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDE2OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gMTYpCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjlkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5OHg4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBNUEVHNCA4eDggQ29weSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAorICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDgoCisJCWNvbnN0IE9NWF9VOCAqcFNyYywgCisJCU9NWF9VOCAqcERzdCwgCisJCU9NWF9JTlQgc3RlcCkKKyB7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisKKyAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDgpIHx8IChzdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgCisgICAgLyogQ29weWluZyB0aGUgcmVmIDh4OCBibGsgdG8gdGhlIGN1cnIgYmxrICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCA4OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gOCkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssIGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07CisgICAgICAgIH0gICAgICAgCisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTM2ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JKAorCU9NWF9VOCoJcFNyY0RzdFBsYW5lLCAKKwlPTVhfVTMyCWlGcmFtZVdpZHRoLCAKKwlPTVhfVTMyCWlGcmFtZUhlaWdodCwgCisJT01YX1UzMglpRXhwYW5kUGVscywgCisJT01YX1UzMglpUGxhbmVTdGVwCispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfVTgqICAgICBwTGVmdDsKKyAgICBPTVhfVTgqICAgICBwUmlnaHQ7CisgICAgT01YX1U4KiAgICAgcFRvcDsKKyAgICBPTVhfVTgqICAgICBwQm90dG9tOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdFBsYW5lID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0UGxhbmUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVXaWR0aCA9PSAwIHx8IGlGcmFtZVdpZHRoICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaUZyYW1lSGVpZ2h0PT0gMCB8fCBpRnJhbWVIZWlnaHQgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRXhwYW5kUGVscyA9PSAwIHx8IGlFeHBhbmRQZWxzICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVBsYW5lU3RlcCA9PSAwIHx8IGlQbGFuZVN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKSwgCisgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBUb3AgYW5kIEJvdHRvbSAqLworICAgIHBUb3AgPSBwU3JjRHN0UGxhbmUgLSAoaUV4cGFuZFBlbHMgKiBpUGxhbmVTdGVwKTsKKyAgICBwQm90dG9tID0gcFNyY0RzdFBsYW5lICsgKGlGcmFtZUhlaWdodCAqIGlQbGFuZVN0ZXApOworCisgICAgZm9yICh5ID0gMDsgeSA8IChPTVhfSU5UKWlFeHBhbmRQZWxzOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUZyYW1lV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFRvcCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeF07CisgICAgICAgICAgICBwQm90dG9tIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCisgICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMZWZ0LCBSaWdodCBhbmQgQ29ybmVycyAqLworICAgIHBMZWZ0ID0gcFNyY0RzdFBsYW5lIC0gaUV4cGFuZFBlbHM7CisgICAgcFJpZ2h0ID0gcFNyY0RzdFBsYW5lICsgaUZyYW1lV2lkdGg7CisKKyAgICBmb3IgKHkgPSAtKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkgPCAoT01YX0lOVCkoaUZyYW1lSGVpZ2h0ICsgaUV4cGFuZFBlbHMpOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcExlZnQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgMF07CisgICAgICAgICAgICBwUmlnaHQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgKGlGcmFtZVdpZHRoIC0gMSldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpAQCAtMCwwICsxLDgxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIGxpbWl0aW5nIHRoZSBNVgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCisgKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCisgKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCisgKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAorICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAorICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCisgKiAgICAgICAgICAgIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKKyAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAorICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0KAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNViwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgY29uc3QgT01YUmVjdCAqIHBSZWN0Vk9QUmVmLAorICAgICBPTVhfSU5UIFhjb29yZCwKKyAgICAgT01YX0lOVCBZY29vcmQsCisgICAgIE9NWF9JTlQgc2l6ZQorKQoreworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVjdFZPUFJlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHNpemUgIT0gOCkgJiYgKHNpemUgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBSZWN0Vk9QUmVmLT53aWR0aCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPmhlaWdodCA8ICgyKiBzaXplKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBwRHN0TVYtPmR4ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHgsIDIqcFJlY3RWT1BSZWYtPnggLSBYY29vcmQpLAorICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eCArIHBSZWN0Vk9QUmVmLT53aWR0aCAtIFhjb29yZCAtIHNpemUpKTsKKyAgICBwRHN0TVYtPmR5ID0gYXJtTWluIChhcm1NYXggKHBTcmNNVi0+ZHksIDIqcFJlY3RWT1BSZWYtPnkgLSBZY29vcmQpLAorICAgICAgICAgICAgICAgICAgICAoMipwUmVjdFZPUFJlZi0+eSArIHBSZWN0Vk9QUmVmLT5oZWlnaHQgLSBZY29vcmQgLSBzaXplKSk7CisKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGNlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9TQURfMTZ4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCgKKwkJCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJCQlPTVhfVTMyIAlpU3RlcE9yZywKKwkJCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJCQlPTVhfVTMyIAlpU3RlcFJlZiwKKwkJCU9NWF9TMzIqCXBEc3RTQUQsCisJCQlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAorICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjFkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF84eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4KAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAorICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE4YThmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpbGU6ICAgICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogSGVhZGVyIGZpbGUgZm9yIEFSTSBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuTUFYIFZDTTRQMTAKKyAqIAorICovCisgCisjaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyAgCisvKiBDQVZMQyB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbNjJdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbNV07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMzZhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpAQCAtMCwwICsxLDcwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogQ0FWTEMgdGFibGVzIGZvciBILjI2NAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgorCisvKiBUYWJsZXMgbWFwcGluZyBhIGNvZGUgdG8gVHJhaWxpbmdPbmVzIGFuZCBUb3RhbENvZWZmICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXSA9IHsKKyAwLAorIDAsIDEsCisgMCwgMSwgMiwKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml0gPSB7CisgMCwKKyAxLCAxLAorIDIsIDIsIDIsCisgMywgMywgMywgMywKKyA0LCA0LCA0LCA0LAorIDUsIDUsIDUsIDUsCisgNiwgNiwgNiwgNiwKKyA3LCA3LCA3LCA3LAorIDgsIDgsIDgsIDgsCisgOSwgOSwgOSwgOSwKKyAxMCwgMTAsIDEwLCAxMCwKKyAxMSwgMTEsIDExLCAxMSwKKyAxMiwgMTIsIDEyLCAxMiwKKyAxMywgMTMsIDEzLCAxMywKKyAxNCwgMTQsIDE0LCAxNCwKKyAxNSwgMTUsIDE1LCAxNSwKKyAxNiwgMTYsIDE2LCAxNgorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjBbNjNdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwNSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDgsIDB4MDAwNyB9LAorICAgIHsgIDYsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDksIDB4MDAwNyB9LAorICAgIHsgIDgsIDB4MDAwNiB9LAorICAgIHsgIDcsIDB4MDAwNSB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgMTAsIDB4MDAwNyB9LAorICAgIHsgIDksIDB4MDAwNiB9LAorICAgIHsgIDgsIDB4MDAwNSB9LAorICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgMTEsIDB4MDAwNyB9LAorICAgIHsgMTAsIDB4MDAwNiB9LAorICAgIHsgIDksIDB4MDAwNSB9LAorICAgIHsgIDcsIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwZiB9LAorICAgIHsgMTEsIDB4MDAwNiB9LAorICAgIHsgMTAsIDB4MDAwNSB9LAorICAgIHsgIDgsIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwYiB9LAorICAgIHsgMTMsIDB4MDAwZSB9LAorICAgIHsgMTEsIDB4MDAwNSB9LAorICAgIHsgIDksIDB4MDAwNCB9LAorICAgIHsgMTMsIDB4MDAwOCB9LAorICAgIHsgMTMsIDB4MDAwYSB9LAorICAgIHsgMTMsIDB4MDAwZCB9LAorICAgIHsgMTAsIDB4MDAwNCB9LAorICAgIHsgMTQsIDB4MDAwZiB9LAorICAgIHsgMTQsIDB4MDAwZSB9LAorICAgIHsgMTMsIDB4MDAwOSB9LAorICAgIHsgMTEsIDB4MDAwNCB9LAorICAgIHsgMTQsIDB4MDAwYiB9LAorICAgIHsgMTQsIDB4MDAwYSB9LAorICAgIHsgMTQsIDB4MDAwZCB9LAorICAgIHsgMTMsIDB4MDAwYyB9LAorICAgIHsgMTUsIDB4MDAwZiB9LAorICAgIHsgMTUsIDB4MDAwZSB9LAorICAgIHsgMTQsIDB4MDAwOSB9LAorICAgIHsgMTQsIDB4MDAwYyB9LAorICAgIHsgMTUsIDB4MDAwYiB9LAorICAgIHsgMTUsIDB4MDAwYSB9LAorICAgIHsgMTUsIDB4MDAwZCB9LAorICAgIHsgMTQsIDB4MDAwOCB9LAorICAgIHsgMTYsIDB4MDAwZiB9LAorICAgIHsgMTUsIDB4MDAwMSB9LAorICAgIHsgMTUsIDB4MDAwOSB9LAorICAgIHsgMTUsIDB4MDAwYyB9LAorICAgIHsgMTYsIDB4MDAwYiB9LAorICAgIHsgMTYsIDB4MDAwZSB9LAorICAgIHsgMTYsIDB4MDAwZCB9LAorICAgIHsgMTUsIDB4MDAwOCB9LAorICAgIHsgMTYsIDB4MDAwNyB9LAorICAgIHsgMTYsIDB4MDAwYSB9LAorICAgIHsgMTYsIDB4MDAwOSB9LAorICAgIHsgMTYsIDB4MDAwYyB9LAorICAgIHsgMTYsIDB4MDAwNCB9LAorICAgIHsgMTYsIDB4MDAwNiB9LAorICAgIHsgMTYsIDB4MDAwNSB9LAorICAgIHsgMTYsIDB4MDAwOCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMVs2M10gPSB7CisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDBiIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDA3IH0sCisgICAgeyAgNSwgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDBhIH0sCisgICAgeyAgNiwgMHgwMDA5IH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgOCwgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgOCwgMHgwMDA0IH0sCisgICAgeyAgNywgMHgwMDA2IH0sCisgICAgeyAgNywgMHgwMDA1IH0sCisgICAgeyAgNSwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA3IH0sCisgICAgeyAgOCwgMHgwMDA2IH0sCisgICAgeyAgOCwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA4IH0sCisgICAgeyAxMSwgMHgwMDBmIH0sCisgICAgeyAgOSwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAxMSwgMHgwMDBiIH0sCisgICAgeyAxMSwgMHgwMDBlIH0sCisgICAgeyAxMSwgMHgwMDBkIH0sCisgICAgeyAgNywgMHgwMDA0IH0sCisgICAgeyAxMiwgMHgwMDBmIH0sCisgICAgeyAxMSwgMHgwMDBhIH0sCisgICAgeyAxMSwgMHgwMDA5IH0sCisgICAgeyAgOSwgMHgwMDA0IH0sCisgICAgeyAxMiwgMHgwMDBiIH0sCisgICAgeyAxMiwgMHgwMDBlIH0sCisgICAgeyAxMiwgMHgwMDBkIH0sCisgICAgeyAxMSwgMHgwMDBjIH0sCisgICAgeyAxMiwgMHgwMDA4IH0sCisgICAgeyAxMiwgMHgwMDBhIH0sCisgICAgeyAxMiwgMHgwMDA5IH0sCisgICAgeyAxMSwgMHgwMDA4IH0sCisgICAgeyAxMywgMHgwMDBmIH0sCisgICAgeyAxMywgMHgwMDBlIH0sCisgICAgeyAxMywgMHgwMDBkIH0sCisgICAgeyAxMiwgMHgwMDBjIH0sCisgICAgeyAxMywgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDA5IH0sCisgICAgeyAxMywgMHgwMDBjIH0sCisgICAgeyAxMywgMHgwMDA3IH0sCisgICAgeyAxNCwgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDA2IH0sCisgICAgeyAxMywgMHgwMDA4IH0sCisgICAgeyAxNCwgMHgwMDA5IH0sCisgICAgeyAxNCwgMHgwMDA4IH0sCisgICAgeyAxNCwgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDAxIH0sCisgICAgeyAxNCwgMHgwMDA3IH0sCisgICAgeyAxNCwgMHgwMDA2IH0sCisgICAgeyAxNCwgMHgwMDA1IH0sCisgICAgeyAxNCwgMHgwMDA0IH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4yWzYzXSA9IHsKKyAgICB7ICA0LCAweDAwMGYgfSwKKyAgICB7ICA2LCAweDAwMGYgfSwKKyAgICB7ICA0LCAweDAwMGUgfSwKKyAgICB7ICA2LCAweDAwMGIgfSwKKyAgICB7ICA1LCAweDAwMGYgfSwKKyAgICB7ICA0LCAweDAwMGQgfSwKKyAgICB7ICA2LCAweDAwMDggfSwKKyAgICB7ICA1LCAweDAwMGMgfSwKKyAgICB7ICA1LCAweDAwMGUgfSwKKyAgICB7ICA0LCAweDAwMGMgfSwKKyAgICB7ICA3LCAweDAwMGYgfSwKKyAgICB7ICA1LCAweDAwMGEgfSwKKyAgICB7ICA1LCAweDAwMGIgfSwKKyAgICB7ICA0LCAweDAwMGIgfSwKKyAgICB7ICA3LCAweDAwMGIgfSwKKyAgICB7ICA1LCAweDAwMDggfSwKKyAgICB7ICA1LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMGEgfSwKKyAgICB7ICA3LCAweDAwMDkgfSwKKyAgICB7ICA2LCAweDAwMGUgfSwKKyAgICB7ICA2LCAweDAwMGQgfSwKKyAgICB7ICA0LCAweDAwMDkgfSwKKyAgICB7ICA3LCAweDAwMDggfSwKKyAgICB7ICA2LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMDggfSwKKyAgICB7ICA4LCAweDAwMGYgfSwKKyAgICB7ICA3LCAweDAwMGUgfSwKKyAgICB7ICA3LCAweDAwMGQgfSwKKyAgICB7ICA1LCAweDAwMGQgfSwKKyAgICB7ICA4LCAweDAwMGIgfSwKKyAgICB7ICA4LCAweDAwMGUgfSwKKyAgICB7ICA3LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMGYgfSwKKyAgICB7ICA4LCAweDAwMGEgfSwKKyAgICB7ICA4LCAweDAwMGQgfSwKKyAgICB7ICA3LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMGIgfSwKKyAgICB7ICA5LCAweDAwMGUgfSwKKyAgICB7ICA4LCAweDAwMDkgfSwKKyAgICB7ICA4LCAweDAwMGMgfSwKKyAgICB7ICA5LCAweDAwMDggfSwKKyAgICB7ICA5LCAweDAwMGEgfSwKKyAgICB7ICA5LCAweDAwMGQgfSwKKyAgICB7ICA4LCAweDAwMDggfSwKKyAgICB7IDEwLCAweDAwMGQgfSwKKyAgICB7ICA5LCAweDAwMDcgfSwKKyAgICB7ICA5LCAweDAwMDkgfSwKKyAgICB7ICA5LCAweDAwMGMgfSwKKyAgICB7IDEwLCAweDAwMDkgfSwKKyAgICB7IDEwLCAweDAwMGMgfSwKKyAgICB7IDEwLCAweDAwMGIgfSwKKyAgICB7IDEwLCAweDAwMGEgfSwKKyAgICB7IDEwLCAweDAwMDUgfSwKKyAgICB7IDEwLCAweDAwMDggfSwKKyAgICB7IDEwLCAweDAwMDcgfSwKKyAgICB7IDEwLCAweDAwMDYgfSwKKyAgICB7IDEwLCAweDAwMDEgfSwKKyAgICB7IDEwLCAweDAwMDQgfSwKKyAgICB7IDEwLCAweDAwMDMgfSwKKyAgICB7IDEwLCAweDAwMDIgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjNbNjNdID0geworICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwNCB9LAorICAgIHsgIDYsIDB4MDAwNSB9LAorICAgIHsgIDYsIDB4MDAwNiB9LAorICAgIHsgIDYsIDB4MDAwOCB9LAorICAgIHsgIDYsIDB4MDAwOSB9LAorICAgIHsgIDYsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwYiB9LAorICAgIHsgIDYsIDB4MDAwYyB9LAorICAgIHsgIDYsIDB4MDAwZCB9LAorICAgIHsgIDYsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwZiB9LAorICAgIHsgIDYsIDB4MDAxMCB9LAorICAgIHsgIDYsIDB4MDAxMSB9LAorICAgIHsgIDYsIDB4MDAxMiB9LAorICAgIHsgIDYsIDB4MDAxMyB9LAorICAgIHsgIDYsIDB4MDAxNCB9LAorICAgIHsgIDYsIDB4MDAxNSB9LAorICAgIHsgIDYsIDB4MDAxNiB9LAorICAgIHsgIDYsIDB4MDAxNyB9LAorICAgIHsgIDYsIDB4MDAxOCB9LAorICAgIHsgIDYsIDB4MDAxOSB9LAorICAgIHsgIDYsIDB4MDAxYSB9LAorICAgIHsgIDYsIDB4MDAxYiB9LAorICAgIHsgIDYsIDB4MDAxYyB9LAorICAgIHsgIDYsIDB4MDAxZCB9LAorICAgIHsgIDYsIDB4MDAxZSB9LAorICAgIHsgIDYsIDB4MDAxZiB9LAorICAgIHsgIDYsIDB4MDAyMCB9LAorICAgIHsgIDYsIDB4MDAyMSB9LAorICAgIHsgIDYsIDB4MDAyMiB9LAorICAgIHsgIDYsIDB4MDAyMyB9LAorICAgIHsgIDYsIDB4MDAyNCB9LAorICAgIHsgIDYsIDB4MDAyNSB9LAorICAgIHsgIDYsIDB4MDAyNiB9LAorICAgIHsgIDYsIDB4MDAyNyB9LAorICAgIHsgIDYsIDB4MDAyOCB9LAorICAgIHsgIDYsIDB4MDAyOSB9LAorICAgIHsgIDYsIDB4MDAyYSB9LAorICAgIHsgIDYsIDB4MDAyYiB9LAorICAgIHsgIDYsIDB4MDAyYyB9LAorICAgIHsgIDYsIDB4MDAyZCB9LAorICAgIHsgIDYsIDB4MDAyZSB9LAorICAgIHsgIDYsIDB4MDAyZiB9LAorICAgIHsgIDYsIDB4MDAzMCB9LAorICAgIHsgIDYsIDB4MDAzMSB9LAorICAgIHsgIDYsIDB4MDAzMiB9LAorICAgIHsgIDYsIDB4MDAzMyB9LAorICAgIHsgIDYsIDB4MDAzNCB9LAorICAgIHsgIDYsIDB4MDAzNSB9LAorICAgIHsgIDYsIDB4MDAzNiB9LAorICAgIHsgIDYsIDB4MDAzNyB9LAorICAgIHsgIDYsIDB4MDAzOCB9LAorICAgIHsgIDYsIDB4MDAzOSB9LAorICAgIHsgIDYsIDB4MDAzYSB9LAorICAgIHsgIDYsIDB4MDAzYiB9LAorICAgIHsgIDYsIDB4MDAzYyB9LAorICAgIHsgIDYsIDB4MDAzZCB9LAorICAgIHsgIDYsIDB4MDAzZSB9LAorICAgIHsgIDYsIDB4MDAzZiB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNFsxNV0gPSB7CisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA3IH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgOCwgMHgwMDAzIH0sCisgICAgeyAgOCwgMHgwMDAyIH0sCisgICAgeyAgNywgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4wLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xLAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjIsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjQKK307CisKKy8qIFRhYmxlIGZvciBsZXZlbF9wcmVmaXggKi8KKworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN10gPSB7CisgICAgeyAgMSwgMX0sCisgICAgeyAgMiwgMX0sCisgICAgeyAgMywgMX0sCisgICAgeyAgNCwgMX0sCisgICAgeyAgNSwgMX0sCisgICAgeyAgNiwgMX0sCisgICAgeyAgNywgMX0sCisgICAgeyAgOCwgMX0sCisgICAgeyAgOSwgMX0sCisgICAgeyAxMCwgMX0sCisgICAgeyAxMSwgMX0sCisgICAgeyAxMiwgMX0sCisgICAgeyAxMywgMX0sCisgICAgeyAxNCwgMX0sCisgICAgeyAxNSwgMX0sCisgICAgeyAxNiwgMX0sCisgICAgeyAgMCwgMH0KK307CisKKy8qIFRhYmxlcyBmb3IgdG90YWxfemVyb3MgKi8KKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczFbMTddID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDYsIDB4MDAwMyB9LAorICAgIHsgIDYsIDB4MDAwMiB9LAorICAgIHsgIDcsIDB4MDAwMyB9LAorICAgIHsgIDcsIDB4MDAwMiB9LAorICAgIHsgIDgsIDB4MDAwMyB9LAorICAgIHsgIDgsIDB4MDAwMiB9LAorICAgIHsgIDksIDB4MDAwMyB9LAorICAgIHsgIDksIDB4MDAwMiB9LAorICAgIHsgIDksIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMlsxNl0gPSB7CisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzWzE1XSA9IHsKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDMgfSwKKyAgICB7ICA1LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczRbMTRdID0geworICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDQsIDB4MDAwNSB9LAorICAgIHsgIDQsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNVsxM10gPSB7CisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2WzEyXSA9IHsKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczdbMTFdID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOFsxMF0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5WzldID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTBbOF0gPSB7CisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMVs3XSA9IHsKKyAgICB7ICA0LCAweDAwMDAgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyWzZdID0geworICAgIHsgIDQsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTNbNV0gPSB7CisgICAgeyAgMywgMHgwMDAwIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNFs0XSA9IHsKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1WzNdID0geworICAgIHsgIDEsIDB4MDAwMCB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczIsCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTAsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNSAKK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMVs1XSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMiwgMSB9LAorICAgIHsgIDMsIDEgfSwKKyAgICB7ICAzLCAwIH0sCisgICAgeyAgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzJbNF0gPSB7CisgICAgeyAgMSwgMSB9LAorICAgIHsgIDIsIDEgfSwKKyAgICB7ICAyLCAwIH0sCisgICAgeyAgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzNbM10gPSB7CisgICAgeyAgMSwgMSB9LAorICAgIHsgIDEsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7CisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8yLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMworfTsKKworCisvKiBUYWJsZXMgZm9yIHJ1bl9iZWZvcmUgKi8KKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMVszXSA9IHsKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMls0XSA9IHsKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlM1s1XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNFs2XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNVs3XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNls4XSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlN1sxNl0gPSB7CisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNywgMHgwMDAxIH0sCisgICAgeyAgOCwgMHgwMDAxIH0sCisgICAgeyAgOSwgMHgwMDAxIH0sCisgICAgeyAxMCwgMHgwMDAxIH0sCisgICAgeyAxMSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTQsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTcKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGJlZGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCisgKiB0aGUgYmVzdCBNViBhbmQgU0FECisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgRXhwLUdvbG9tYiBjb2RlIGxlbmd0aCBmb3IgYSBnaXZlbiB2YWx1ZXMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICAgICAgIHZhbAlTaWduZWQgbnVtYmVyIGZvciB3aGljaCBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGhhcworICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsY3VsYXRlZAorICoKKyAqIFJldHVybiBWYWx1ZTogCisgKiAgICAgICAgICAgICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEV4cC1Hb2xvbWIgY29kZSBmb3IgdmFsCisgKi8KKworc3RhdGljIE9NWF9VMTYgYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoT01YX1MxNiB2YWwpCit7CisgICAgT01YX1UxNiBzaXplQ29kZU51bSwgY29kZU51bTsKKyAgICAKKyAgICAvKiBNYXBwaW5nIHZhbCB0byBjb2RlTnVtICovCisgICAgY29kZU51bSA9IGFybUFicyAodmFsKTsKKyAgICBpZiAodmFsID4gMCkKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSAoMiAqIGNvZGVOdW0pIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IDIgKiBjb2RlTnVtOworICAgIH0KKyAgICAKKyAgICAvKiBTaXplIG9mIHRoZSBleHAtZ29sb21iIGNvZGUgKi8KKyAgICBzaXplQ29kZU51bSA9ICgyICogYXJtTG9nU2l6ZSAoY29kZU51bSArIDEpKSAtIDE7CisgICAgCisgICAgcmV0dXJuIHNpemVDb2RlTnVtOworfQorICAgICAgICAgICAgICAgIAorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIE1vdGlvbiBjb3N0IHRvIGRlY2lkZSB0aGUgCisgKiBiZXN0IE1WIGFuZCBiZXN0IE1DCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgICAgICBtdlgJeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvciBpbiAxLzQgcGVsIHVuaXRzCisgKiBbaW5dCSAgICAgICAgIG12WQl5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKKyAqIFtpbl0JICAgICAgZGlmZk1WCWRpZmZlcmVudGlhbCBNVgorICogW2luXQkgICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAorICogW2luXQkgICAgICBiZXN0TVYJQmVzdCBNViwgY29udGFpbnMgYmVzdCBNViB0aWxsIHRoZSBwcmV2aW91cyBpbnRlcmF0aW9uLgorICogW2luXSAgICAgICBuTGFtZGEgICAgTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiBbaW5dICAgKnBCZXN0Q29zdCAgICBDb250YWlucyB0aGUgY3VycmVudCBiZXN0IG1vdGlvbiBjb3N0LgorICogW291dF0gICpwQmVzdENvc3QgICAgcEJlc3RDb3N0IE1vdGlvbiBjb3N0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WIAorICogICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIganVkZ2VtZW50OyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIGFzIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYsIGlmIHRoZSBjYW5kQ29zdCBpcyBsZXNzIAorICogICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGUgYmVzdCBjb3N0IHBhc3NlZCB0aGVuIHRoZSAqcEJlc3RDb3N0IHdpbGwgYmUgZXF1YWwgdG8gY2FuZENvc3QKKyAqIFtvdXRdCSAgYmVzdE1WCUZpbmFsbHkgd2lsbCBoYXZlIHRoZSBiZXN0IE1WIGFmdGVyIHRoZSBqdWRnZW1lbnQuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgbW90aW9uIGNvc3QgaXMgdGhlIGJlc3QgCisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgbW90aW9uIGNvc3QKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKykgCit7CisgICAgT01YX1MzMiBjYW5kQ29zdDsKKyAgICBPTVhfVTE2IHNpemVDb2RlTnVtOworICAgIAorICAgIHNpemVDb2RlTnVtID0gYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoZGlmZk1WLmR4KTsKKyAgICBzaXplQ29kZU51bSArPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHkpOworICAgIAorICAgIC8qIE1vdGlvbiBjb3N0ID0gU0FEICsgIGxhbWRhICogKChiaXRzdXNlZChkaWZmTVZ4KSArIChiaXRzdXNlZChkaWZmTVZ5KSkqLworICAgIGNhbmRDb3N0ID0gY2FuZFNBRCArIChuTGFtZGEgKiBzaXplQ29kZU51bSk7CisgICAgICAgIAorICAgIC8qIENhbGN1bGF0ZSBjYW5kQ29zdCAqLworICAgIGlmIChjYW5kQ29zdCA8ICpwQmVzdENvc3QpCisgICAgeworICAgICAgICAqcEJlc3RDb3N0ID0gY2FuZENvc3Q7CisgICAgICAgIGJlc3RNVi0+ZHggPSBtdlg7CisgICAgICAgIGJlc3RNVi0+ZHkgPSBtdlk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2FuZENvc3QgPiAqcEJlc3RDb3N0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIHNob3J0ZXIgbW90aW9uIHZlY3RvciAqLworICAgIGlmICggKG12WCAqIG12WCArIG12WSAqIG12WSkgPCAoKGJlc3RNVi0+ZHggKiBiZXN0TVYtPmR4KSArIChiZXN0TVYtPmR5ICogYmVzdE1WLT5keSkpICkKKyAgICB7CisgICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKKyAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKKyAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmIxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQorICogCisgKi8KKworI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMCisjdW5kZWYgREVCVUdfT04KKyNkZWZpbmUgREVCVUdfT04KKyNlbmRpZiAvKiBERUJVR19BUk1WQ000UDEwX0RFQkxPQ0tQSVhFTCAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKykKK3sKKyAgICBpbnQgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICAgIGludCBhcCwgYXEsIGRlbHRhOworCisgICAgaWYgKGJTPT0wKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHAzID0gcFEwWy00KlN0ZXBdOworICAgIHAyID0gcFEwWy0zKlN0ZXBdOworICAgIHAxID0gcFEwWy0yKlN0ZXBdOworICAgIHAwID0gcFEwWy0xKlN0ZXBdOworICAgIHEwID0gcFEwWyAwKlN0ZXBdOworICAgIHExID0gcFEwWyAxKlN0ZXBdOworICAgIHEyID0gcFEwWyAyKlN0ZXBdOworICAgIHEzID0gcFEwWyAzKlN0ZXBdOworCisgICAgaWYgKGFybUFicyhwMC1xMCk+PWFscGhhIHx8IGFybUFicyhwMS1wMCk+PWJldGEgfHwgYXJtQWJzKHExLXEwKT49YmV0YSkKKyAgICB7CisgICAgICAgIERFQlVHX1BSSU5URl8xMCgiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBhbHBoYT0lZCBiZXRhPSVkXG4iLAorICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBhbHBoYSwgYmV0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhcCA9IGFybUFicyhwMiAtIHAwKTsKKyAgICBhcSA9IGFybUFicyhxMiAtIHEwKTsKKworICAgIGlmIChiUyA8IDQpCisgICAgeworICAgICAgICBpbnQgdEMgPSB0QzA7CisKKyAgICAgICAgaWYgKENocm9tYUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRDKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXAgPCBiZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXEgPCBiZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRDKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMsIHRDLCBkZWx0YSk7CisKKyAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcDAgKyBkZWx0YSk7CisgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOworCisgICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFwPGJldGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKKyAgICAgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOworICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICAgICAgcFEwWyAxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBiUz09NCAqLworICAgIHsKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKKyAgICAgICAgICAgIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKChwMiArIHAxICsgcDAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKCgyKnAxICsgcDAgKyBxMSArIDIpPj4yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFxPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7CisgICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHAwICsgcTAgKyAyKT4+Mik7CisgICAgICAgICAgICBwUTBbIDIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgoMipxMSArIHEwICsgcDEgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUJVR19QUklOVEZfMTMoIkRlQmxvY2tQaXhlbDogJTAyeCAlMDJ4ICUwMnggJTAyeCB8ICUwMnggJTAyeCAlMDJ4ICUwMnggYlM9JWQgLT4gJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKyAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBiUywKKyAgICAgICAgcFEwWy0yKlN0ZXBdLCBwUTBbLTEqU3RlcF0scFEwWzAqU3RlcF0scFEwWzEqU3RlcF0pOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE2YWRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwpAQCAtMCwwICsxLDI2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSCisjdW5kZWYgREVCVUdfT04KKyNkZWZpbmUgREVCVUdfT04KKyNlbmRpZgorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKKworLyogNHg0IERlWmlnWmFnIHRhYmxlICovCisKK3N0YXRpYyBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdbMTZdID0KK3sKKyAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Cit9OworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4ICAqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBuVGFibGUsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgaW50IENvZWZmVG9rZW4sIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lczsKKyAgICBpbnQgTGV2ZWwsIExldmVsQ29kZSwgTGV2ZWxQcmVmaXgsIExldmVsU3VmZml4LCBMZXZlbFN1ZmZpeFNpemU7CisgICAgaW50IFN1ZmZpeExlbmd0aCwgUnVuLCBaZXJvc0xlZnQsQ29lZmZOdW07CisgICAgaW50IGksIEZsYWdzOworICAgIE9NWF9VOCAqcFBvc0NvZWZidWYgPSAqcHBQb3NDb2VmYnVmOworICAgIE9NWF9TMTYgcExldmVsWzE2XTsKKyAgICBPTVhfVTggIHBSdW5bMTZdOworCisgICAgQ29lZmZUb2tlbiA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1tuVGFibGVdKTsKKyAgICBhcm1SZXREYXRhRXJySWYoQ29lZmZUb2tlbiA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKKworICAgIFRyYWlsaW5nT25lcyA9IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbQ29lZmZUb2tlbl07CisgICAgVG90YWxDb2VmZiAgID0gYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbQ29lZmZUb2tlbl07CisgICAgKnBOdW1Db2VmZiAgID0gKE9NWF9VOClUb3RhbENvZWZmOworCisgICAgREVCVUdfUFJJTlRGXzIoIlRvdGFsQ29lZmYgPSAlZCwgVHJhaWxpbmdPbmVzID0gJWRcbiIsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyk7CisKKyAgICBpZiAoVG90YWxDb2VmZiA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgdHJhaWxpbmcgb25lcyAqLworICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+PVRvdGFsQ29lZmYtVHJhaWxpbmdPbmVzOyBpLS0pCisgICAgeworICAgICAgICBpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbCA9ICsxOworICAgICAgICB9CisgICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgKG5vbiB6ZXJvKSBsZXZlbCB2YWx1ZXMgKi8KKyAgICBTdWZmaXhMZW5ndGggPSAwOworICAgIGlmIChUb3RhbENvZWZmPjEwICYmIFRyYWlsaW5nT25lczwzKQorICAgIHsKKyAgICAgICAgU3VmZml4TGVuZ3RoPTE7CisgICAgfQorICAgIGZvciAoIDsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgICAgTGV2ZWxQcmVmaXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4KTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKExldmVsUHJlZml4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IFN1ZmZpeExlbmd0aDsKKyAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNCAmJiBTdWZmaXhMZW5ndGg9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gMTI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExldmVsU3VmZml4ID0gMDsKKyAgICAgICAgaWYgKExldmVsU3VmZml4U2l6ZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsU3VmZml4ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgTGV2ZWxTdWZmaXhTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExldmVsQ29kZSA9IChMZXZlbFByZWZpeCA8PCBTdWZmaXhMZW5ndGgpICsgTGV2ZWxTdWZmaXg7CisKKworICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1ICYmIFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDE1OworICAgICAgICB9CisKKyAgICAgICAgLyogTGV2ZWxDb2RlID0gMioobWFnbml0dWRlLTEpICsgc2lnbiAqLworCisgICAgICAgIGlmIChpPT1Ub3RhbENvZWZmLTEtVHJhaWxpbmdPbmVzICYmIFRyYWlsaW5nT25lczwzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMZXZlbCBtYWduaXR1ZGUgY2FuJ3QgYmUgMSAqLworICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsQ29kZSAmIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDJhKzEgbWFwcyB0byAtYS0xICovCisgICAgICAgICAgICBMZXZlbCA9ICgtTGV2ZWxDb2RlLTEpPj4xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMmErMCBtYXBzIHRvICthKzEgKi8KKyAgICAgICAgICAgIExldmVsID0gKExldmVsQ29kZSsyKT4+MTsKKyAgICAgICAgfQorICAgICAgICBwTGV2ZWxbaV0gPSAoT01YX1MxNilMZXZlbDsKKworICAgICAgICBERUJVR19QUklOVEZfMigiTGV2ZWxbJWRdID0gJWRcbiIsIGksIHBMZXZlbFtpXSk7CisKKyAgICAgICAgaWYgKFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgU3VmZml4TGVuZ3RoPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3VmZml4TGVuZ3RoKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZWNvZGUgcnVuIHZhbHVlcyAqLworICAgIFplcm9zTGVmdCA9IDA7CisgICAgaWYgKFRvdGFsQ29lZmYgPCBzTWF4TnVtQ29lZmYpCisgICAgeworICAgICAgICAvKiBEZWNvZGUgVG90YWxaZXJvcyBWTEMgKi8KKyAgICAgICAgaWYgKHNNYXhOdW1Db2VmZj09NCkKKyAgICAgICAgeworICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzW1RvdGFsQ29lZmYtMV0pOworICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFplcm9zTGVmdCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzW1RvdGFsQ29lZmYtMV0pOworICAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihaZXJvc0xlZnQgPT1BUk1fTk9fQ09ERUJPT0tfSU5ERVggLCBPTVhfU3RzX0Vycik7CisJICAgIH0KKyAgICB9CisKKyAgICBERUJVR19QUklOVEZfMSgiVG90YWxaZXJvcyA9ICVkXG4iLCBaZXJvc0xlZnQpOworCisJQ29lZmZOdW09WmVyb3NMZWZ0K1RvdGFsQ29lZmYtMTsKKworICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgUnVuID0gMDsKKyAgICAgICAgaWYgKFplcm9zTGVmdCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBUYWJsZSA9IFplcm9zTGVmdDsKKyAgICAgICAgICAgIGlmIChUYWJsZSA+IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGFibGUgPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUnVuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbVGFibGUtMV0pOworICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFJ1biA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKKyAgICAgICAgfQorICAgICAgICBwUnVuW2ldID0gKE9NWF9VOClSdW47CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIlJ1blslZF0gPSAlZFxuIiwgaSwgcFJ1bltpXSk7CisKKyAgICAgICAgWmVyb3NMZWZ0IC09IFJ1bjsKKyAgICB9CisgICAgcFJ1blswXSA9IChPTVhfVTgpWmVyb3NMZWZ0OworCisgICAgREVCVUdfUFJJTlRGXzEoIlJ1blswXSA9ICVkXG4iLCBwUnVuW2ldKTsKKworCisgICAgLyogRmlsbCBpbiBjb2VmZmljaWVudHMgKi8KKwkgICAgCisgICAgaWYgKHNNYXhOdW1Db2VmZj09MTUpCisgICAgeworICAgICAgICBDb2VmZk51bSsrOyAvKiBTa2lwIHRoZSBEQyBwb3NpdGlvbiAqLworICAgIH0KKwkKKwkvKmZvciAoaT0wO2k8VG90YWxDb2VmZjtpKyspCisJCUNvZWZmTnVtICs9IHBSdW5baV0rMTsqLworICAgIAorCWZvciAoaT0oVG90YWxDb2VmZi0xKTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgICAgLypDb2VmZk51bSArPSBwUnVuW2ldKzE7Ki8KKyAgICAgICAgTGV2ZWwgICAgID0gcExldmVsW2ldOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJDb2VmWyVkXSA9ICVkXG4iLCBDb2VmZk51bSwgTGV2ZWwpOworCisgICAgICAgIEZsYWdzID0gQ29lZmZOdW07CisJCUNvZWZmTnVtIC09IChwUnVuW2ldKzEpOworICAgICAgICBpZiAoc01heE51bUNvZWZmPjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBlcmZvcm0gNHg0IERlWmlnWmFnICovCisgICAgICAgICAgICBGbGFncyA9IGFybVZDTTRQMTBfWmlnWmFnW0ZsYWdzXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaT09MCkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgLyogRW5kIG9mIGJsb2NrIGZsYWcgKi8KKyAgICAgICAgICAgIEZsYWdzICs9IDB4MjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKExldmVsPC0xMjggfHwgTGV2ZWw+MTI3KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnICovCisgICAgICAgICAgICBGbGFncyArPSAweDEwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKEZsYWdzKTsKKyAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShMZXZlbCAmIDB4RkYpOworICAgICAgICBpZiAoRmxhZ3MgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsPj44KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwcFBvc0NvZWZidWYgPSBwUG9zQ29lZmJ1ZjsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMyNTQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKQEAgLTAsMCArMSw0NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgdGFibGVzCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl0gPSAKK3sKKyAgICAwLCAyLCAwLCAyLAorICAgIDIsIDEsIDIsIDEsCisgICAgMCwgMiwgMCwgMiwKKyAgICAyLCAxLCAyLCAxCit9OworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF0gPSAKK3sKKyAgICAwLCAyLAorICAgIDIsIDEKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM10gPQoreworICAgIHsgMTAsIDE2LCAxMyB9LAorICAgIHsgMTEsIDE4LCAxNCB9LAorICAgIHsgMTMsIDIwLCAxNiB9LAorICAgIHsgMTQsIDIzLCAxOCB9LAorICAgIHsgMTYsIDI1LCAyMCB9LAorICAgIHsgMTgsIDI5LCAyMyB9Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KK3ZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKKyAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOworICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07CisgICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKKyAgICAgICAgaW50IGUwID0gZDAgKyBkMzsKKyAgICAgICAgaW50IGUxID0gZDAgLSBkMzsKKyAgICAgICAgaW50IGUyID0gZDEgKyBkMjsKKyAgICAgICAgaW50IGUzID0gZDEgLSBkMjsKKyAgICAgICAgaW50IGYwID0gZTAgKyBlMjsKKyAgICAgICAgaW50IGYxID0gKGUxIDw8IDEpICsgZTM7CisgICAgICAgIGludCBmMiA9IGUwIC0gZTI7CisgICAgICAgIGludCBmMyA9IGUxIC0gKGUzIDw8IDEpOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKKyAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7CisgICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOworICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKKyAgICB9CisKKyAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKKyAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOworICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07CisgICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07CisgICAgICAgIGludCBnMCA9IGYwICsgZjM7CisgICAgICAgIGludCBnMSA9IGYwIC0gZjM7CisgICAgICAgIGludCBnMiA9IGYxICsgZjI7CisgICAgICAgIGludCBnMyA9IGYxIC0gZjI7CisgICAgICAgIGludCBoMCA9IGcwICsgZzI7CisgICAgICAgIGludCBoMSA9IChnMSA8PCAxKSArIGczOworICAgICAgICBpbnQgaDIgPSBnMCAtIGcyOworICAgICAgICBpbnQgaDMgPSBnMSAtIChnMyA8PCAxKTsKKyAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpIGgwOworICAgICAgICBwRHN0W2krNF0gPSAoT01YX1MxNikgaDE7CisgICAgICAgIHBEc3RbaSs4XSA9IChPTVhfUzE2KSBoMjsKKyAgICAgICAgcERzdFtpKzEyXSA9IChPTVhfUzE2KSBoMzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMyZjRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7CisgICAgT01YX1MxNiAgICAgQnVmIFsyMSAqIDE2XTsgIC8qIDIxIHJvd3MgYnkgMTYgcGl4ZWxzIHBlciByb3cgKi8KKyAgICBPTVhfVTMyICAgICB5LCB4OworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFsdWVzIHdpbGwgYmUgMS8yIHBlbCBhdCBIb3Jpem9udGFsIGRpcmVjdGlvbgorICAgICAqIFN0YXJ0aW5nIGF0ICgwLjUsIC0yKSBhdCB0b3AgZXh0ZW5kaW5nIHRvICgwLjUsIGhlaWdodCArIDMpIGF0IGJvdHRvbQorICAgICAqIEJ1ZiBjb250YWlucyBhIDJEIGFycmF5IG9mIHNpemUgKGlXaWR0aClYKGlIZWlnaHQgKyA1KQorICAgICAqLworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0ICsgNTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSAoeS0yKSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOworICAgICAgICAgICAgQnVmIFt5ICogaVdpZHRoICsgeF0gPSAoT01YX1MxNilIYWxmQ29lZmY7CisgICAgICAgIH0gLyogeCAqLworICAgIH0gLyogeSAqLworCisgICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGUgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSB5ICogaVdpZHRoICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIEJ1ZiBbcG9zXSAtIAorICAgICAgICAgICAgICAgIDUgKiBCdWYgW3BvcyArIDEgKiBpV2lkdGhdICsgCisgICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDIgKiBpV2lkdGhdICsgCisgICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDMgKiBpV2lkdGhdIC0gCisgICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgNCAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICBCdWYgW3BvcyArIDUgKiBpV2lkdGhdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOworCisgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljMDA3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpAQCAtMCwwICsxLDgyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IHkgKiBpU3JjU3RlcCArIHg7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMV0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMl0gKyAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzXTsKKworICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gSGFsZkNvZWZmOworICAgICAgICB9IC8qIHggKi8KKyAgICB9IC8qIHkgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlY2ZjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggICAKKyAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCisgICAgIE9NWF9VOCogICAgcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwgCisgICAgIE9NWF9VMzIgICAgaVdpZHRoLCAKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0CispCit7CisgICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7CisgICAgT01YX0lOVCAgICAgeSwgeDsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKworCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDIgKiBpU3JjU3RlcF0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMSAqIGlTcmNTdGVwXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAorICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMSAqIGlTcmNTdGVwXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyICogaVNyY1N0ZXBdICsgCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgMyAqIGlTcmNTdGVwXTsKKworICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA3ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCisgICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgICAgIE9NWF9VMzIgICAgIGR4LAorICAgICAgICBPTVhfVTMyICAgICBkeQorKQoreworICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeCA9IDggLSBkeDsKKyAgICBPTVhfVTMyICAgICBFaWdodE1pbnVzZHkgPSA4IC0gZHk7CisgICAgT01YX1UzMiAgICAgQUNvZWZmLCBCQ29lZmYsIENDb2VmZiwgRENvZWZmOworICAgIE9NWF9VMzIgICAgIHgsIHk7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlTcmNTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlEc3RTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlXaWR0aCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpSGVpZ2h0ID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIAorICAgIC8qIGlmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApICovCisgICAgaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKKyAgICB7CisgICAgICAgIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeTsKKyAgICAgICAgQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHk7CisgICAgICAgIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5OworICAgICAgICBEQ29lZmYgPSBkeCAqIGR5OworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9ICgKKyAgICAgICAgICAgICAgICAgICAgQUNvZWZmICogcFNyYyBbeSAqIGlTcmNTdGVwICsgeF0gKworICAgICAgICAgICAgICAgICAgICBCQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4ICsgMV0gKworICAgICAgICAgICAgICAgICAgICBDQ29lZmYgKiBwU3JjIFsoeSArIDEpICogaVNyY1N0ZXAgKyB4XSArCisgICAgICAgICAgICAgICAgICAgIERDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgIDMyKSA+PiA2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTc4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwpAQCAtMCwwICsxLDE5NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTTRQMTBfQ29weQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtTTRQMTBfQ29weSggIAorICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsCisgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgT01YX1U4KiAgICAgcERzdCwKKyAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfVTMyICAgICB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKQoreworICAgIE9NWF9VOCAgICAgIHBCdWYxIFsxNioxNl07CisgICAgY29uc3QgT01YX1U4ICAgICAgKnBTcmNIYWxmSG9yID0gcFNyYzsKKyAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZWZXIgPSBwU3JjOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIFdvcmsgb3V0IHBvc2l0aW9ucyBmb3IgaGFsZiBwaXhlbCBpbnRlcnBvbGF0aW9uICovCisgICAgaWYgKGR4ID09IDMpCisgICAgeworICAgICAgICBwU3JjSGFsZlZlciArPSAxOworICAgIH0KKyAgICBpZiAoZHkgPT0gMykKKyAgICB7CisgICAgICAgIHBTcmNIYWxmSG9yICs9IGlTcmNTdGVwOworICAgIH0KKworICAgIC8qIFN3aXRjaCBvbiB0eXBlIG9mIHBpeGVsCisgICAgICogUGl4ZWxzIGFyZSBuYW1lZCAnYScgdG8gJ3MnIGFzIGluIHRoZSBILjI2NCBzdGFuZGFyZAorICAgICAqLworICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApCisgICAgeworICAgICAgICAvKiBHICovCisgICAgICAgIGFybU00UDEwX0NvcHkocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgIH0KKyAgICBlbHNlIGlmIChkeSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogYSwgYiwgYyAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZlZlciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogZCwgaCwgbiAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgICAgICAocERzdCwgcFNyY0hhbGZIb3IsIGlEc3RTdGVwLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoZHggPT0gMiB8fCBkeSA9PSAyKQorICAgIHsKKyAgICAgICAgLyogaiAqLworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICAgICAgICAgICAgKHBTcmMsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBpZiAoZHggPT0gMSB8fCBkeCA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpLCBrICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwQnVmMSwgaURzdFN0ZXAsIGlXaWR0aCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR5ID09IDEgfHwgZHkgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZixxICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgICAgICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGR4PTEsMyBhbmQgZHk9MSwzICovCisgICAgeworICAgICAgICAvKiBlLCBnLCBwLCByICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBCdWYxLCBpV2lkdGgsIGlXaWR0aCwgaUhlaWdodCk7CisKKyAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisKKyAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAocEJ1ZjEsIHBEc3QsIGlXaWR0aCwgaURzdFN0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEzMDczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgNHg0IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgaWYgKENvdW50PT0wKQorICAgIHsKKyAgICAgICAgU3VtID0gMTI4OworICAgIH0KKyAgICBlbHNlIGlmIChDb3VudD09MSkKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIC8qIENvdW50ID0gMiAqLworICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDQpID4+IDM7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI1YmIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdID0KK3sKKyAgICB7MTMxMDcsIDUyNDMsIDgwNjZ9LAorICAgIHsxMTkxNiwgNDY2MCwgNzQ5MH0sCisgICAgezEwMDgyLCA0MTk0LCA2NTU0fSwKKyAgICB7IDkzNjIsIDM2NDcsIDU4MjV9LAorICAgIHsgODE5MiwgMzM1NSwgNTI0M30sCisgICAgeyA3MjgyLCAyODkzLCA0NTU5fQorfTsgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWUwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9TQURRdWFyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICBPTVhfUzMyICAgICBTQUQgPSAwOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU0FEICs9IGFybUFicyhwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSAtICgoCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWYwIFt5ICogaVJlZlN0ZXAwICsgeF0gKyAKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjEgW3kgKiBpUmVmU3RlcDEgKyB4XSArIDEpID4+IDEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgKnBEc3RTQUQgPSBTQUQ7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY3NTZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFRyYW5zZm9ybSByb3dzICovCisgICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCisgICAgeworICAgICAgICBpbnQgZDAgPSBwU3JjW2krMF07CisgICAgICAgIGludCBkMSA9IHBTcmNbaSsxXTsKKyAgICAgICAgaW50IGQyID0gcFNyY1tpKzJdOworICAgICAgICBpbnQgZDMgPSBwU3JjW2krM107CisgICAgICAgIGludCBlMCA9IGQwICsgZDI7CisgICAgICAgIGludCBlMSA9IGQwIC0gZDI7CisgICAgICAgIGludCBlMiA9IChkMT4+MSkgLSBkMzsKKyAgICAgICAgaW50IGUzID0gZDEgKyAoZDM+PjEpOworICAgICAgICBpbnQgZjAgPSBlMCArIGUzOworICAgICAgICBpbnQgZjEgPSBlMSArIGUyOworICAgICAgICBpbnQgZjIgPSBlMSAtIGUyOworICAgICAgICBpbnQgZjMgPSBlMCAtIGUzOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKKyAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7CisgICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOworICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKKyAgICB9CisKKyAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKKyAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOworICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07CisgICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07CisgICAgICAgIGludCBnMCA9IGYwICsgZjI7CisgICAgICAgIGludCBnMSA9IGYwIC0gZjI7CisgICAgICAgIGludCBnMiA9IChmMT4+MSkgLSBmMzsKKyAgICAgICAgaW50IGczID0gZjEgKyAoZjM+PjEpOworICAgICAgICBpbnQgaDAgPSBnMCArIGczOworICAgICAgICBpbnQgaDEgPSBnMSArIGcyOworICAgICAgICBpbnQgaDIgPSBnMSAtIGcyOworICAgICAgICBpbnQgaDMgPSBnMCAtIGczOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikoKGgwKzMyKT4+Nik7CisgICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSgoaDErMzIpPj42KTsKKyAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpKChoMiszMik+PjYpOworICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpKChoMyszMik+PjYpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTQ5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIGhlbHBlciBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKykKK3sKKyAgICBjb25zdCBPTVhfVTggKnBTcmMgPSAqcHBTcmM7CisgICAgaW50IGk7CisgICAgaW50IEZsYWcsIFZhbHVlOworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFtpXSA9IDA7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIEZsYWcgID0gKnBTcmMrKzsKKyAgICAgICAgaWYgKEZsYWcgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogOCBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSA9IEZsYWcgJiAxNTsKKyAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KKyAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7CisKKyAgICAqcHBTcmMgPSBwU3JjOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGRjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKQEAgLTAsMCArMSw3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgRmxhZywgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFtpXSA9IDA7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIEZsYWcgID0gKnBTcmMrKzsKKyAgICAgICAgaWYgKEZsYWcgJiAweDEwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogOCBiaXQgKi8KKyAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKKyAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSA9IEZsYWcgJiAxNTsKKyAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KKyAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7CisKKyAgICAqcHBTcmMgPSBwU3JjOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBkNTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQXZlcmFnZV80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA0eDQgb3IgNHg4IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKKyAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAorICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA0LCBpSGVpZ2h0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTBlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCkBAIC0wLDAgKzEsMTkxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBoYWxmIHBlbCBCbG9jayBtYXRjaGluZywgCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisgICAgCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCisgKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAorICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCisgKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAorICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAorICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCisgICAgT01YX1UzMiBuTGFtZGEsIAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCisgICAgT01YX1MzMiogcEJlc3RDb3N0CispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKKyAgICBPTVhfUzE2ICAgICB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbnRlZ2VyTVY7CisgICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIGludGVnZXJNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OworICAgIGludGVnZXJNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbnRlZ2VyTVYuZHkvNCkpICsgKGludGVnZXJNVi5keC80KTsKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgKyB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArICh5ICogblNyY1JlZlN0ZXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLworICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW50ZWdlck1WLmR4ICsgeCAqIDI7CisgICAgICAgICAgICBjYW5kTVYuZHkgPSBpbnRlZ2VyTVYuZHkgKyB5ICogMjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgaGFsZiBwZWwgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh4KSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1BYnMoeSkgKiAyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KKyAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoCQorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNPcmdZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY09yZ1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kU0FELAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgpOworIAorICAgICAgICAgICAgZGlmZk1WLmR4ID0gY2FuZE1WLmR4IC0gcE1WUHJlZC0+ZHg7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSBjYW5kTVYuZHkgLSBwTVZQcmVkLT5keTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keSwgCisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmTVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCwgCisgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5MYW1kYSwgCisgICAgICAgICAgICAgICAgICAgICAgICBwQmVzdENvc3QpOworCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc2NGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIElmIAorICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZS4gSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAorICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAorICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAorICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2l0bmVycyBhcmUgTlVMTDoKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKKyAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCisgT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKKyAgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKKwkgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICAgT01YX1UzMiBuTGFtZGEsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICAgT01YX1MzMiAqcEJlc3RDb3N0LAorICAgICB2b2lkICpwTUVTcGVjCispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCBjYW5kU0FEOworICAgIE9NWF9JTlQgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOworICAgIE9NWF9TMTYgeCwgeTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7CisgICAgT01YX1MzMiBuU2VhcmNoUmFuZ2U7CisgICAgQVJNVkNNNFAxMF9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDEwX01FU3BlYyAqKSBwTUVTcGVjOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVkNhbmRpZGF0ZSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtSWdub3JlIChwTUVTcGVjKTsKKworICAgIGlmKGlCbG9ja1dpZHRoID09IDQpCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlNHg0OworICAgIH0KKyAgICBlbHNlIGlmKGlCbG9ja1dpZHRoID09IDgpCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlMTZ4MTY7CisgICAgfQorICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCisgICAgZnJvbVggPSBuU2VhcmNoUmFuZ2U7CisgICAgdG9YICAgPSBuU2VhcmNoUmFuZ2U7CisgICAgZnJvbVkgPSBuU2VhcmNoUmFuZ2U7CisgICAgdG9ZICAgPSBuU2VhcmNoUmFuZ2U7CisgICAgCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQorICAgIHsKKyAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OworICAgIH0KKworICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIGlCbG9ja1dpZHRoICsgblNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCisgICAgeworICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gaUJsb2NrV2lkdGg7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQorICAgIHsKKyAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCisgICAgeworICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gaUJsb2NrV2lkdGg7CisgICAgfQorICAgIAorICAgIHBCZXN0TVYtPmR4ID0gLWZyb21YICogNDsKKyAgICBwQmVzdE1WLT5keSA9IC1mcm9tWSAqIDQ7CisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIHkpICsgeDsKKyAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgCSAgICAgICAgcFRlbXBTcmNPcmdZLAorICAgIAkgICAgICAgIG5TcmNPcmdTdGVwLAorICAgIAkgICAgICAgIHBUZW1wU3JjUmVmWSwKKyAgICAJICAgICAgICBuU3JjUmVmU3RlcCwKKyAgICAJICAgICAgICAmY2FuZFNBRCwKKyAgICAJICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgCSAgICAgICAgaUJsb2NrV2lkdGgpOworICAgIAkgICAgCisgICAgICAgICAgICBkaWZmTVYuZHggPSAoeCAqIDQpIC0gcE1WUHJlZC0+ZHg7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSAoeSAqIDQpIC0gcE1WUHJlZC0+ZHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgoeCAqIDQpLCAoeSAqIDQpLCBkaWZmTVYsIGNhbmRTQUQsIHBCZXN0TVYsIG5MYW1kYSwgcEJlc3RDb3N0KTsKKworICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCisgICAgfSAvKiBFbmQgb2YgeS1heGlzICovCisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzZWUyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHF1YXRlciBwZWwgQmxvY2sgbWF0Y2hpbmcsIAorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyAKKyAgICAKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCisgKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKKyAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KKyAKK09NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNPcmdZLCAKKyAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLCAKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsIAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsIAorICAgIE9NWF9VMzIgbkxhbWRhLCAKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcE1WUHJlZCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNEc3RCZXN0TVYsIAorICAgIE9NWF9TMzIqIHBCZXN0Q29zdAorKQoreworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7CisgICAgT01YX0lOVCAgICAgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7CisgICAgT01YX1MxNiAgICAgeCwgeTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIGNhbmRNViwgaW5pdGlhbE1WOworICAgIE9NWF9VOCAgICAgIGludGVycG9sWVsyNTZdOworICAgIE9NWF9TMzIgICAgIHBlbFBvc1gsIHBlbFBvc1k7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLworICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOworICAgIAorICAgIGluaXRpYWxNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OworICAgIGluaXRpYWxNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OworICAgIAorICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbml0aWFsTVYuZHkvNCkpICsgKGluaXRpYWxNVi5keC80KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGZyYWN0IHBlbCBwb3NpdGlvbiAqLworICAgICAgICAgICAgcGVsUG9zWCA9IChpbml0aWFsTVYuZHggJSA0KSArIHg7CisgICAgICAgICAgICBpZiAocGVsUG9zWCA8IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtIDE7CisgICAgICAgICAgICAgICAgcGVsUG9zWCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVsUG9zWSA9IChpbml0aWFsTVYuZHkgJSA0KSArIHk7CisgICAgICAgICAgICBpZiAocGVsUG9zWSA8IDApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtICgxICogblNyY1JlZlN0ZXApOworICAgICAgICAgICAgICAgIHBlbFBvc1kgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7IAorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBQcmVwYXJlIGNhbmQgTVYgKi8KKyAgICAgICAgICAgIGNhbmRNVi5keCA9IGluaXRpYWxNVi5keCArIHg7CisgICAgICAgICAgICBjYW5kTVYuZHkgPSBpbml0aWFsTVYuZHkgKyB5OworICAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgUXVhdGVyIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLworICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbFBvc1kpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7CisgCisgICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2IxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNhNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAorICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKKwljb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBkZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw4NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAorICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAorICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKKyAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAorICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAorICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAorICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCisgKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCisgKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKKyApCisKK3sKKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCA0LCA0KTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAorICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAorICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAorICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCisgKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAorICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAorICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCisgKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCisgKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAorICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAorICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCisgKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAorICoKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKQoreworICAgIGludCBuVGFibGU7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc1ZMQ1NlbGVjdDwwICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzTWF4TnVtQ29lZmY8MTUgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZj4xNiAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgLyogRmluZCBWTEMgdGFibGUgbnVtYmVyICovCisgICAgaWYgKHNWTENTZWxlY3Q8MikKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8NCkKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8OCkKKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDI7CisgICAgfQorICAgIGVsc2UgLyogc1ZMQ1NlbGVjdCA+PSA4ICovCisgICAgeworICAgICAgICBuVGFibGUgPSAzOworICAgIH0KKworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIG5UYWJsZSwgc01heE51bUNvZWZmKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDVhMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgTHVtYSBBQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRMdW1hQUM0eDQoCisgICAgIE9NWF9TMTYqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFZSb3cgPSAmYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdOworICAgIGludCBTaGlmdCA9IFFQIC8gNjsKKyAgICBpbnQgaTsKKyAgICBPTVhfUzMyIFZhbHVlOworCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisKKyAgICAgICAgVmFsdWUgPSAocFNyY0RzdFtpXSAqIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQ7CisgICAgICAgIHBTcmNEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKKyAgICAgT01YX1U4ICpwRHN0LAorICAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9JTlQgQUMgICAgICAgIAorKQoreworICAgIE9NWF9TMTYgcEJ1ZmZlclsxNis0XTsKKyAgICBPTVhfUzE2ICpwRGVsdGE7CisgICAgaW50IGkseCx5OworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBQcmVkID09IE5VTEwsICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwUHJlZCksT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRTdGVwICYgMywgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiAzLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUDwwKSwgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIChRUD41MSksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmIHBwU3JjPT1OVUxMLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDIT0wICYmICpwcFNyYz09TlVMTCwgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKEFDPT0wICYmIHBEQz09TlVMTCwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHBEZWx0YSA9IGFybUFsaWduVG84Qnl0ZXMocEJ1ZmZlcik7ICAgIAorCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIHBEZWx0YVtpXSA9IDA7CisgICAgfQorICAgIGlmIChBQykKKyAgICB7CisgICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEZWx0YSk7CisgICAgICAgIERlcXVhbnRMdW1hQUM0eDQocERlbHRhLCBRUCk7CisgICAgfQorICAgIGlmIChwREMpCisgICAgeworICAgICAgICBwRGVsdGFbMF0gPSBwRENbMF07CisgICAgfQorICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQocERlbHRhLHBEZWx0YSk7CisKKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClhcm1DbGlwKDAsMjU1LHBQcmVkW3kqcHJlZFN0ZXAreF0gKyBwRGVsdGFbNCp5K3hdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWRlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgY2hyb21hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKKyAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKKyAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCisgKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICBPTVhfVTgqIHBTcmNEc3QsCisgICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCisgICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCisgICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKKyApCit7CisgICAgaW50IEksIFgsIFksIEludGVybmFsPTA7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoWT0wOyBZPDg7IFkrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFg9MDsgWDw4OyBYKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWD4+MSkrNCooWT4+MSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWD4+MSkrNCooWT4+MildLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjI1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVibG9ja2luZyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCisgKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKKyAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAorICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCisgKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCU3BhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoWD0wOyBYPDg7IFgrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFk9MDsgWTw4OyBZKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWT4+MSkrNCooWD4+MSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjNdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8qIEZpbHRlciB2ZXJ0aWNhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAorICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbKFk+PjEpKzQqKFg+PjIpXSwKKyAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQlNbSV0sCisgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTM3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1zIHRlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKKyAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCisgKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICBPTVhfVTgqIHBTcmNEc3QsCisgICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCisgICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCisgICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKKyApCit7CisgICAgaW50IEksIFgsIFksIEludGVybmFsPTA7CisKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yIChZPTA7IFk8MTY7IFkrPTQsIEludGVybmFsPTEpCisgICAgeworICAgICAgICBmb3IgKFg9MDsgWDwxNjsgWCsrKQorICAgICAgICB7CisgICAgICAgICAgICBJID0gKFg+PjIpKzQqKFk+PjIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbSV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJIDwgNCkgICAgICAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leMV0gIT0gNCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczMzQyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAorICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCisgKiAgICAgICAgICAgICAgaXMgTlVMTC4gCisgKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKKyAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgWCwgWSwgSSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVswXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzFdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisKKyAgICBmb3IgKFg9MDsgWDwxNjsgWCs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWT0wOyBZPDE2OyBZKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWT4+MikrNCooWD4+Mik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tZXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKHBCU1tZXSA9PSA0KSAmJiAoWSA+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKCAocEJTW1ldID09IDQpICYmIChwQlNbWV4zXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzW1ldID4gMjUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKKyAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQlNbSV0sCisgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNTlkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCkBAIC0wLDAgKzEsMTkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9HZXRWTENJbmZvLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCisgKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCisgKiBzdHJ1Y3R1cmUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCisgKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCisgKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCisgKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAorICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCisgKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCisgKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCisgKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAorICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCisgKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAorICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCisgKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKKwljb25zdCBPTVhfUzE2KgkJICAgIHBTcmNDb2VmZiwKKwljb25zdCBPTVhfVTgqCQkJICAgIHBTY2FuTWF0cml4LAorCU9NWF9VOAkJCSAgICBiQUMsCisJT01YX1UzMgkJCSAgICBNYXhOdW1Db2VmLAorCU9NWFZDTTRQMTBWTENJbmZvKglwRHN0VkxDSW5mbworKQoreworICAgIE9NWF9JTlQgICAgIGksIE1pbkluZGV4OworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9VMzIgICAgIE1hc2sgPSA0LCBSdW5CZWZvcmU7CisgICAgT01YX1MxNiAgICAgKnBMZXZlbDsKKyAgICBPTVhfVTggICAgICAqcFJ1bjsKKyAgICBPTVhfUzE2ICAgICBCdWYgWzE2XTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0NvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNjYW5NYXRyaXggPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFZMQ0luZm8gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoTWF4TnVtQ29lZiA+IDE2LCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIEluaXRpYWxpemUgUkxFIEluZm8gc3RydWN0dXJlICovCisgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVzID0gMDsKKyAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyA9IDA7CisgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMgPSAwOworICAgIHBEc3RWTENJbmZvLT51VG90YWxaZXJvcyA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHBEc3RWTENJbmZvLT5pTGV2ZWxzIFtpXSA9IDA7CisgICAgICAgIHBEc3RWTENJbmZvLT51UnVucyBbaV0gPSAwOworICAgIH0KKyAgICAKKyAgICBNaW5JbmRleCA9IChiQUMgPT0gMCAmJiBNYXhOdW1Db2VmID09IDE1KSA/IDEgOiAwOworICAgIGZvciAoaSA9IE1pbkluZGV4OyBpIDwgKE1heE51bUNvZWYgKyBNaW5JbmRleCk7IGkrKykKKyAgICB7ICAgICAgICAKKyAgICAgICAgLyogU2NhbiAqLworICAgICAgICBCdWYgW2kgLSBNaW5JbmRleF0gPSBwU3JjQ29lZmYgW3BTY2FuTWF0cml4IFtpXV07CisgICAgfQorCisgICAgLyogc2tpcCB6ZXJvcyBhdCB0aGUgZW5kICovCisgICAgaSA9IE1heE51bUNvZWYgLSAxOworICAgIHdoaWxlICghQnVmIFtpXSAmJiBpID49IDApCisgICAgeworICAgICAgICBpLS07CisgICAgfQorICAgIAorICAgIGlmIChpIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIC8qIEZpbGwgUkxFIEluZm8gc3RydWN0dXJlICovCisgICAgcExldmVsID0gcERzdFZMQ0luZm8tPmlMZXZlbHM7CisgICAgcFJ1biA9IHBEc3RWTENJbmZvLT51UnVuczsKKyAgICBSdW5CZWZvcmUgPSAwOworCisgICAgLyogSGFuZGxlIGZpcnN0IG5vbiB6ZXJvIHNlcGFyYXRlICovCisgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKKyAgICBWYWx1ZSA9IEJ1ZiBbaV07CisgICAgaWYgKFZhbHVlID09IDEgfHwgVmFsdWUgPT0gLTEpCisgICAgeworICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKKyAgICAgICAgCisgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAorICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKKyAgICAgICAgTWFzayA+Pj0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gKFZhbHVlID4gMCA/IDEgOiAtMSk7CisgICAgICAgICpwTGV2ZWwrKyA9IFZhbHVlOworICAgICAgICBNYXNrID0gMDsKKyAgICB9CisKKyAgICAvKiBSZW1haW5pbmcgbm9uIHplcm8gKi8KKyAgICB3aGlsZSAoLS1pID49IDApCisgICAgeworICAgICAgICBWYWx1ZSA9IEJ1ZiBbaV07CisgICAgICAgIGlmIChWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKKworICAgICAgICAgICAgLyogTWFzayBiZWNvbWVzIHplcm8gYWZ0ZXIgZW50ZXJpbmcgKi8KKyAgICAgICAgICAgIGlmIChNYXNrICYmCisgICAgICAgICAgICAgICAgKFZhbHVlID09IDEgfHwgCisgICAgICAgICAgICAgICAgIFZhbHVlID09IC0xKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyB8PSAKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKKyAgICAgICAgICAgICAgICBNYXNrID4+PSAxOworICAgICAgICAgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7CisgICAgICAgICAgICAgICAgUnVuQmVmb3JlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiAzIHRyYWlsaW5nIG9uZXMgYXJlIG5vdCBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoTWFzaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7CisgICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKKyAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zKys7CisgICAgICAgICAgICBSdW5CZWZvcmUrKzsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qIFVwZGF0ZSBsYXN0IHJ1biAqLworICAgIGlmIChSdW5CZWZvcmUpCisgICAgeworICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjRkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jaworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKKyAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGguIAorICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggIT0gMikgJiYgKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSAyKSAmJiAocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAyKSAmJiBhcm1Ob3QyQnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKKyAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGJlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEhhbGYgaG9yaXpvbnRhbCBsdW1hIGludGVycG9sYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAorICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAorICogICAgICAgICAgICAoLTEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAorICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdExlZnQsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0UmlnaHQsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsgICAgCisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RSaWdodCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDQpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA4KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gMTYpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZigoaVdpZHRoICE9IDE2KSAmJiAoaVdpZHRoICE9IDgpJiYgKGlXaWR0aCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAorICAgICAgICBwU3JjIC0gMSwgICAgIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RMZWZ0LCAgICAgCisgICAgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgaVdpZHRoLCAgIAorICAgICAgICBpSGVpZ2h0KTsKKworICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJldFZhbHVlOworICAgIH0KKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgICAgIHBTcmMsICAgICAKKyAgICAgICAgaVNyY1N0ZXAsIAorICAgICAgICBwRHN0UmlnaHQsICAgICAKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsICAgCisgICAgICAgIGlIZWlnaHQpOworCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjBmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCisgKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCisgICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCisgICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAorICAgICBPTVhfVTgqICAgIHBEc3RVcCwgCisgICAgIE9NWF9VOCogICAgcERzdERvd24sIAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsIAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFVwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3REb3duID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0VXApICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0VXApICYmCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAorICAgICAgICBwU3JjIC0gaVNyY1N0ZXAsIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RVcCwKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsIAorICAgICAgICBpSGVpZ2h0KTsKKyAgICAKKyAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKKyAgICB7CisgICAgICAgIHJldHVybiBSZXRWYWx1ZTsKKyAgICB9CisKKyAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKKyAgICAgICAgcFNyYywgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdERvd24sCisgICAgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgaVdpZHRoLCAKKyAgICAgICAgaUhlaWdodCk7CisgICAgCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzMzczNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKQEAgLTAsMCArMSw5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiAKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAorICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAorICogICBkc3RTdGVwIC1kZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGggCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKKyAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCisgKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pICAgICAgICAKKyApCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpICYmIChyb2kud2lkdGggIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSAmJiAocm9pLmhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAxNikgJiYgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hIAorICAgICAgICAocFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiYTAzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDICAKKyAqIGNvZWZmaWNpZW50cyBhbmQgcXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDKAorCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAorCU9NWF9TMTYqCXBEc3QsCisJT01YX1UzMgkJaVFQCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtWzJdWzJdOworICAgIE9NWF9TMzIgICAgIFFQZXIsIFYwMCwgVmFsdWU7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCisgICAgbVswXVswXSA9IHBTcmNbMF0gKyBwU3JjWzFdICsgIHBTcmNbMl0gKyBwU3JjWzNdOworICAgIG1bMF1bMV0gPSBwU3JjWzBdIC0gcFNyY1sxXSArICBwU3JjWzJdIC0gcFNyY1szXTsKKyAgICBtWzFdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gLSAgcFNyY1syXSAtIHBTcmNbM107CisgICAgbVsxXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdIC0gIHBTcmNbMl0gKyBwU3JjWzNdOworCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgLyogU2NhbGluZyAqLworICAgIFFQZXIgPSBpUVAgLyA2OworICAgIFYwMCA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQZXIgPCAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gKG1bal1baV0gKiBWMDApID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPDwgKFFQZXIgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcERzdFtqICogMiArIGldID0gKE9NWF9TMTYpIFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMTIwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDKAkKKwljb25zdCBPTVhfUzE2KiAJcFNyYywKKwlPTVhfUzE2KglwRHN0LAorCU9NWF9VMzIJCWlRUAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdLCBWYWx1ZTsKKyAgICBPTVhfUzMyICAgICBRUGVyLCBWOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIEludiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIERDIEx1bWEgNHg0IGJsb2NrICovCisgICAgLyogSG9yaXpvbnRhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBqID0gaSAqIDQ7CisgICAgICAgIAorICAgICAgICBtMVtpXVswXSA9IHBTcmNbaiArIDBdICsgcFNyY1tqICsgMl07IC8qIGErYyAqLworICAgICAgICBtMVtpXVsxXSA9IHBTcmNbaiArIDFdICsgcFNyY1tqICsgM107IC8qIGIrZCAqLworICAgICAgICBtMVtpXVsyXSA9IHBTcmNbaiArIDBdIC0gcFNyY1tqICsgMl07IC8qIGEtYyAqLworICAgICAgICBtMVtpXVszXSA9IHBTcmNbaiArIDFdIC0gcFNyY1tqICsgM107IC8qIGItZCAqLworCisgICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLworICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KKyAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCisgICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLworCisgICAgfQorCisgICAgLyogVmVydGljYWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOworICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07CisgICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKKyAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOworCisgICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKKyAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOworICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07CisgICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKKyAgICB9CisKKyAgICAKKyAgICAvKiBTY2FsaW5nICovCisgICAgUVBlciA9IGlRUCAvIDY7CisgICAgViA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQZXIgPCAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gKG0yW2pdW2ldICogViArICgxIDw8ICgxIC0gUVBlcikpKSA+PiAoMiAtIFFQZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gbTJbal1baV0gKiBWICogKDEgPDwgKFFQZXIgLSAyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSBWYWx1ZTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW52ZXJzZSBpbnRlZ2VyIDR4NCB0cmFuc2Zvcm0KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCisgKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCisgKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAorICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBtYXRyaXguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQoCisJY29uc3QgT01YX1U4KiAJcFNyY1ByZWQsIAorCWNvbnN0IE9NWF9TMTYqIAlwRGVxdWFudENvZWZmLCAKKwlPTVhfVTgqIAlwRHN0UmVjb24sCisJT01YX1UzMiAJaVNyY1ByZWRTdGVwLCAKKwlPTVhfVTMyCQlpRHN0UmVjb25TdGVwLCAKKwlPTVhfVTgJCWJBQworKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MxNiAgICAgSW5bMTZdLCBPdXRbMTZdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERlcXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERlcXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RSZWNvbiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJlY29uKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAgfHwgaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaURzdFJlY29uU3RlcCA9PSAwIHx8IGlEc3RSZWNvblN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGlmIChiQUMpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSW5baV0gPSBwRGVxdWFudENvZWZmIFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDb3B5IERDICovCisgICAgICAgIEluWzBdID0gcERlcXVhbnRDb2VmZiBbMF07CisgICAgCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBJbltpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KKyAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChPdXQsIEluKTsgICAgCisgICAgCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFkZCBwcmVkaXRpb24gKi8KKyAgICAgICAgICAgIFZhbHVlID0gKE9NWF9TMzIpIE91dCBbaiAqIDQgKyBpXSArIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFNhdHVyYXRlIFZhbHVlIHRvIE9NWF9VOCAqLworICAgICAgICAgICAgVmFsdWUgPSBhcm1DbGlwICgwLCAyNTUsIFZhbHVlKTsKKworICAgICAgICAgICAgcERzdFJlY29uW2ogKiBpRHN0UmVjb25TdGVwICsgaV0gPSAoT01YX1U4KSBWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYTVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKKyAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAorICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCisgICAgKQoreworICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighcFNpemUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgICAgICAgIAorICAgICpwU2l6ZSA9IChPTVhfSU5UKSBzaXplb2YoQVJNVkNNNFAxMF9NRVNwZWMpOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlY2M4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKQEAgLTAsMCArMSw5MiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTUVJbml0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAorICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAorICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCisgKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAorICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCisgKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAorICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKKyAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQoCisgICAgICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAorICAgICAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICAgICAgdm9pZCAqcE1FU3BlYworICAgICAgICkKK3sKKyAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFwTUVTcGVjLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmIAorICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYgPD0gMCkgfHwgCisgICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDggPD0gMCkgfHwgCisgICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQgPD0gMCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU4eDggPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU4eDg7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ibG9ja1NwbGl0RW5hYmxlNHg0ID0gcE1FUGFyYW1zLT5ibG9ja1NwbGl0RW5hYmxlNHg0OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlNlYXJjaEVuYWJsZSAgICA9IHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnF1YXJ0ZXJTZWFyY2hFbmFibGUgPSBwTUVQYXJhbXMtPnF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5pbnRyYUVuYWJsZTR4NCAgICAgID0gcE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NDsgICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNiAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNjsgICAKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4ICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQgICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQ7CisgICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkYmYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKQEAgLTAsMCArMSwxODkyIEBACisvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIE1CIGxldmVsIG1vdGlvbiBlc3RpbWF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9GUkFNRVMgICAgICgxNSkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF80eDRfU0FECQkoMHhmZmZmKQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUUgICAgICgweGZmZmZmZmZmKQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX01PREVTICAgICAgICAgICgxNikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01CX0JMT0NLX1NJWkUgICAgICAoMTYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NRURJQU4oYSxiLGMpICAgICAgKGE+Yj9hPmM/Yj5jP2I6YzphOmI+Yz9hPmM/YTpjOmIpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9TSElGVF9RUCAgICAgICAgICAgKDEyKQorCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOICAgICAgKDApCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfTCAgICAgICAgICAgKDEpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVSAgICAgICAgICAgKDIpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NVlBSRURfVVIgICAgICAgICAgKDMpCisKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICAoMTYpCisjZGVmaW5lIEFSTV9WQ000UDEwX0JMT0NLX1NJWkUgICAgICAgICAgKDQpCisjZGVmaW5lIEFSTV9WQ000UDEwX01BWF9DT1NUICAgICAgICAgICAgKDEgPDwgMzApCisjZGVmaW5lICBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLICAgICAgKC0yKQorCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIENhbGN1bGF0ZSBTQUQgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBNQiBlbmNvZGluZyBtb2RlIGFuZCB1cGRhdGUgCisgKiBwRHN0QmxvY2tTQUQgcGFyYW1ldGVyLiBUaGVzZSBTQUQgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIDR4NCBibG9ja3MgYXQKKyAqIGEgdGltZSBhbmQgaW4gdGhlIHNjYW4gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjTUJJbmZvICAgIC0gCisgKiBbaW5dIHBTcmNDdXJyQnVmICAgLSAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgICAtIAorICogW2luXSBwU3JjUmVmQnVmTGlzdC0gCisgKiBbaW5dIFNyY1JlZlN0ZXAgICAgLSAKKyAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIAorICogW2luXSBTcmNSZWNTdGVwICAgIC0gCisgKiBbaW5dIHBSZWZSZWN0ICAgICAgLSAKKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAtIAorICogW2luXSBMYW1iZGEgICAgICAgIC0gCisgKiBbaW5dIHBNRVNwZWMgICAgICAgLSAKKyAqIFtpbl0gcE1CSW50ZXIgICAgICAtIAorICogW2luXSBwTUJJbnRyYSAgICAgIC0gCisgKiBbb3V0XSBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIDE2IGVsZW1lbnQgYXJyYXkgZm9yIFNBRCBjb3JyZXNwb25kaW5nIHRvIDR4NCBibG9ja3MKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAorCU9NWFZDTTRQMTBNQkluZm8gKnBTcmNNQkluZm8sIAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCisJT01YX1MzMiBTcmNSZWZTdGVwLAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwgCisJT01YX1MzMiBTcmNSZWNTdGVwLAorCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorCU9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKK3sKKwlPTVhfSU5UCQlJbnZhbGlkU0FEID0gMDsKKwlPTVhfSU5UCQlpOworCisJT01YX1U4CQlCdWZmZXIgWzE2KjE2ICsgMTVdOworCU9NWF9VOAkJKnBUZW1wRHN0QnVmOworCU9NWF9TMzIJCVRlbXBEc3RTdGVwOworCU9NWF9VOAkJKnBUZW1wUmVmQnVmOworCU9NWF9TMzIJCVRlbXBSZWZTdGVwOyAKKworCS8qIFRlbXBvcmFyeSBidWZmZXIgdG8gc3RvcmUgdGhlIHByZWRpY3RlZCBtYiBjb2VmZmljaWVudHMgKi8KKwlwVGVtcERzdEJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKEJ1ZmZlcik7CisJVGVtcERzdFN0ZXAgPSAxNjsKKworCS8qIFVwZGF0ZSBwRHN0QmxvY2tTQUQgaWYgTUIgaXMgYSB2YWxpZCB0eXBlICovCisJaWYgKHBTcmNNQkluZm8pCisJeworCSAgICBPTVhfVTMyICAgICBXaWR0aD0wLCBIZWlnaHQ9MCwgTWF4WFBhcnQsIE1heFlQYXJ0LE1heFN1YlhQYXJ0LE1heFN1YllQYXJ0OworCSAgICAKKwkJLyogRGVwZW5kaW5nIG9uIHR5cGUgb2YgTUIsIGRvIHByZWRpY3Rpb24gYW5kIGZpbGwgdGVtcCBidWZmZXIgKi8KKwkJc3dpdGNoIChwU3JjTUJJbmZvLT5tYlR5cGUpCisJCXsKKwkJY2FzZSBPTVhfVkNfUF8xNngxNjoKKwkJCQlXaWR0aCA9IDE2OworCQkJCUhlaWdodCA9IDE2OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzE2eDg6CisJCQkJV2lkdGggPSAxNjsKKwkJCQlIZWlnaHQgPSA4OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzh4MTY6CisJCQkJV2lkdGggPSA4OworCQkJCUhlaWdodCA9IDE2OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19QXzh4ODoKKwkJCQlXaWR0aCA9IDg7CisJCQkJSGVpZ2h0ID0gODsKKwkJCQlicmVhazsKKwkJY2FzZSBPTVhfVkNfSU5UUkFfNHg0OgorCQkJeworCQkJCS8qIENyZWF0ZSBwcmVkaWN0ZWQgTUIgSW50cmE0eDQgbW9kZSAqLworCQkJCU9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOworCQkJCU9NWF9TMzIJCXgsIHksIEJsb2NrOHg4LCBCbG9jazR4NCwgQmxvY2tYLCBCbG9ja1k7CisJCQkJT01YX1U4ICAgICAgcFNyY1lCdWZmIFsoMTYqMykqKDE2KjIpXTsKKwkJCQlPTVhfVTgJCSpwU3JjWTsKKwkJCQlPTVhfUzMyICAgICBTdGVwU3JjWTsKKwkJCQlPTVhfUzMyCQlhdmFpbGFiaWxpdHk7CisKKwkJCQlmb3IgKHkgPSAwOyB5IDwgNTsgeSsrKQorCQkJCXsKKwkJCQkJZm9yICh4ID0gMDsgeCA8IDk7IHgrKykKKwkJCQkJeworCQkJCQkJLyogCisJCQkJCQkgKiBJbml0aWFsaXplIHdpdGggdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSywgdG8gbWVhbiB0aGlzIAorCQkJCQkJICogNHg0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgCisJCQkJCQkgKi8KKwkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFJlcGxhY2UgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB2YWx1ZSB3aXRoIGF2YWlsYWJsZSBNQnMgdmFsdWVzKi8KKwkJCQlmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGIwLCBiMSwgYjIsIGIzICovCisJCQkJCWlmIChwTUJJbnRyYVsxXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgMV0gPSAKKwkJCQkJCQlwTUJJbnRyYVsxXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07ICAgICAgICAgICAgCisJCQkJCX0KKwkJCSAgICAgICAgCisJCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBkMCwgZDEsIGQyLCBkMyAqLworCQkJCQlpZiAocE1CSW50cmFbM10gIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDVdID0gCisJCQkJCQkJcE1CSW50cmFbM10tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOworCQkJCQl9CisJCQkJfQorCQkgICAgCisJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCisJCQkJaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCisJCQkJeworCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07CisJCQkJfQorCQkgICAgCisJCQkJZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKwkJCQl7CisJCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLworCQkJCQlpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCisJCQkJCQkJcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOworCQkJCQl9CisJCQkJfQorCQkgICAgICAgIAorCQkJCS8qCisJCQkJICogVXBkYXRlIG5laWdoYm91cmluZyBQcmVkIG1vZGUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgorCQkJCSAqIHByZWRpY3Rpb24gb2YgSW50cmE0eDQgbW9kZXMuCisJCQkJICovCisJCQkgICAgCisJCQkJcFNyY1kgPSBwU3JjWUJ1ZmY7CisJCQkJU3RlcFNyY1kgPSAxNiAqIDM7CisJCQkJZm9yICh5ID0gMDsgeSA8ICgxNiAqIDIpOyB5KyspCisJCQkJeworCQkJCQlmb3IgKHggPSAwOyB4IDwgKDE2ICogMyk7IHgrKykKKwkJCQkJeworCQkJCQkJcFNyY1kgW1N0ZXBTcmNZICogeSArIHhdID0gCisJCQkJCQkJcFNyY1JlY0J1ZiBbU3JjUmVjU3RlcCAqICh5IC0gMTYpICsgeCAtIDE2XTsKKwkJCQkJfQorCQkJCX0KKworCQkgICAgCisJCQkJLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCisJCQkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKwkJCQl7CisJCQkJCS8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCisJCQkJCWZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCisJCQkJCXsKKwkJCQkJCS8qIEdldCBibG9jayBjb3JkaW5hdGVzIGZyb20gOHg4IGJsb2NrIGluZGV4IGFuZCA0eDQgYmxvY2sgaW5kZXggKi8KKwkJCQkJCUJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOworCQkJCQkJQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKKwkJCQkJICAgIAorCQkJCQkJLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLworCQkJCQkJeCA9IEJsb2NrWCArIDE7CisJCQkJCQl5ID0gQmxvY2tZICsgMTsKKworCQkJCQkJYXZhaWxhYmlsaXR5ID0gMDsKKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCisJCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisJCQkJCQl7CisJCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisJCQkJCQl9CisKKwkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KKwkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5IC0gMV1beF0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisJCQkJCQl9CisKKwkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLworCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdOworCQkJCQkJeCA9IEJsb2NrWCAqIDQ7CisJCQkJCQl5ID0gQmxvY2tZICogNDsKKworCQkJCQkJcFNyY1kgPSBwU3JjWUJ1ZmYgKyAxNiAqIFN0ZXBTcmNZICsgMTYgKyB5ICogU3RlcFNyY1kgKyB4OworCisJCQkJCQlvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisJCQkJCQkJIHBTcmNZIC0gMSwKKwkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSwKKwkJCQkJCQkgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCisJCQkJCQkJIHBUZW1wRHN0QnVmICsgeCArIHkgKiBUZW1wRHN0U3RlcCwKKwkJCQkJCQkgU3RlcFNyY1ksCisJCQkJCQkJIFRlbXBEc3RTdGVwLAorCQkJCQkJCSBwU3JjTUJJbmZvLT5wSW50cmE0eDRQcmVkTW9kZVtCbG9ja1kqNCtCbG9ja1hdLAorCQkJCQkJCSBhdmFpbGFiaWxpdHkpOworCisJCQkJCQlmb3IgKEJsb2NrWT0wO0Jsb2NrWTw0O0Jsb2NrWSsrKQorCQkJCQkJeworCQkJCQkJCWZvcihCbG9ja1g9MDtCbG9ja1g8NDtCbG9ja1grKykKKwkJCQkJCQl7CisJCQkJCQkJCXBTcmNZIFtCbG9ja1kgKiBTdGVwU3JjWSArIEJsb2NrWF0gPSAKKwkJCQkJCQkJCShPTVhfVTgpKCoocFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwICsgQmxvY2tZICogVGVtcERzdFN0ZXAgKyBCbG9ja1gpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBPTVhfVkNfSU5UUkFfMTZ4MTY6CisJCQl7CisJCQkJT01YX1UzMiAgICAgTUJQb3NYID0gcEN1cnJQb2ludFBvcy0+eCA+PiA0OyAgICAgICAgCisJCQkJT01YX1UzMiAgICAgTUJQb3NZID0gcEN1cnJQb2ludFBvcy0+eSA+PiA0OyAgICAgICAgCisJCQkJT01YX1UzMgkJYXZhaWxhYmlsaXR5ID0gMDsKKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBNQiAqLworCQkJCWlmICgoTUJQb3NYICE9IDApICYmIChwTUJJbnRyYSBbMF0gIT0gMCB8fCBwTUJJbnRlciBbMF0gIT0gMCkpCisJCQkJeworCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKKwkJCQl9CisKKwkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQIE1CICovCisJCQkJaWYgKChNQlBvc1kgIT0gMCkgJiYgKHBNQkludHJhIFsxXSAhPSAwIHx8IHBNQkludGVyIFsxXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKKwkJCQl9CisKKwkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQLUxFRlQgTUIgKi8KKwkJCQlpZiAoKE1CUG9zWCA+IDApICYmIChNQlBvc1kgPiAwKSAmJiAKKwkJCQkJKHBNQkludHJhIFsyXSAhPSAwIHx8IHBNQkludGVyIFsyXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAorCQkJCX0KKworCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorCQkJCQkJcFNyY1JlY0J1ZiAtIDEsIAorCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAsIAorCQkJCQkJcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKKwkJCQkJCXBUZW1wRHN0QnVmLCAKKwkJCQkJCVNyY1JlY1N0ZXAsIAorCQkJCQkJVGVtcERzdFN0ZXAsIAorCQkJCQkJcFNyY01CSW5mby0+SW50cmExNngxNlByZWRNb2RlLCAKKwkJCQkJCWF2YWlsYWJpbGl0eSk7CisJCQkJCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBPTVhfVkNfSU5URVJfU0tJUDoKKwkJY2FzZSBPTVhfVkNfUFJFRjBfOHg4OgorCQljYXNlIE9NWF9WQ19JTlRSQV9QQ006CisJCWRlZmF1bHQ6CisJCQkvKiBUaGVzZSBjYXNlcyB3aWxsIHVwZGF0ZSBwRHN0QmxvY2tTQUQgd2l0aCBNQVggdmFsdWUgKi8KKwkJCUludmFsaWRTQUQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJTlRFUiBNQiAqLworCQlpZiAoKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNngxNikgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHgxNikgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfMTZ4OCkgfHwKKwkJCShwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfOHg4KSkKKwkJeworICAgICAgICAJY29uc3QgT01YX1U4CQkqcFRlbXBTcmNCdWY7CisgICAgICAgIAlPTVhfUzMyCQlUZW1wU3JjU3RlcDsKKyAgICAgICAgCU9NWF9TMzIJCW12eCxtdnk7CisgICAgICAgIAlPTVhfVTMyCQlQYXJ0WCwgUGFydFksIFN1YlBhcnRYLCBTdWJQYXJ0WTsKKyAgICAgICAgCQorCQkJVGVtcFNyY1N0ZXAgPSBTcmNSZWZTdGVwOworCisJCQlNYXhYUGFydCA9IDE2L1dpZHRoOworCQkJTWF4WVBhcnQgPSAxNi9IZWlnaHQ7CisKKworCQkJZm9yIChQYXJ0WSA9IDA7IFBhcnRZIDwgTWF4WVBhcnQ7IFBhcnRZKyspCisJCQl7CisJCQkJZm9yIChQYXJ0WCA9IDA7IFBhcnRYIDwgTWF4WFBhcnQ7IFBhcnRYKyspCisJCQkJeworCisJCQkJCXBUZW1wU3JjQnVmID0gcFNyY1JlZkJ1Zkxpc3RbcFNyY01CSW5mby0+cFJlZkwwSWR4W1BhcnRZICogMiArIFBhcnRYXV07CisKKwkJCQkJaWYgKE1heFhQYXJ0ID09IDIgJiYgTWF4WVBhcnQgPT0gMikKKwkJCQkJeworICAgICAgICAJCQkJc3dpdGNoIChwU3JjTUJJbmZvLT5zdWJNQlR5cGVbUGFydFkqMitQYXJ0WF0pCisgICAgICAgIAkJCQl7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg4OgorCQkJCQkJCQlXaWR0aCA9IDg7CisJCQkJCQkJCUhlaWdodCA9IDg7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzh4NDoKKwkJCQkJCQkJV2lkdGggPSA4OworCQkJCQkJCQlIZWlnaHQgPSA0OworICAgICAgICAgICAgCQkJCSAgICBicmVhazsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDg6CisJCQkJCQkJCVdpZHRoID0gNDsKKwkJCQkJCQkJSGVpZ2h0ID0gODsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfNHg0OgorCQkJCQkJCQlXaWR0aCA9IDQ7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGRlZmF1bHQ6CisJCQkJCQkJCS8qIERlZmF1bHQgKi8KKwkJCQkJCQkJV2lkdGggPSA0OworCQkJCQkJCQlIZWlnaHQgPSA0OworICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJfQorCQkJCQkKKyAgICAJCQkJICAgIE1heFN1YlhQYXJ0ID0gOC9XaWR0aDsKKyAgICAJCQkJICAgIE1heFN1YllQYXJ0ID0gOC9IZWlnaHQ7CisKKwkJCQkJCWZvciAoU3ViUGFydFkgPSAwOyBTdWJQYXJ0WSA8IE1heFN1YllQYXJ0OyBTdWJQYXJ0WSsrKQorCQkJCQkJeworCQkJCQkJCWZvciAoU3ViUGFydFggPSAwOyBTdWJQYXJ0WCA8IE1heFN1YlhQYXJ0OyBTdWJQYXJ0WCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJbXZ4ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WSArIFN1YlBhcnRZXVsyKlBhcnRYICsgU3ViUGFydFhdLmR4OworCQkJCQkJCQltdnkgPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHk7CisJCQkJCQkJCWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKwkJCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYICsgKG12eC80KSkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAorCQkJCQkJCQkJVGVtcFNyY1N0ZXAsCisJCQkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYICsgNCpTdWJQYXJ0WCkgKyAoOCpQYXJ0WSArIDQqU3ViUGFydFkpICogVGVtcERzdFN0ZXAsCisJCQkJCQkJCQlUZW1wRHN0U3RlcCwKKwkJCQkJCQkJCVdpZHRoLAorCQkJCQkJCQkJSGVpZ2h0LAorCQkJCQkJCQkJbXZ4ICYgMywKKwkJCQkJCQkJCW12eSAmIDMKKwkJCQkJCQkJCSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCisJCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZXVsyKlBhcnRYXS5keDsKKwkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR5OworCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorCQkJCQkJCXBUZW1wU3JjQnVmICsgKDgqUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgKG12eS80KSkgKiBUZW1wU3JjU3RlcCwKKwkJCQkJCQlUZW1wU3JjU3RlcCwKKwkJCQkJCQlwVGVtcERzdEJ1ZiArICg4KlBhcnRYKSArICg4KlBhcnRZKSAqIFRlbXBEc3RTdGVwLAorCQkJCQkJCVRlbXBEc3RTdGVwLAorCQkJCQkJCVdpZHRoLAorCQkJCQkJCUhlaWdodCwKKwkJCQkJCQltdnggJiAzLAorCQkJCQkJCW12eSAmIDMKKwkJCQkJCQkpOworCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJSW52YWxpZFNBRCA9IDE7CisJfQorCisJLyogQ2FsY3VsYXRlIFNBRCBmcm9tIHByZWRpY3RlZCBidWZmZXIgKi8KKwlpZiAoIUludmFsaWRTQUQpCisJeworCSAgICBPTVhfVTMyICAgICB4OHg4LCB5OHg4LCB4NHg0LCB5NHg0LCBCbG9jazh4OCwgQmxvY2s0eDQ7CisJICAgIE9NWF9TMzIgICAgIFNBRDsKKwkgICAgCisJCXBUZW1wUmVmQnVmID0gcFRlbXBEc3RCdWY7CisJCVRlbXBSZWZTdGVwID0gMTY7CisKKwkJLyogU0FEIGZvciBlYWNoIDR4NCBibG9jayBpbiBzY2FuIG9yZGVyICovCisJCWZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisJCXsKKwkJCXg4eDggPSA4KihCbG9jazh4OCAmIDEpOworCQkJeTh4OCA9IDgqKEJsb2NrOHg4ID4+IDEpOworCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKKwkJCXsKKwkJCQl4NHg0ID0gNCooQmxvY2s0eDQgJiAxKTsKKwkJCQl5NHg0ID0gNCooQmxvY2s0eDQgPj4gMSk7CisKKwkJCQlhcm1WQ0NPTU1fU0FEKAkKKwkJCQkJcFNyY0N1cnJCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFNyY0N1cnJTdGVwLCAKKwkJCQkJU3JjQ3VyclN0ZXAsCisJCQkJCXBUZW1wUmVmQnVmICsgKHg4eDggKyB4NHg0KSArICh5OHg4ICsgeTR4NCkgKiBUZW1wUmVmU3RlcCwKKwkJCQkJVGVtcFJlZlN0ZXAsCisgICAgCQkJCSZTQUQsCisgICAgCQkJCTQsIC8qIEhlaWdodCAqLworICAgIAkJCQk0KTsgLyogV2lkdGggKi8KKyAgICAgICAgICAgICAgICAqKHBEc3RCbG9ja1NBRCArIDQgKiBCbG9jazh4OCArIEJsb2NrNHg0KSA9IChTQUQgPCAweDdmZmYpID8gKE9NWF9VMTYpIFNBRCA6IEFSTV9WQ000UDEwX01BWF9NT0RFX1ZBTFVFOyAgIAkJCSAgICAKKyAJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyogRmlsbCBTQURzIHdpdGggbWF4IHZhbHVlcyBhbmQgcmV0dXJuKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCXBEc3RCbG9ja1NBRCBbaV0gPSBBUk1fVkNNNFAxMF9NQVhfNHg0X1NBRDsKKwkJfQorCX0KKwlyZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBJbnRyYSA0eDQgTW9kZSBkZWNpc2lvbiBieSBjYWxjdWxhdGluZyBjb3N0IGZvciBhbGwgcG9zc2libGUgbW9kZXMgYW5kCisgKiBjaG9vc2luZyB0aGUgYmVzdCBtb2RlCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgTWFjcm9ibG9jaworICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZgorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdGhlIE9NWFZDTTRQMTBNQkluZm8gd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgIGZpZWxkIHBJbnRyYTR4NFByZWRNb2RlIG9mIHRoZSBjdXJyZW50IGJsb2NrLgorICogW2luXSBCbG9jazh4OCAgICAtIEluZGV4IDh4OCBibG9jayBpbiB3aGljaCBjdXJyZW50IDR4NCBibG9jayBiZWxvbmdzCisgKiBbaW5dIEJsb2NrNHg0ICAgIC0gSW5kZXggb2YgY3VycmVudCA0eDQgYmxvY2sKKyAqIFtpbi9vdXRdIHBQcmVkSW50cmE0eDRTcmNZIC0gUG9pbnRlciB0byBjdXJyZW50IGJsb2NrIGxvY2F0aW9uIGluIGJ1ZmZlciAKKyAqICAgICAgICAgICAgICAgICAgICB3aXRoIHJlY29uc3RydWN0ZWQgdmFsdWVzLiBUaGlzIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhpcworICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggYmVzdCBtb2RlIHByZWRpY3RlZCB2YWx1ZXMgCisgKiBbaW5dIFN0ZXBQcmVkSW50cmE0eDRTcmNZICAtIFN0ZXAgc2l6ZSBvZiB0aGUgcG9pbnRlciBwUHJlZEludHJhNHg0U3JjWQorICogW2luXSBwSW50cmE0eDRQcmVkTW9kZSAgICAgLSBBcnJheSBvZiBJbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciB0aGUgTUIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgTUIgbW9kZXMgc3RhcnRzIGF0IFsxLDFdLgorICogW2luXSBwQmVzdENvc3QgICAtIENvc3QgZm9yIHRoZSBCZXN0IEludHJhIDR4NCBtb2RlCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1MzMiBCbG9jazh4OCwKKyAgICBPTVhfUzMyIEJsb2NrNHg0LAorICAgIE9NWF9VOCAgKnBQcmVkSW50cmE0eDRTcmNZLAorICAgIE9NWF9TMzIgU3RlcFByZWRJbnRyYTR4NFNyY1ksCisgICAgT01YX1MzMiBwSW50cmE0eDRQcmVkTW9kZSBbXVs5XSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QKKykKK3sKKyAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBCbG9ja1gsIEJsb2NrWSwgbW9kZTsKKyAgICBPTVhfUzMyICAgICBDb3N0LCBCZXN0Q29zdDsKKyAgICBPTVhfVTggICAgICAqcFNyY1k7CisgICAgT01YX1MzMiAgICAgU3RlcFNyY1k7CisgICAgT01YX1MzMiAgICAgYXZhaWxhYmlsaXR5ID0gMDsKKyAgICBPTVhfVTggICAgICBwUHJlZEJsb2NrIFs0KjRdOworICAgIE9NWFJlc3VsdCAgIFJldCA9IE9NWF9TdHNfRXJyOworCisgICAgLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLworICAgIEJsb2NrWCA9ICgoQmxvY2s4eDggJiAxKSA8PCAxKSArIChCbG9jazR4NCAmIDEpOworICAgIEJsb2NrWSA9ICgoQmxvY2s4eDggPj4gMSkgPDwgMSkgKyAoQmxvY2s0eDQgPj4gMSk7CisgICAgCisgICAgLyogQWRkIG9mZnNldCB0byBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IE1CIGluIHRoZSBhcnJheSBwSW50cmE0eDRQcmVkTW9kZSAqLworICAgIHggPSBCbG9ja1ggKyAxOworICAgIHkgPSBCbG9ja1kgKyAxOworCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIEJsb2NrICovCisgICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgQmxvY2sgKi8KKyAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVBQRVIgTEVGVCBCbG9jayAqLworICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgcFNyY1kgPSBwUHJlZEludHJhNHg0U3JjWSArIAorICAgICAgICAgICAgU3RlcFByZWRJbnRyYTR4NFNyY1kgKiAoQmxvY2tZIDw8IDIpICsgCisgICAgICAgICAgICAoQmxvY2tYIDw8IDIpOworICAgICAgICAgICAgCisgICAgU3RlcFNyY1kgPSBTdGVwUHJlZEludHJhNHg0U3JjWTsKKyAgICAgICAgICAgICAgCisgICAgeCA9IEJsb2NrWCAqIDQ7CisgICAgeSA9IEJsb2NrWSAqIDQ7CisKKyAgICBDb3N0ID0gQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAKKyAgICAvKiBHbyB0aHJvdWdoIGVhY2ggbW9kZSBmb3IgbWluaW0gY29zdCAqLworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCA5OyBtb2RlKyspCisgICAgeworICAgICAgICBSZXQgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisgICAgICAgICAgICAgcFNyY1kgLSAxLAorICAgICAgICAgICAgIHBTcmNZIC0gU3RlcFNyY1ksCisgICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSAtIDEsCisgICAgICAgICAgICAgcFByZWRCbG9jaywKKyAgICAgICAgICAgICBTdGVwU3JjWSwKKyAgICAgICAgICAgICA0LAorICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZSwKKyAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOworICAgICAgICAgICAgIAorICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoICAgIAorICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgKHkgKiBTcmNDdXJyU3RlcCkgKyB4LAorICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAorICAgICAgICAgICAgICAgIHBQcmVkQmxvY2ssCisgICAgICAgICAgICAgICAgNCwKKyAgICAgICAgICAgICAgICAmQ29zdCwKKyAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgIDQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQ29zdCA8IEJlc3RDb3N0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICsgMV1bQmxvY2tYICsgMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wSW50cmE0eDRQcmVkTW9kZSBbQmxvY2tZICogNCArIEJsb2NrWF0gPSAKKyAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIGogKyBpXSA9IHBQcmVkQmxvY2sgWzQgKiBqICsgaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcEJlc3RDb3N0ID0gQmVzdENvc3Q7CisgICAgcmV0dXJuOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRvIHRoZSBNViBQcmVkaWN0aW9uIGZvciBJbnRlciBNQnMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBCbG9ja1N0YXJ0WCAtIFN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKKyAqIFtpbl0gQmxvY2tTdGFydFkgLSBTdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscyBpbiBjdXJyZW50IEJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVggIC0gV2lkdGggb2YgY3VycmVudCBibG9jaworICogW2luXSBCbG9ja1NpemVZICAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIFJlZkZyYW1lICAgIC0gSW5kZXggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgcHJlZGljdGlvbgorICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gUmVmIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbb3V0XSBwTVZQcmVkICAgIC0gUG9pbnRlciB0byBwcmVkaWN0ZWQgTVZzCisgKiBSZW1hcmtzOgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKAorICAgIE9NWF9VMzIgQmxvY2tTdGFydFgsIAorICAgIE9NWF9VMzIgQmxvY2tTdGFydFksCisgICAgT01YX1UzMiBCbG9ja1NpemV4LAorICAgIE9NWF9VMzIgQmxvY2tTaXpleSwKKyAgICBPTVhfUzMyIFJlZkZyYW1lLAorICAgIE9NWF9TMzIgcFJlZkZyQXJyW11bNl0sIAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFycltdWzEyXSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAorKQoreworICAgIE9NWF9TMzIgICAgIFJGcmFtZUw7ICAgICAgIC8qIExlZnQgKi8KKyAgICBPTVhfUzMyICAgICBSRnJhbWVVOyAgICAgICAvKiBVcCAqLworICAgIE9NWF9TMzIgICAgIFJGcmFtZVVSOyAgICAgIC8qIFVwLVJpZ2h0ICovCisKKyAgICBPTVhfUzMyICAgICBCbG9ja1gsIEJsb2NrWSwgQmxvY2tYRnIsIEJsb2NrWUZyLCBNVlByZWRUeXBlOworICAgIE9NWF9TMzIgICAgIEJsb2NrWFBsdXNPZmYsIEJsb2NrWFBsdXNPZmZGciwgQmxvY2tYTWluMUZyLCBCbG9ja1lNaW4xRnI7CisgICAgCisgICAgQmxvY2tYID0gNCArIChCbG9ja1N0YXJ0WCA+PiAyKTsKKyAgICBCbG9ja1kgPSA0ICsgKEJsb2NrU3RhcnRZID4+IDIpOyAKKyAgICBCbG9ja1hQbHVzT2ZmID0gQmxvY2tYICsgKEJsb2NrU2l6ZXggPj4gMik7CisgICAgCisgICAgQmxvY2tYRnIgPSBCbG9ja1ggPj4gMTsgIAorICAgIEJsb2NrWUZyID0gQmxvY2tZID4+IDE7ICAKKyAgICBCbG9ja1hNaW4xRnIgPSAoQmxvY2tYIC0gMSkgPj4gMTsgIAorICAgIEJsb2NrWU1pbjFGciA9IChCbG9ja1kgLSAxKSA+PiAxOyAgCisgICAgQmxvY2tYUGx1c09mZkZyID0gQmxvY2tYUGx1c09mZiA+PiAxOworICAgIAorICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOworCisgICAgUkZyYW1lTCA9IHBSZWZGckFyciBbQmxvY2tZRnJdW0Jsb2NrWE1pbjFGcl07CisgICAgUkZyYW1lVSA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hGcl07CisgICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXTsKKworICAgIGlmIChSRnJhbWVVUiA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgUkZyYW1lVVIgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBQcmVkaWN0aW9uIGlmIG9ubHkgb25lIG9mIHRoZSBuZWlnaGJvcnMgdXNlcyB0aGUgcmVmZXJlbmNlIGZyYW1lCisgICAgICogd2UgYXJlIGNoZWNraW5nCisgICAgICovCisgIAorICAgIGlmIChSRnJhbWVMID09IFJlZkZyYW1lICYmIFJGcmFtZVUgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCisgICAgeworICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgfQorICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVID09IFJlZkZyYW1lICYmIFJGcmFtZVVSICE9IFJlZkZyYW1lKQorICAgIHsKKyAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOworICAgIH0KKyAgICBlbHNlIGlmKFJGcmFtZUwgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiA9PSBSZWZGcmFtZSkKKyAgICB7CisgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7CisgICAgfQorCisgICAgLyogRGlyZWN0aW9uYWwgcHJlZGljdGlvbnMgICovCisgICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDggJiYgQmxvY2tTaXpleSA9PSAxNikKKyAgICB7CisgICAgICAgIGlmKEJsb2NrU3RhcnRYID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFJGcmFtZUwgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJGcmFtZVVSID09IFJlZkZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZihCbG9ja1NpemV4ID09IDE2ICYmIEJsb2NrU2l6ZXkgPT0gOCkKKyAgICB7CisgICAgICAgIGlmKEJsb2NrU3RhcnRZID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFJGcmFtZVUgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKE1WUHJlZFR5cGUpCisgICAgeworICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTjoKKyAgICAgICAgaWYgKCEocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWE1pbjFGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB8fCAKKyAgICAgICAgICAgICAgcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAorICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKSkKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7CisgICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gCisgICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keCwgCisgICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR4LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4KTsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gCisgICAgICAgICAgICAgICAgQVJNX1ZDTTRQMTBfTUVESUFOKHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keSwgCisgICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX0w6CisgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4OworICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfVToKKyAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHg7CisgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VUjoKKyAgICAgICAgaWYgKHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1ggLSAxXS5keTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBHZXRzIGJlc3QgTVYgZm9yIHRoZSBjdXJyZW50IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZlkgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luXSBuTGFtZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcEJlc3RDb3N0ICAtIE1pbmltdW0gY29zdCBmb3IgZW5jb2RpbmcgY3VycmVudCBibG9jayAKKyAqIFtvdXRdIHBCZXN0TVYgICAgLSBNViBjb3JyZXNwb25kaW5nIHRvIGJlc3QgY29zdAorICogW2luXSBCbG9ja1N0YXJ0WCAtIEJsb2NrIHN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzCisgKiBbaW5dIEJsb2NrU3RhcnRZIC0gQmxvY2sgc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KKyAqIFtpbl0gcE1WUHJlZCAgICAgLSBQb2ludGVyIHRvIE1WIHByZWRpY3RlZCBmcm9tIG5laWdoYm91ciBNVnMKKyAqIFJlbWFya3M6CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0CisgKgorICovCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2goCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwgCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkKiBwTUVTcGVjLCAKKworICAgIE9NWF9TMzIgbkxhbWRhLAorICAgIE9NWF9TMzIqIHBCZXN0Q29zdCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCisgICAgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZVgsCisgICAgT01YX1UzMiBCbG9ja1NpemVZLAorICAgIE9NWF9TMzIgUmVmRnJhbWUsCisgICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sIAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQKKyAgICkKK3sKKworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZDYWxjdWxhdGVkLCBNVkNhbmRpZGF0ZTsKKyAgICBPTVhfUzMyICAgICAgICAgICAgIENvc3Q7CisgICAgT01YUmVzdWx0ICAgICAgICAgICBSZXRWYWx1ZTsKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUVQYXJhbXM7ICAgIAorCU9NWFZDTTRQMkNvb3JkaW5hdGUgQ3VyckJsb2NrUG9zOworCisgICAgLyogR2V0IFByZWRpY3RlZCBNb3Rpb24gVmVjdG9ycyAqLworICAgIGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yICgKKyAgICAgICAgQmxvY2tTdGFydFgsIAorICAgICAgICBCbG9ja1N0YXJ0WSwKKyAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgIEJsb2NrU2l6ZVksCisgICAgICAgIFJlZkZyYW1lLAorICAgICAgICBwUmVmRnJBcnIsICAgCisgICAgICAgIHBNVkFyciwgICAgICAKKyAgICAgICAgcE1WUHJlZCk7CisKKyAgICAvKiBJbml0aWFsaXplIGNhbmRpZGF0ZSBNViAqLworICAgIE1WQ2FuZGlkYXRlLmR4ID0gMDsKKyAgICBNVkNhbmRpZGF0ZS5keSA9IDA7CisgICAgCisgICAgQ3VyckJsb2NrUG9zLnggPSBwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTdGFydFg7CisgICAgQ3VyckJsb2NrUG9zLnkgPSBwQ3VyclBvaW50UG9zLT55ICsgQmxvY2tTdGFydFk7CisKKyAgICAvKiBCbG9jayBNYXRjaCBJbnRlZ2VyICovCisgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCisgICAgICAgIHBTcmNDdXJyQnVmLCAKKyAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgIG5TcmNSZWZTdGVwLCAKKyAgICAgICAgcFJlZlJlY3QsIAorICAgICAgICAmQ3VyckJsb2NrUG9zLCAKKyAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICBuTGFtZGEsIAorICAgICAgICBwTVZQcmVkLCAKKyAgICAgICAgJk1WQ2FuZGlkYXRlLCAKKyAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCisgICAgICAgICZDb3N0LCAKKyAgICAgICAgcE1FU3BlYyk7CisgICAgCisgICAgLyogdXBkYXRlZCBCZXN0TVYqLworICAgIC8qKnBCZXN0Q29zdCA9IENvc3Q7CisgICAgcEJlc3RNVi0+ZHggPSBNVkNhbGN1bGF0ZWQuZHg7CisgICAgcEJlc3RNVi0+ZHkgPSBNVkNhbGN1bGF0ZWQuZHk7Ki8KKworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKKyAgICAKKyAgICAvKiBCbG9jayBNYXRjaCBIYWxmIHBlbCAqLworICAgIGlmIChwTUVQYXJhbXMtPmhhbGZTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmKAorICAgICAgICAgICAgcFNyY0N1cnJCdWYsIAorICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICAgICAgcFNyY1JlZlksIAorICAgICAgICAgICAgblNyY1JlZlN0ZXAsIAorICAgICAgICAgICAgQmxvY2tTaXplWCwgCisgICAgICAgICAgICBCbG9ja1NpemVZLCAKKyAgICAgICAgICAgIG5MYW1kYSwgCisgICAgICAgICAgICBwTVZQcmVkLCAKKyAgICAgICAgICAgICZNVkNhbGN1bGF0ZWQsICAgICAgICAvKiBpbnB1dC9vdXRwdXQqLworICAgICAgICAgICAgJkNvc3QpOworICAgIH0KKworICAgIC8qIEJsb2NrIE1hdGNoIFF1YXJ0ZXIgcGVsICovCisgICAgaWYgKHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZSkKKyAgICB7CisgICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIoCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgICAgICBuU3JjUmVmU3RlcCwgCisgICAgICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgIHBNVlByZWQsIAorICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgCisgICAgICAgICAgICAmQ29zdCk7CisgICAgfQorCisgICAgLyogdXBkYXRlZCBCZXN0IENvc3QgYW5kIEJlc3QgTVYgKi8KKyAgICAqcEJlc3RDb3N0ID0gQ29zdDsKKyAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKKyAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsKKworICAgIC8qCisgICAgICogU2tpcCBNQiBjb3N0IGNhbGN1bGF0aW9ucyBvZiAxNngxNiBpbnRlciBtb2RlCisgICAgICovCisgICAgcmV0dXJuIFJldFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1BhcnRpdGlvbk1FCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBHZXRzIGJlc3QgY29zdCBmb3IgdGhlIGN1cnJlbnQgcGFydGl0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIExpc3Qgb2YgcmVmIGJ1ZmZlciBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBuU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIFBhcnRXaWR0aCAgIC0gV2lkdGggb2YgY3VycmVudCBwYXJ0aXRpb24KKyAqIFtpbl0gUGFydEhlaWdodCAgLSBIZWlnaHQgb2YgY3VycmVudCBwYXJ0aXRpb24KKyAqIFtpbl0gQmxvY2tXaWR0aCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUGFydFN0YXJ0WCAgLSBQYXJ0aXRpb24gc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gUGFydFN0YXJ0WSAgLSBQYXJ0aXRpb24gc3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgcHJlZGljdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50ZXIgTUIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQKKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCisJT01YX1MzMiBTcmNSZWZTdGVwLAorCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgdm9pZCogcE1FU3BlYywgCisKKyAgICBPTVhfUzMyIFBhcnRXaWR0aCwKKyAgICBPTVhfUzMyIFBhcnRIZWlnaHQsCisgICAgT01YX1MzMiBCbG9ja1dpZHRoLAorICAgIE9NWF9TMzIgQmxvY2tIZWlnaHQsCisgICAgT01YX1MzMiBQYXJ0U3RhcnRYLCAKKyAgICBPTVhfUzMyIFBhcnRTdGFydFksCisKKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnIgW11bMTJdLAorICAgIE9NWF9TMzIgcFJlZkZyQXJyIFtdWzZdLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRBcnIgW11bNF0sCisKKyAgICBPTVhfUzMyIExhbWJkYSwKKyAgICBPTVhfUzMyICpwQ29zdAorKQoreworICAgIE9NWF9VMzIgICAgIHgsIHksIGksIGosIHJlZiwgT2ZmWCwgT2ZmWSwgT2ZmU3JjLCBPZmZSZWY7CisgICAgT01YX1MzMiAgICAgQmxvY2tDb3N0LCBQYXJ0aXRpb25Db3N0LCBCZXN0Q29zdDsKKyAgICBPTVhfUzMyICAgICBCZXN0UmVmRnJhbWU9MDsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNViBbNF1bNF07CisgICAgT01YVkNNb3Rpb25WZWN0b3IgICBCZXN0TVZQcmVkIFs0XVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIE1WUHJlZDsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIERzdE1WOworCisgICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAKKyAgICBmb3IgKHJlZiA9IDA7IHJlZiA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IHJlZisrKQorICAgIHsKKyAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtyZWZdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgCS8qIE5vIHJlZmVyZW5jZSBmcmFtZSwgY29udGludWUgKi8KKyAgICAgICAgCWNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgUGFydGl0aW9uQ29zdCA9IDA7CisgICAgICAgIAorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgUGFydEhlaWdodDsgeSArPSBCbG9ja0hlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFBhcnRXaWR0aDsgeCArPSBCbG9ja1dpZHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCU9mZlNyYyA9IFNyY0N1cnJTdGVwICogKFBhcnRTdGFydFkgKyB5KSArIFBhcnRTdGFydFggKyB4OworICAgICAgICAgICAgCU9mZlJlZiA9IFNyY1JlZlN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7CisgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCAoCisgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmICsgT2ZmU3JjLCAKKyAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAorICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCBbcmVmXSArIE9mZlJlZiwgCisgICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsIAorICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywgCisKKyAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAmQmxvY2tDb3N0LCAKKyAgICAgICAgICAgICAgICAgICAgJkRzdE1WLAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeCArIFBhcnRTdGFydFgsIAorICAgICAgICAgICAgICAgICAgICB5ICsgUGFydFN0YXJ0WSwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgcFJlZkZyQXJyLCAKKyAgICAgICAgICAgICAgICAgICAgcE1WQXJyLAorICAgICAgICAgICAgICAgICAgICAmTVZQcmVkKTsKKworICAgICAgICAgICAgICAgIFBhcnRpdGlvbkNvc3QgKz0gQmxvY2tDb3N0OworCQkJCQorCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHgpID4+IDI7CisJCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSkgPj4gMjsKKwkJCQkKKwkgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDIpOyBqKyspCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKKwkgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBEc3RNVi5keDsKKwkgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gRHN0TVYuZHk7CisJICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gTVZQcmVkLmR4OworCSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IE1WUHJlZC5keTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKworCQkJCXBSZWZGckFyciBbMiArIChPZmZZID4+IDEpXVsyICsgKE9mZlggPj4gMSldID0gcmVmOworCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMyk7IGorKykKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQorCSAgICAgICAgICAgICAgICB7CisJCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gcmVmOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCQkvKgorCQkgKiBJZiBQYXJ0aXRpb25Db3N0IGlzIGxlc3MgZm9yIHRoaXMgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBuZWVkcyB0byBiZSBiYWNrZWR1cAorCQkgKi8KKyAgICAgICAgaWYgKFBhcnRpdGlvbkNvc3QgPD0gQmVzdENvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJlc3RDb3N0ID0gUGFydGl0aW9uQ29zdDsgICAgICAgICAgICAKKyAgICAgICAgICAgIEJlc3RSZWZGcmFtZSA9IHJlZjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoUGFydFdpZHRoL0Jsb2NrV2lkdGgpOyB4KyspCisgICAgICAgICAgICAgICAgeworCQkJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKKwkJCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSAqIEJsb2NrSGVpZ2h0KSA+PiAyOworCQkJCQorICAgICAgICAgICAgICAgICAgICBCZXN0TVZbeV1beF0uZHggPSBwTVZBcnIgWzQgKyBPZmZZXVs0ICsgT2ZmWF0uZHg7CisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keSA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keTsKKyAgICAgICAgICAgICAgICAgICAgQmVzdE1WUHJlZFt5XVt4XS5keCA9IHBNVlByZWRBcnIgW09mZlldW09mZlhdLmR4OworICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR5ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKwkvKgorCSAqIENvcHkgYmFjayBiZXN0IHJlZmVyZW5jZSBmcmFtZSwgbW90aW9uIHZlY3RvcnMgYW5kIGNvc3QuCisJICovCisgICAgZm9yICh5ID0gMDsgeSA8IChQYXJ0SGVpZ2h0L0Jsb2NrSGVpZ2h0KTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKKyAgICAgICAgeworCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCAqIEJsb2NrV2lkdGgpID4+IDI7CisJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMik7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR4ID0gQmVzdE1WW3ldW3hdLmR4OworICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keSA9IEJlc3RNVlt5XVt4XS5keTsKKyAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keCA9IEJlc3RNVlByZWRbeV1beF0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHkgPSBCZXN0TVZQcmVkW3ldW3hdLmR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAzKTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSkgKyBqXVsyICsgKE9mZlggPj4gMSkgKyBpXSA9IEJlc3RSZWZGcmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKwkqcENvc3QgPSBCZXN0Q29zdDsKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSU5URVIgTUIgdHlwZSBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIHN0cmF0ZWd5IGZyb20gCisgKiB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIElTTy9JRUMgMTQ0OTYtMTAuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVjQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWNvbnN0cnVjdGVkIE1CIAorICogW2luXSBTcmNSZWNTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVjQnVmIAorICogW2luXSBuTUJQb3NYICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBYIGF4aXMKKyAqIFtpbl0gbk1CUG9zWSAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWSBheGlzCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgorICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKKyAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmExNngxNgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKgorICovCisKK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UzMiAqcENvc3QpCit7CisgICAgT01YX1U4ICAgICAgUHJlZEJ1ZiBbMTYqMTYgKyAxNl07CisgICAgT01YX1U4ICAgICAgKnBQcmVkOworICAgIE9NWF9TMzIgICAgIG1vZGU7CisgICAgT01YX1MzMiAgICAgQ29zdDsKKyAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOworICAgIE9NWFJlc3VsdCAgIFJldDsKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlICAgIEludHJhTW9kZTE2eDE2IFs0XSA9IAorICAgICAgICB7T01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IsIAorICAgICAgICBPTVhfVkNfMTZYMTZfREMsIE9NWF9WQ18xNlgxNl9QTEFORX07ICAgICAgICAKKyAgICBPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKKyAgICBPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKKworCXBQcmVkID0gYXJtQWxpZ25UbzE2Qnl0ZXMoUHJlZEJ1Zik7CisgICAgCisJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCisgICAgaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KKyAgICBpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLworICAgIGlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAorICAgICAgICAocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgKnBDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSAxLCAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCisgICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAgLSAxLCAKKyAgICAgICAgICAgICAgICBwUHJlZCwgCisgICAgICAgICAgICAgICAgU3JjUmVjU3RlcCwgCisgICAgICAgICAgICAgICAgMTYsIAorICAgICAgICAgICAgICAgIEludHJhTW9kZTE2eDE2IFttb2RlXSwgCisgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgaWYgKFJldCA9PSBPTVhfU3RzX05vRXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFByZWQsCisgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgJkNvc3QsCisgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgMTYpOworICAgICAgICAgICAgaWYgKENvc3QgPCAqcENvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5JbnRyYTE2eDE2UHJlZE1vZGUgPSBJbnRyYU1vZGUxNngxNiBbbW9kZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJbnRyYSA0eDQgTUIgdHlwZSBhbmQgc2VsZWN0cworICogdGhlIGJlc3Qgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCisgKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCisgKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcworICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKKyAqIFtpbl0gcE1CSW50cmEgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKKyAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludHJhNHg0CisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVjQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorICAgIE9NWF9VMzIgKnBDb3N0KQoreworICAgIE9NWF9TMzIgICAgIHgsIHksIEJsb2NrNHg0LCBCbG9jazh4ODsKKyAgICBPTVhfUzMyICAgICBDb3N0OworCisgICAgLyoKKyAgICAgKiBQcmVkSW50cmE0eDRNb2RlIHdpbGwgc3RvcmUgcHJlZGljdGlvbiBtb2RlcyBvZiA0eDQgYmxvY2tzLiAKKyAgICAgKiBNb2RlcyBmb3IgY3VycmVudCBNQiBzdGFydHMgYXQgaW5kZXggWzFdWzFdLiAgIAorICAgICAqIE1vZGVzIG9mIG5pZ2hib3VyaW5nIE1CJ3Mgd2lsbCBiZSBhcyBzaG93biBiZWxvdworICAgICAqIEEgdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyBmb3IgYW55IGJsb2NrIGluIHRoaXMgYXJyYXkgbWVhbnMgCisgICAgICogdGhhdCBibG9jayBpcyBub3QgYXZhaWxhYmxlIGZvciBwcmVkaWN0aW9uLgorICAgICAqCisgICAgICogYzMgYjAgYjEgYjIgYjMgZDAgZDEgZDIgZDMKKyAgICAgKiBhMCB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICogYTEgeHggeHggeHggeHggLSAgLSAgLSAgLQorICAgICAqIGEyIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKiBhMyB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICoKKyAgICAgKi8KKyAgICBPTVhfUzMyICAgICBQcmVkSW50cmE0eDRNb2RlIFs1XVs5XTsKKworICAgIC8qCisgICAgICogcFNyY1kgc3RvcmVzIHJlLWNvbnN0cnVzdGVkIHNvdXJjZSBhcnJheSBvZiBzaXplIDNNQiBYIDJNQiBhcyBiZWxvdworICAgICAqCisgICAgICogTUIxMSBNQjEyIE1CMTMgCisgICAgICogTUIyMSBNQjIyIE1CMjMKKyAgICAgKgorICAgICAqIFRoaXMgYXJyYXkgd2lsbCBiZSB1c2VkIGZvciBsb2NhbCByZWNvbnN0cnVjdGlvbiBvZiA0eDQgYmxvY2tzIAorICAgICAqIHdpdGggYmVzdCBwcmVkaWN0aW9uIG1vZGUgd2l0aGluIGFuIE1CCisgICAgICovICAgIAorICAgIE9NWF9VOCAgICAgIHBTcmNZIFsoMTYqMykqKDE2KjIpXTsKKyAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKKyAgICAKKyAgICAvKiBpbml0ICovCisgICAgKnBDb3N0ID0gMDsKKworICAgIGZvciAoeSA9IDA7IHkgPCA1OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCisgICAgICAgICAgICAgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgeworICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCisgICAgICAgIGlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKKyAgICAgICAgICAgICAgICBwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogU3RvcmUgdmFsdWVzIG9mIGMzICovCisgICAgaWYgKHBNQkludHJhWzJdICE9IE5VTEwpCisgICAgeworICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVswXSA9IHBNQkludHJhWzJdLT5wSW50cmE0eDRQcmVkTW9kZVsxNV07CisgICAgfQorICAgIAorICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgeworICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYTAsIGExLCBhMiwgYTMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzBdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgW3kgKyAxXVswXSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzBdLT5wSW50cmE0eDRQcmVkTW9kZVt5KjQgKyAzXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCisgICAgICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KKyAgICAgKi8KKyAgICAKKyAgICBTdGVwU3JjWSA9IDE2ICogMzsKKyAgICBmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGZvciBlYWNoIDh4OCBibG9jayAqLworICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisgICAgeworICAgICAgICAvKiBmb3IgZWFjaCA0eDQgYmxvY2sgaW5zaWRlIDh4OCBibG9jayAqLworICAgICAgICBmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbiAoCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKKyAgICAgICAgICAgICAgICBCbG9jazh4OCwgCisgICAgICAgICAgICAgICAgQmxvY2s0eDQsCisgICAgICAgICAgICAgICAgcFNyY1kgKyAxNiAqIFN0ZXBTcmNZICsgMTYsCisgICAgICAgICAgICAgICAgU3RlcFNyY1ksCisgICAgICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSwgCisgICAgICAgICAgICAgICAgJkNvc3QpOworCisgICAgICAgICAgICAqcENvc3QgKz0gQ29zdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlck1FTUIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKKyAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWZCdWZMaXN0ICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKKyAqIFtpbl0gU3JjUmVmU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlZlkgCisgKiBbaW5dIHBSZWZSZWN0ICAgUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcyAgIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuCisgKiBbaW5dIHBNRVNwZWMgICAgIC0gTW90aW9uIGVzdGltYXRpb24gc3RydWN0dXJlCisgKiBbaW5dIHBNQkludGVyICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwRHN0Q29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKgorICovCisKK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlck1FTUIoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwlPTVhfVTMyIExhbWJkYSwKKwl2b2lkICpwTUVTcGVjLAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisJT01YX1UzMiAqcERzdENvc3QpCit7CisgICAgT01YX1MzMiAgICAgaSwgaiwgeCwgeSwgbW9kZTsKKyAgICBPTVhfVTMyICAgICBCbG9jazh4OCwgWFBlck1CLCBZUGVyTUIsIEJsb2NrMngsIEJsb2NrMnk7CisgICAgT01YX1MzMiAgICAgUGFydFN0YXJ0WCA9IDAsIFBhcnRTdGFydFkgPSAwOworICAgIE9NWF9TMzIgICAgIFBhcnRXaWR0aCA9IDgsIFBhcnRIZWlnaHQgPSA4LCBCbG9ja1dpZHRoID0gNCwgQmxvY2tIZWlnaHQgPSA0OworICAgIGNvbnN0IE9NWF9VMzIgICAgIEJsa1N6IFs0XVsyXSA9IHt7NCw0fSwgezQsOH0sIHs4LDR9fTsKKyAgICBjb25zdCBPTVhfVTMyICAgICBQYXJ0U3ogWzRdWzJdID0ge3s4LDh9LCB7OCwxNn0sIHsxNiw4fSwgezE2LDE2fX07CisgICAgY29uc3QgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlICAgICAKKyAgICAgICAgICAgICAgICBNb2RlU3ViTUJUeXBlNHg0IFtdID0ge09NWF9WQ19TVUJfUF80eDQsIE9NWF9WQ19TVUJfUF80eDgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1NVQl9QXzh4NCwgT01YX1ZDX1NVQl9QXzh4OH07CisgICAgY29uc3QgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlCisgICAgICAgICAgICAgICAgTW9kZU1CVHlwZSBbXSA9IHtPTVhfVkNfUF84eDgsIE9NWF9WQ19QXzh4MTYsIE9NWF9WQ19QXzE2eDgsIE9NWF9WQ19QXzE2eDE2fTsKKyAgICAKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUJPcHRpb25zOworICAgIC8qCisgICAgICogUmVmRnJBcnIgYW5kICBNVkFyciB3aWxsIGJlIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIG9mIFJlZmVyZW5jZSBmcmFtZSBpbmRleCBhbmQgTVZzCisgICAgICogSXQgd2lsbCBzdG9yZSBSZWZJbmRleCBhbmQgTVZzIG9mIDYgTUJzIGFzIHNob3duIGJlbG93CisgICAgICogCisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKiAgICAgfFRwLUx0IHxUb3AgICB8VHAtUiAgfAorICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgTUIgICB8CisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKiAgICAgfExlZnQgIHwgQ3VyciB8ICAgICAgfAorICAgICAqICAgICB8IE1CICAgfCBNQiAgIHwgICAgICB8CisgICAgICogICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXwKKyAgICAgKi8KKyAgICBPTVhfUzMyICAgICBSZWZGckFyciBbNF1bNl07IAorICAgIE9NWFZDTW90aW9uVmVjdG9yIE1WQXJyIFs4XVsxMl07CisgICAgT01YVkNNb3Rpb25WZWN0b3IgTVZQcmVkQXJyIFs0XVs0XTsKKyAgICAKKyAgICAvKgorICAgICAqIEluZGV4VG9Mb2Mgd2lsbCB0cmFuc2xhdGUgcE1CSW50ZXIgaW5kZXggaW50byBzcGFjaWFsIGFycmFuZ2VtZW50IG9mIE1CcworICAgICAqLworICAgIE9NWF9TMzIgICAgIEluZGV4VG9Mb2MgW10gPSB7MiwxLDMsMH07CisgICAgT01YX1UzMiAgICAgcGFydCwgTWF4UGFydDsKKyAgICBPTVhfUzMyICAgICBDb3N0LCBNb3Rpb25Db3N0OHg4IFs0XSwgTUJDb3N0LCBCZXN0Q29zdDsKKworICAgIC8qCisgICAgICogVXBkYXRlIG5laWdoYm91cmluZyBNViBhcnJheSBhbmQgUmVmIGZyYW1lIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKKyAgICAgKiBwcmVkaWN0aW9uIG9mIE1WcyBhbmQgUmVmIGZyYW1lcy4KKyAgICAgKi8KKworICAgIC8qIFNldCBjb3N0IHRvIGEgaGlnaCB2YWx1ZSAqLworICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTI7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAyKSArICh4ID4+IDIpOworICAgICAgICAgICAgaWYgKCh5IDwgNCB8fCB4IDwgNCkgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR4OworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keSA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cE1WMFt5ICUgNF1beCAlIDRdLmR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keCA9IDA7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDMgKiAoeSA+PiAxKSArICh4ID4+IDEpOworICAgICAgICAgICAgaWYgKCh5IDwgMiB8fCB4IDwgMikgJiYgKHBNQkludGVyW0luZGV4VG9Mb2NbaV1dICE9IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IAorICAgICAgICAgICAgICAgICAgICBwTUJJbnRlcltJbmRleFRvTG9jW2ldXS0+cFJlZkwwSWR4IFsoeSAlIDIpICogMiArICh4ICUgMildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlZkZyQXJyIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgIAorCisgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WUHJlZEFyciBbeV1beF0uZHggPSAwOworICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4IE1CIFBhcnRpdGlvbiAKKyAgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBNb3Rpb25Db3N0OHg4IFtpXSA9IDA7CisgICAgfSAgICAgICAgCisgICAgCisgICAgcE1CT3B0aW9ucyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBpZiAocE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTh4OCA9PSAxICYmIAorICAgICAgICBwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlNHg0ID09IDEpCisgICAgeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfUF84eDg7CisKKyAgICAgICAgUGFydFdpZHRoID0gUGFydFN6IFswXVswXTsKKyAgICAgICAgUGFydEhlaWdodCA9IFBhcnRTeiBbMF1bMV07CisgICAgICAgIAorICAgICAgICAvKiBGb3IgZWFjaCA4eDggcGFydGl0aW9ucyAqLworICAgICAgICBmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJ0U3RhcnRYID0gKEJsb2NrOHg4ICUgMikgPDwgMzsKKyAgICAgICAgICAgIFBhcnRTdGFydFkgPSAoQmxvY2s4eDggLyAyKSA8PCAzOworCisgICAgICAgICAgICBCbG9jazJ4ID0gKEJsb2NrOHg4ICYgMSkgPDwgMTsKKyAgICAgICAgICAgIEJsb2NrMnkgPSAoQmxvY2s4eDggPj4gMSkgPDwgMTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICAgICAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCAzOyBtb2RlKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCA9IEJsa1N6IFttb2RlXVswXTsKKyAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCA9IEJsa1N6IFttb2RlXVsxXTsKKworICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAorICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAorICAgICAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgcE1FU3BlYywKKworICAgICAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIFBhcnRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRYLAorICAgICAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAorCisgICAgICAgICAgICAgICAgICAgIE1WQXJyLAorICAgICAgICAgICAgICAgICAgICBSZWZGckFyciwKKyAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyLAorCisgICAgICAgICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICAgICAgICAgJkNvc3QpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoQ29zdCA8PSBCZXN0Q29zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCisgICAgICAgICAgICAgICAgICAgIEJlc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbQmxvY2s4eDhdID0gTW9kZVN1Yk1CVHlwZTR4NCBbbW9kZV07CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW0Jsb2NrOHg4XSA9IFJlZkZyQXJyIFsyICsgKFBhcnRTdGFydFkgPj4gMyldWzIgKyAoUGFydFN0YXJ0WCA+PiAzKV07CisKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkFyciBbNCArIEJsb2NrMnkgKyBqXVs0ICsgQmxvY2syeCArIGldLmR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KKyAgICAgICAgICAgIE1vdGlvbkNvc3Q4eDggW0Jsb2NrOHg4XSA9IEJlc3RDb3N0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBDb3N0IGZvciBtYlR5cGUgT01YX1ZDX1BfOHg4ICovCisgICAgICAgIEJlc3RDb3N0ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQmVzdENvc3QgKz0gTW90aW9uQ29zdDh4OCBbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2V0IHN1YiBNQiB0eXBlIHRvIDh4OCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5zdWJNQlR5cGUgW2ldID0gT01YX1ZDX1NVQl9QXzh4ODsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTW90aW9uIEVzdGltYXRpb24gZm9yIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgUGFydGl0aW9uCisgICAgICogSWYgcE1CT3B0aW9ucy0+Yjh4OEJsb2NrU3BsaXRFbmFibGUgaXMgMCwgZG8gb25seSAxNngxNiBNRSAobW9kZSAzKQorICAgICAqLworICAgIGZvciAobW9kZSA9IChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgPyAwIDogMyk7IG1vZGUgPCA0OyBtb2RlKyspCisgICAgeworICAgICAgICBCbG9ja1dpZHRoID0gUGFydFdpZHRoID0gUGFydFN6IFttb2RlXVswXTsKKyAgICAgICAgQmxvY2tIZWlnaHQgPSBQYXJ0SGVpZ2h0ID0gUGFydFN6IFttb2RlXVsxXTsKKyAgICAgICAgCisgICAgICAgIFhQZXJNQiA9IDE2IC8gUGFydFdpZHRoOworICAgICAgICBZUGVyTUIgPSAxNiAvIFBhcnRIZWlnaHQ7CisgICAgICAgIE1heFBhcnQgPSBYUGVyTUIgKiBZUGVyTUI7CisgICAgICAgIAorICAgICAgICBNQkNvc3QgPSAwOworICAgICAgICAKKyAgICAgICAgLyogcGFydCBzaXplIDQsIDIsIDIgYW5kIDEgY29ycmVzcG9uZGluZyB0byA4eDgsIDh4MTYsIDE2eDggYW5kIDE2eDE2IE1CICovCisgICAgICAgIGZvciAocGFydCA9IDA7IHBhcnQgPCBNYXhQYXJ0OyBwYXJ0KyspCisgICAgICAgIHsKKyAgICAgICAgCVBhcnRTdGFydFggPSAocGFydCAlIFhQZXJNQikgKiBQYXJ0V2lkdGg7CisgICAgICAgIAlQYXJ0U3RhcnRZID0gKHBhcnQgLyBYUGVyTUIpICogUGFydEhlaWdodDsKKyAgICAgICAgCQorICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgIHBNRVNwZWMsCisKKyAgICAgICAgICAgICAgICBQYXJ0V2lkdGgsCisgICAgICAgICAgICAgICAgUGFydEhlaWdodCwKKyAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCisgICAgICAgICAgICAgICAgUGFydFN0YXJ0WSwKKworICAgICAgICAgICAgICAgIE1WQXJyLAorICAgICAgICAgICAgICAgIFJlZkZyQXJyLAorICAgICAgICAgICAgICAgIE1WUHJlZEFyciwKKworICAgICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICAgICAmQ29zdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTUJDb3N0ICs9IENvc3Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTUJDb3N0IDw9IEJlc3RDb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLworICAgICAgICAgICAgQmVzdENvc3QgPSBNQkNvc3Q7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBtYlR5cGUgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gTW9kZU1CVHlwZSBbbW9kZV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBwTVYwIGFuZCBwTVZQcmVkIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW2pdW2ldLmR4ID0gTVZBcnIgWzQral1bNCtpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHkgPSBNVkFyciBbNCtqXVs0K2ldLmR5OworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtqXVtpXS5keCA9IE1WUHJlZEFyciBbal1baV0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR5ID0gTVZQcmVkQXJyIFtqXVtpXS5keTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wUmVmTDBJZHggW2oqMitpXSA9IFJlZkZyQXJyIFsyK2pdWzIraV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgQmVzdCBDb3N0ICovCisgICAgKnBEc3RDb3N0ID0gQmVzdENvc3Q7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsxXSAKKyAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCisgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAorICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRSQS4gcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMV0gCisgKiAgICAgICAgICAgIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIAorICogICAgICAgICAgICB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIAorICogICAgICAgICAgICBpbmZvcm1hdGlvbiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKKyAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAorICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAorICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogTWJUeXBlIAorICogICAgICAgICAgICBzdWJNQlR5cGVbNF0gcE1WMFs0XVs0XSBwTVZQcmVkWzRdWzRdIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgSW50cmExNngxNlByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKKyAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAorICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CKCAgICAgICAgICAgICAgICAgICAgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKKwlPTVhfUzMyIFNyY1JlY1N0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwlPTVhfVTMyIExhbWJkYSwKKwl2b2lkICpwTUVTcGVjLAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKKwljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAorCU9NWF9JTlQgKnBEc3RDb3N0LAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRCkKK3sKKyAgICBPTVhfVTMyICAgICBDb3N0LCBpLCBJbnRyYUZsYWcgPSAxOworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgCisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVjQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRlciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUJJbnRyYSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TUJDdXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY1JlZlN0ZXAgPD0gMCB8fCBTcmNSZWZTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY1JlY1N0ZXAgPD0gMCB8fCBTcmNSZWNTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKFNyY0N1cnJTdGVwIDw9IDAgfHwgU3JjQ3VyclN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKSAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWNCdWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTOyBpKyspCisgICAgeworICAgICAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJgorICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmTGlzdCBbaV0pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBjdXJyZW50IE1CIG5lZWRzIElOVEVSIGNvc3QgY2FsY3VsYXRpb25zICovCisgICAgICAgIGlmIChwU3JjUmVmQnVmTGlzdCBbaV0gIT0gTlVMTCAmJiBJbnRyYUZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgSW50cmFGbGFnID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRHN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIC8qCisgICAgICogSW50ZXIgY29zdCBjYWxjdWxhdGlvbnMgCisgICAgICovCisKKyAgICAgLyogY2hlY2sgdGhpcyBNQiBjYW4gYmUgSW50ZXIgKi8KKyAgICBpZiAoSW50cmFGbGFnICE9IDEpCisgICAgeworICAgICAgICAgYXJtVkNNNFAxMF9JbnRlck1FTUIoCisgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICBwUmVmUmVjdCwgICAgCisgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICBMYW1iZGEsCisgICAgICAgICAgICAgcE1FU3BlYywKKyAgICAgICAgICAgICBwTUJJbnRlciwKKyAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgICZDb3N0CisgICAgICAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgICpwRHN0Q29zdCA9IENvc3Q7CisgICAgfSAgICAgCisKKyAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopcE1FU3BlYzsKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NCA9PSAxKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW50cmEgNHg0IGNvc3QgY2FsY3VsYXRpb25zCisgICAgICAgICAqLworICAgICAgICBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbigKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICBwU3JjUmVjQnVmLCAgIAorICAgICAgICAgICAgU3JjUmVjU3RlcCwKKyAgICAgICAgICAgIHBNQkludHJhLAorICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKKyAgICAgICAgICAgICZDb3N0CisgICAgICAgICAgICApOworCisgICAgICAgIGlmIChDb3N0IDw9ICpwRHN0Q29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQV80eDQ7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvc3QgZm9yIEludHJhIDE2eDE2IG1vZGUKKyAgICAgKi8KKworICAgIGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24oCisgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgcFNyY1JlY0J1ZiwgICAKKyAgICAgICAgU3JjUmVjU3RlcCwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgcE1CSW50ZXIsCisgICAgICAgIHBNQkludHJhLAorICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAmQ29zdAorICAgICAgICApOworCisgICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQorICAgIHsKKyAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzE2eDE2OworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHBEc3RCbG9ja1NBRCB0byBtYXggdmFsdWUKKyAgICAgKi8KKwlhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FEKAlwU3JjRHN0TUJDdXJyLCAKKyAgICAgICAgcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAlTcmNDdXJyU3RlcCwgCisgICAgCXBTcmNSZWZCdWZMaXN0LAorICAgIAlTcmNSZWZTdGVwLAorICAgIAlwU3JjUmVjQnVmLCAKKyAgICAJU3JjUmVjU3RlcCwKKyAgICAJcFJlZlJlY3QsCisgICAgCXBDdXJyUG9pbnRQb3MsCisgICAgCXBNQkludGVyLCAKKyAgICAJcE1CSW50cmEsCisgICAgCXBEc3RCbG9ja1NBRCk7CisKKworCXJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmNhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBDaHJvbWEgOHg4IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIHVwcGVyIGJsb2NrIGhhcyBwcmlvcml0eQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ1VwNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCisgICAgeworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgbGVmdCBibG9jayBoYXMgcHJpb3JpdHkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKykKK3sKKyAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOworICAgIH0KKyAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCisgKiAgICAgICAgICAgIDAuLjcpLiAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAorICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKKyAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBOb3RlOiAKKyAqICAgICAgICAgICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiAgICAgICAgICAgICAgIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgCisgKiAgICAgICAgICAgICAgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKyApCit7CisgICAgaW50IHgsIHksIFN1bTsKKyAgICBpbnQgSCwgViwgYSwgYiwgYzsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgOCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9IT1IgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ19DSFJPTUFfUExBTkUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKworICAgIHN3aXRjaCAocHJlZE1vZGUpCisgICAgeworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9EQzoKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQsICAgICAgICAgICAgcFNyY0Fib3ZlLCAgIHBEc3QsICAgICAgICAgICAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUrNCwgcERzdCs0LCAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KCAgIHBTcmNMZWZ0KzQqbGVmdFN0ZXAsIHBTcmNBYm92ZSwgICBwRHN0KzQqZHN0U3RlcCwgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlKzQsIHBEc3QrNCs0KmRzdFN0ZXAsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9IT1I6CisgICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ19DSFJPTUFfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjQWJvdmVbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ19DSFJPTUFfUExBTkU6CisgICAgICAgIEggPSA0KihwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh4PTI7IHg+PTA7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzQreF0gLSBwU3JjQWJvdmVbMi14XSk7CisgICAgICAgIH0KKyAgICAgICAgViA9IDQqKHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7CisgICAgICAgIGZvciAoeT0yOyB5Pj0wOyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg0K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WygyLXkpKmxlZnRTdGVwXSk7CisgICAgICAgIH0KKyAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXSk7CisgICAgICAgIGIgPSAoMTcqSCsxNik+PjU7CisgICAgICAgIGMgPSAoMTcqVisxNik+PjU7CisgICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC0zKSArIGMqKHktMykgKyAxNik+PjU7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGNiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCAxNngxNiBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCisgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKKyAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCisgKiAgICAgICAgICAgIDAuLjE1KSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAorICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKKyAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiBOb3RlOiAKKyAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LCAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LCAKKyAgICBPTVhfVTgqIHBEc3QsIAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsIAorICAgIE9NWF9JTlQgZHN0U3RlcCwgCisgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwgCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkpCit7CisgICAgaW50IHgseSxTdW0sQ291bnQ7CisgICAgaW50IEgsVixhLGIsYzsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCAxNiwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgICAgIAorICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzE2WDE2X1BMQU5FLCAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfMTZYMTZfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzE2WDE2X0hPUjoKKyAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfMTZYMTZfREM6CisgICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLworICAgICAgICBTdW0gPSAwOworICAgICAgICBDb3VudCA9IDA7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENvdW50PT0wKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gPSAxMjg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQ291bnQ9PTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IChTdW0gKyA4KSA+PiA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogQ291bnQgPSAyICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IChTdW0gKyAxNikgPj4gNTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9QTEFORToKKyAgICAgICAgSCA9IDgqKHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh4PTY7IHg+PTA7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzgreF0gLSBwU3JjQWJvdmVbNi14XSk7CisgICAgICAgIH0KKyAgICAgICAgViA9IDgqKHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHk9NjsgeT49MDsgeS0tKQorICAgICAgICB7CisgICAgICAgICAgICBWICs9ICh5KzEpKihwU3JjTGVmdFsoOCt5KSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsoNi15KSpsZWZ0U3RlcF0pOworICAgICAgICB9CisgICAgICAgIGEgPSAxNioocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSk7CisgICAgICAgIGIgPSAoNSpIKzMyKT4+NjsKKyAgICAgICAgYyA9ICg1KlYrMzIpPj42OworICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC03KSArIGMqKHktNykgKyAxNik+PjU7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE4MjEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKQEAgLTAsMCArMSwzMzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCisgKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCisgKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAorICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAorICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorICkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBPTVhfVTggcFRtcFsxMF07CisKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgNCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCA8IDQpLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZFUlQgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IT1IgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19ETCAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZMICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IVSAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzRYNF9IVSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIAorICAgIC8qIE5vdGU6IFRoaXMgY29kZSBtdXN0IG5vdCByZWFkIHRoZSBwU3JjIGFycmF5cyB1bmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBibG9jayBpcyBtYXJrZWQgYXMgYXZhaWxhYmxlLiBJZiB0aGUgYmxvY2sgaXMgbm90IGF2YWliYWJsZSB0aGVuIHBTcmMKKyAgICAgKiBtYXkgbm90IGJlIGEgdmFsaWQgcG9pbnRlci4KKyAgICAgKgorICAgICAqIE5vdGU6IFRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB3ZSByZWZlciB0byB0aGUgbmVpZ2hib3VyaW5nIHBpeGVscworICAgICAqIGluIHZhcmlhYmxlcyBuYW1lZCBhcyBiZWxvdzoKKyAgICAgKgorICAgICAqICAgIFVMIFUwIFUxIFUyIFUzIFU0IFU1IFU2IFU3CisgICAgICogICAgTDAgeHggeHggeHggeHgKKyAgICAgKiAgICBMMSB4eCB4eCB4eCB4eAorICAgICAqICAgIEwyIHh4IHh4IHh4IHh4CisgICAgICogICAgTDMgeHggeHggeHggeHgKKyAgICAgKi8KKyAgICAgCisjZGVmaW5lIFVMIHBTcmNBYm92ZUxlZnRbMF0KKyNkZWZpbmUgVTAgcFNyY0Fib3ZlWzBdCisjZGVmaW5lIFUxIHBTcmNBYm92ZVsxXQorI2RlZmluZSBVMiBwU3JjQWJvdmVbMl0KKyNkZWZpbmUgVTMgcFNyY0Fib3ZlWzNdCisjZGVmaW5lIFU0IHBTcmNBYm92ZVs0XQorI2RlZmluZSBVNSBwU3JjQWJvdmVbNV0KKyNkZWZpbmUgVTYgcFNyY0Fib3ZlWzZdCisjZGVmaW5lIFU3IHBTcmNBYm92ZVs3XQorI2RlZmluZSBMMCBwU3JjTGVmdFswKmxlZnRTdGVwXQorI2RlZmluZSBMMSBwU3JjTGVmdFsxKmxlZnRTdGVwXQorI2RlZmluZSBMMiBwU3JjTGVmdFsyKmxlZnRTdGVwXQorI2RlZmluZSBMMyBwU3JjTGVmdFszKmxlZnRTdGVwXQorCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfNFg0X1ZFUlQ6CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMF0gPSBVMDsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzFdID0gVTE7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCsyXSA9IFUyOworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArM10gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9IT1I6CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFswKmRzdFN0ZXAreF0gPSBMMDsKKyAgICAgICAgICAgIHBEc3RbMSpkc3RTdGVwK3hdID0gTDE7CisgICAgICAgICAgICBwRHN0WzIqZHN0U3RlcCt4XSA9IEwyOworICAgICAgICAgICAgcERzdFszKmRzdFN0ZXAreF0gPSBMMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIE9NWF9WQ180WDRfREM6CisgICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KHBTcmNMZWZ0LCBwU3JjQWJvdmUsIHBEc3QsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfREw6CisgICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfUklHSFQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTIgKyAyKlUzICsgVTQgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUzICsgMipVNCArIFU1ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVNCArIDIqVTUgKyBVNiArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTUgKyAyKlU2ICsgVTcgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFU2ICsgMypVNyAgICAgICsgMik+PjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDMqVTMgICAgICArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbM10gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNF0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNV0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCt5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9ESUFHX0RSOiAgICAgICAgCisgICAgICAgIC8qIHgteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVTCArIDIqTDAgKyBMMSArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIDIqVTIgKyBVMSArIDIpPj4yKTsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMreC15XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9WUjoKKyAgICAgICAgLyogelZSPTJ4LXkgPSAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2CisgICAgICAgICAqIHgtKHk+PjEpID0gLTEsIC0xLCAgMCwgMCwgMSwgMSwgMiwgMiwgMywgMworICAgICAgICAgKiB5ICAgICAgICA9ICAzLCAgMiwgID8sID8sID8sID8sID8sID8sIDEsIDAKKyAgICAgICAgICovCisgICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDIgKyAyKkwxICsgTDAgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDEgKyAyKkwwICsgVUwgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDAgKyAyKlVMICsgVTAgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVUwgKyBVMCArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVTCArIDIqVTAgKyBVMSArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOworICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOworICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMrMip4LXldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hEOgorICAgICAgICAvKiB6SEQ9MnkteCA9IC0zIC0yIC0xICAwICAxICAyICAzICA0ICA1ICA2CisgICAgICAgICAqIHktKHg+PjEpID0gLTEgLTEgIDAgIDAgIDEgIDEgIDIgIDIgIDMgIDMKKyAgICAgICAgICogeCAgICAgICAgPSAgMyAgMiAgICAgICAgICAgICAgICAgICAgMSAgMAorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMiArIDIqVTEgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMCArIDIqVUwgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIEwwICsgMSk+PjEpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKnkteF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ180WDRfVkw6CisgICAgICAgIC8qIE5vdGU6IHgrKHk+PjEpID0gKDIqeCt5KT4+MQorICAgICAgICAgKiAyeCt5ID0gMCAxIDIgMyA0IDUgNiA3IDggOQorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIFUxICsgMSk+PjEpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUxICsgVTIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTEgKyAyKlUyICsgVTMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTIgKyBVMyArIDEpPj4xKTsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTMgKyBVNCArIDEpPj4xKTsKKyAgICAgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKFU0ICsgVTUgKyAxKT4+MSk7CisgICAgICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVMiArIDMqVTMgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzZdID0gVTM7CisgICAgICAgICAgICBwVG1wWzddID0gVTM7CisgICAgICAgICAgICBwVG1wWzhdID0gVTM7CisgICAgICAgICAgICBwVG1wWzldID0gVTM7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzIqeCt5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9IVToKKyAgICAgICAgLyogekhVID0geCsyKnkgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMCArIEwxICsgMSk+PjEpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKEwxICsgTDIgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoTDIgKyBMMyArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChMMiArIDMqTDMgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNl0gPSBMMzsKKyAgICAgICAgcFRtcFs3XSA9IEwzOworICAgICAgICBwVG1wWzhdID0gTDM7CisgICAgICAgIHBUbXBbOV0gPSBMMzsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wW3grMip5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODExNGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogb2YgMTZ4MTYgb3IgMTZ4OAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4KAorCWNvbnN0IE9NWF9VOCogCXBTcmMsCisgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgIE9NWF9VMzIgCWlTcmNTdGVwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCisgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCisgICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKKyAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzMzBiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfNHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiA0eDggb3IgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHgoIAorCSAgY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCSAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgICBPTVhfVTMyCWlSZWZTdGVwMCwKKyAgICAgIE9NWF9VMzIJaVJlZlN0ZXAxLAorICAgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICAgIE9NWF9VMzIgICBpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKKyAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAorICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTljMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzh4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcworICogb2YgOHgxNiBvciA4eDggb3IgOHg0CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCggCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIAorICAgICAgICAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIAorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgorICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCisgICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2M0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRF80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2NrcworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4KAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWFlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBVERfNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcworICogCisgKi8KKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCisgKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCisgKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQoIAorCWNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCisJT01YX1UzMiAgICAgaVN0ZXBPcmcsICAgICAgICAgICAgICAgICAgICAgICAgIAorCWNvbnN0IE9NWF9VOCoJCXBTcmNSZWYsCisJT01YX1UzMgkJaVN0ZXBSZWYsCisJT01YX1UzMiogICAgcERzdFNBRAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgU0FURCA9IDA7CisgICAgT01YX1MzMiAgICAgZCBbNF1bNF0sIG0xWzRdWzRdLCBtMls0XVs0XTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZCBbal1baV0gPSBwU3JjT3JnIFtqICogaVN0ZXBPcmcgKyBpXSAtIHBTcmNSZWYgW2ogKiBpU3RlcFJlZiArIGldOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3IgZm9yIDR4NCBibG9jayAqLworCisgICAgLyogSG9yaXpvbnRhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVtpXVswXSA9IGRbaV1bMF0gKyBkW2ldWzJdOyAvKiBhK2MgKi8KKyAgICAgICAgbTFbaV1bMV0gPSBkW2ldWzFdICsgZFtpXVszXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gZFtpXVswXSAtIGRbaV1bMl07IC8qIGEtYyAqLworICAgICAgICBtMVtpXVszXSA9IGRbaV1bMV0gLSBkW2ldWzNdOyAvKiBiLWQgKi8KKworICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KKyAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCisgICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLworICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KKworICAgIH0KKworICAgIC8qIFZlcnRpY2FsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKKyAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOworICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07CisgICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKKworICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07CisgICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKKyAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOworICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07CisgICAgfQorICAgIAorICAgIC8qIGNhbGN1bGF0ZSBTQUQgZm9yIFRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTQVREICs9IGFybUFicyhtMiBbal1baV0pOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAqcERzdFNBRCA9IChTQVREICsgMSkgLyAyOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhNTY2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCisgKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCisgKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCisgKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAorICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCisgKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIDQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKKyAqICAgICAgICAgICAgb2YgNC4gCisgKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKKyAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCisgKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKKyAqICAgICAgICAgICAgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKKyAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKKyAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorCSBjb25zdCBPTVhfVTgqCQlwU3JjT3JnLAorCSBjb25zdCBPTVhfVTgqCQlwU3JjUHJlZCwKKwkgT01YX1UzMgkJaVNyY09yZ1N0ZXAsCisJIE9NWF9VMzIJCWlTcmNQcmVkU3RlcCwKKwkgT01YX1MxNioJICAgIHBEc3RRdWFudENvZWZmLAorCSBPTVhfUzE2KiAJICAgIHBEc3REZVF1YW50Q29lZmYsCisJIE9NWF9TMTYqCSAgICBwRENDb2VmZiwKKwkgT01YX1M4KgkJcE51bUNvZWZmLAorCSBPTVhfVTMyCQluVGhyZXNoU0FELAorCSBPTVhfVTMyCQlpUVAsCisJIE9NWF9VOAkJICAgIGJJbnRyYQorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1M4ICAgICAgTnVtQ29lZmYgPSAwOworICAgIE9NWF9TMTYgICAgIEJ1ZlsxNl0sIG1bMTZdOworICAgIE9NWF9VMzIgICAgIFFCaXRzLCBRUHBlciwgUVBtb2QsIGY7CisgICAgT01YX1MzMiAgICAgVmFsdWUsIE1GLCBUaHJlc2hEQzsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYocERzdERlUXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYocERDQ29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKSAmJiAKKwkJCWFybU5vdDhCeXRlQWxpZ25lZChwRHN0RGVRdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGJJbnRyYSAhPSAwKSAmJiAoYkludHJhICE9IDEpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlTcmNPcmdTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiAKKyAgICAgKiBaZXJvLUJsb2NrIEVhcmx5IGRldGVjdGlvbiB1c2luZyBuVGhyZXNoU0FEIHBhcmFtIAorICAgICAqLworCisgICAgUVBwZXIgPSBpUVAgLyA2OworICAgIFFQbW9kID0gaVFQICUgNjsgICAgCisgICAgUUJpdHMgPSAxNSArIFFQcGVyOworICAgIAorICAgIGYgPSAoMSA8PCBRQml0cykgLyAoYkludHJhID8gMyA6IDYpOworICAgIAorICAgIC8qIERvIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIGlmIGVuYWJsZWQgKi8KKyAgICBpZiAoblRocmVzaFNBRCkKKyAgICB7CisgICAgICAgIFRocmVzaERDID0gKCgxIDw8IFFCaXRzKSAtIGYpIC8gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bMF07CisgICAgICAgIGlmIChuVGhyZXNoU0FEIDwgVGhyZXNoREMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBibG9jayB0byB6ZXJvICovCisgICAgICAgICAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcERDQ29lZmYgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAwOyAgICAKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBOdW1Db2VmZiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAvKiBDYWxjdWxhdGUgZGlmZmVyZW5jZSAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCdWYgW2ogKiA0ICsgaV0gPSAKKyAgICAgICAgICAgICAgICBwU3JjT3JnIFtqICogaVNyY09yZ1N0ZXAgKyBpXSAtIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KKyAgICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0IChtLCBCdWYpOworCisgICAgaWYgKHBEQ0NvZWZmICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDb3B5IHVucXVhbnRpemVkIERDIHZhbHVlIGludG8gcG9pbnRlciAqLworICAgICAgICAqcERDQ29lZmYgPSBtWzBdOworICAgIH0KKworICAgIC8qIFF1YW50aXphdGlvbiAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOworICAgICAgICAgICAgVmFsdWUgPSBhcm1BYnMobVtqICogNCArIGldKSAqIE1GICsgZjsKKyAgICAgICAgICAgIFZhbHVlID4+PSBRQml0czsKKyAgICAgICAgICAgIFZhbHVlID0gbVtqICogNCArIGldIDwgMCA/IC1WYWx1ZSA6IFZhbHVlOworICAgICAgICAgICAgQnVmWzQgKiBqICsgaV0gPSBwRHN0UXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICAgICAgaWYgKChwTnVtQ29lZmYgIT0gTlVMTCkgJiYgVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTnVtQ29lZmYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE91dHB1dCBudW1iZXIgb2Ygbm9uLXplcm8gQ29lZmZzICovCisgICAgaWYgKHBOdW1Db2VmZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBOdW1Db2VmZiA9IE51bUNvZWZmOworICAgIH0KKyAgICAKKyAgICAvKiBSZXNpZHVhbCBJbnYgVHJhbnNmb3JtICovCisgICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKKyAgICB7ICAgIAorICAgICAgICAvKiBSZSBTY2FsZSAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0gW2ogKiA0ICsgaV0gID0gQnVmIFtqICogNCArIGldICogKDEgPDwgUVBwZXIpICoKKyAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9WTWF0cml4W1FQbW9kXVthcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtqICogNCArIGldXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChwRHN0RGVRdWFudENvZWZmLCBtKTsgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMGU4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb246CisgKiBEZXF1YW50aXplIENocm9tYSAyeDIgREMgYmxvY2sKKyAqLworCitzdGF0aWMgdm9pZCBEZXF1YW50Q2hyb21hREMyeDIoCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGludCBTaGlmdCA9IChRUC82KS0xIDsKKyAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IGksIFZhbHVlOworCisgICAgaWYgKFNoaWZ0ID49IDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPDwgU2hpZnQ7CisgICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpID4+IDE7CisgICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisgCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEludmVyc2UgVHJhbnNmb3JtIERDIDJ4MiBDb2VmZmljaWVudHMKKyAqLworCitzdGF0aWMgdm9pZCBJbnZUcmFuc2Zvcm1EQzJ4MihPTVhfUzE2KiBwRGF0YSkKK3sKKyAgICBpbnQgYzAwID0gcERhdGFbMF07CisgICAgaW50IGMwMSA9IHBEYXRhWzFdOworICAgIGludCBjMTAgPSBwRGF0YVsyXTsKKyAgICBpbnQgYzExID0gcERhdGFbM107CisKKyAgICBpbnQgZDAwID0gYzAwICsgYzAxOworICAgIGludCBkMDEgPSBjMDAgLSBjMDE7CisgICAgaW50IGQxMCA9IGMxMCArIGMxMTsKKyAgICBpbnQgZDExID0gYzEwIC0gYzExOworCisgICAgcERhdGFbMF0gPSAoT01YX1MxNikoZDAwICsgZDEwKTsKKyAgICBwRGF0YVsxXSA9IChPTVhfUzE2KShkMDEgKyBkMTEpOworICAgIHBEYXRhWzJdID0gKE9NWF9TMTYpKGQwMCAtIGQxMCk7CisgICAgcERhdGFbM10gPSAoT01YX1MxNikoZDAxIC0gZDExKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKKyAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCisgKQoreworICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MihwcFNyYywgcERzdCk7CisgICAgSW52VHJhbnNmb3JtREMyeDIocERzdCk7CisgICAgRGVxdWFudENocm9tYURDMngyKHBEc3QsIFFQKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjOGJlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgTHVtYSBEQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRMdW1hREM0eDQoCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorKQoreworICAgIGludCBTaGlmdCA9IChRUC82KS0yIDsKKyAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IGksIFJvdW5kLCBWYWx1ZTsKKworICAgIGlmIChTaGlmdCA+PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDs7CisgICAgICAgIFJvdW5kID0gMTw8KFNoaWZ0LTEpOworCisgICAgICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kKSA+PiBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworIAorCisvKgorICogRGVzY3JpcHRpb246CisgKiBJbnZlcnNlIFRyYW5zZm9ybSBEQyA0eDQgQ29lZmZpY2llbnRzCisgKi8KK3N0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDNHg0KE9NWF9TMTYqIHBEYXRhKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBjMCA9IHBEYXRhW2krMF07CisgICAgICAgIGludCBjMSA9IHBEYXRhW2krMV07CisgICAgICAgIGludCBjMiA9IHBEYXRhW2krMl07CisgICAgICAgIGludCBjMyA9IHBEYXRhW2krM107CisgICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOworICAgICAgICBwRGF0YVtpKzFdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKKyAgICAgICAgcERhdGFbaSsyXSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7CisgICAgICAgIHBEYXRhW2krM10gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKKyAgICAgICAgaW50IGMxID0gcERhdGFbaSs0XTsKKyAgICAgICAgaW50IGMyID0gcERhdGFbaSs4XTsKKyAgICAgICAgaW50IGMzID0gcERhdGFbaSsxMl07CisgICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOworICAgICAgICBwRGF0YVtpKzRdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKKyAgICAgICAgcERhdGFbaSs4XSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7CisgICAgICAgIHBEYXRhW2krMTJdID0gKE9NWF9TMTYpKGMwLWMxK2MyLWMzKTsKKyAgICB9Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAorICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKKyAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAgICAgICAgIAorICkKK3sKKyAgICBhcm1SZXRBcmdFcnJJZihwcFNyYyAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBTcmMgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihRUDwwLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihRUD41MSwgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEc3QpOworICAgIC8qSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NChwRHN0LCBRUCk7Ki8KKyAgICBJbnZUcmFuc2Zvcm1EQzR4NChwRHN0KTsKKyAgICBEZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTQ0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAorICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjRHN0IAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDKAorCU9NWF9TMTYqIAlwU3JjRHN0LAorCU9NWF9VMzIJCWlRUCwKKwlPTVhfVTgJCWJJbnRyYQorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbVsyXVsyXTsKKyAgICBPTVhfUzMyICAgICBWYWx1ZTsKKyAgICBPTVhfUzMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjAwOworCisgICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCisgICAgbVswXVswXSA9IHBTcmNEc3RbMF0gKyBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOworICAgIG1bMF1bMV0gPSBwU3JjRHN0WzBdIC0gcFNyY0RzdFsxXSArICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKKyAgICBtWzFdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSAtIHBTcmNEc3RbM107CisgICAgbVsxXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdIC0gIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOworCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLworICAgIE1GMDAgPSBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIChiSW50cmEgPyAzIDogNik7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLworCisgICAgLyogU2NhbGluZyAqLworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMobVtqXVtpXSkgKiBNRjAwICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKKyAgICAgICAgICAgIHBTcmNEc3RbaiAqIDIgKyBpXSA9IChPTVhfUzE2KSgobVtqXVtpXSA8IDApID8gLVZhbHVlIDogVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NmN2YwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwpAQCAtMCwwICsxLDExOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCisgKiBhbmQgcXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQygKKwlPTVhfUzE2KiAJcFNyY0RzdCwKKwlPTVhfVTMyCQlpUVAKKykKK3sKKyAgICBPTVhfSU5UICAgICBpLCBqOworICAgIE9NWF9TMzIgICAgIG0xWzRdWzRdLCBtMls0XVs0XTsKKyAgICBPTVhfUzMyICAgICBWYWx1ZTsKKyAgICBPTVhfVTMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjsKKworICAgIC8qIENoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciA0eDQgYmxvY2sgKi8KKyAgICAvKiBIb3Jpem9udGFsIEhhZGFtYXJkICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSBpICogNDsKKyAgICAgICAgCisgICAgICAgIG0xW2ldWzBdID0gcFNyY0RzdFtqICsgMF0gKyBwU3JjRHN0W2ogKyAyXTsgLyogYStjICovCisgICAgICAgIG0xW2ldWzFdID0gcFNyY0RzdFtqICsgMV0gKyBwU3JjRHN0W2ogKyAzXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gcFNyY0RzdFtqICsgMF0gLSBwU3JjRHN0W2ogKyAyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gcFNyY0RzdFtqICsgMV0gLSBwU3JjRHN0W2ogKyAzXTsgLyogYi1kICovCisKKyAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCisgICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLworICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KKyAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCisKKyAgICB9CisKKyAgICAvKiBWZXJ0aWNhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07CisgICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKKyAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOworICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07CisKKyAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOworICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07CisgICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKKyAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOworICAgIH0KKworICAgIAorICAgIC8qIFF1YW50aXphdGlvbiAqLworICAgIFFiaXRzUGx1c09uZSA9IEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNik7IC8qZmxvb3IgKFFQLzYpKi8KKyAgICBUd29fZiA9ICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzOyAvKiAzLT5JTlRSQSwgNi0+SU5URVIgKi8KKyAgICBNRiA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOworCisgICAgLyogU2NhbGluZyAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMoKG0yW2pdW2ldLyogKyAxKi8pIC8gMikgKiBNRiArIFR3b19mKSA+PiBRYml0c1BsdXNPbmU7CisgICAgICAgICAgICBwU3JjRHN0W2ogKiA0ICsgaV0gPSAoT01YX1MxNikoKG0yW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTViNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBEQ1QvSURDVCBtb2R1bGUKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWERDVFRBQl9IXworI2RlZmluZSBfT01YRENUVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdOworCisjZW5kaWYgLyogX09NWERDVFRBQl9IXyAqLworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCisgKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCisgKgorICovCisgCisjaWZuZGVmIF9PTVhIVUZGVEFCX0hfCisjZGVmaW5lIF9PTVhIVUZGVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSdW5JZHhbMTFdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMFs2OF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzddOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMVszNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTE1BWFsxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxTE1BWFsyMV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUk1BWFsyN107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUk1BWFs4XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSdW5JZHhbMTJdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMFs1OV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUnVuSWR4WzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUk1BWFsxMl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUk1BWFszXTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMTRdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl07CisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWVkODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9IXworI2RlZmluZSBfT01YWklHWkFHVEFCX0hfCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFs2NF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTM5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKyAgICAgT01YX1U4IGZsYWcsCisgICAgIE9NWF9JTlQgKnBTdW1FcnIKKykKK3sKKyAgICBPTVhfSU5UIGRjU2NhbGVyLCBpOworICAgIE9NWF9TMTYgdGVtcFByZWQ7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIAorICAgIC8qIFNldCBEQyBzY2FsZXIgdmFsdWUgdG8gYXZvaWQgc29tZSBjb21waWxlcnMgZ2l2aW5nIGEgd2FybmluZy4gKi8KKyAgICBkY1NjYWxlcj0wOworICAgIAorICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCisgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQorICAgIHsKKyAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gOCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogY3VyUVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gOSAmJiBjdXJRUCA8PSAyNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCArIDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogY3VyUVApIC0gMTY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICB7CisgICAgICAgIGlmIChjdXJRUCA+PSAxICYmIGN1clFQIDw9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA1ICYmIGN1clFQIDw9IDI0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IChjdXJRUCArIDEzKS8yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCAtIDY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFByZUFDUHJlZGljdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcFByZUFDUHJlZGljdFswXSA9IHByZWREaXI7CisgICAgfQorCisgICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQorICAgIHsKKyAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCisgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmUm93WzBdLCBkY1NjYWxlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyhwUHJlZEJ1ZkNvbFswXSwgZGNTY2FsZXIpOworICAgIH0KKworICAgIC8qIFVwZGF0aW5nIHRoZSBEQyB2YWx1ZSB0byB0aGUgcm93IGFuZCBjb2wgYnVmZmVyICovCisgICAgKihwUHJlZEJ1ZlJvdyAtIDgpID0gKnBQcmVkQnVmQ29sOworCisgICAgaWYgKGZsYWcpCisgICAgeworICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLworICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7CisKKyAgICAgICAgLyogUFFGID0gUUYgLSBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgcFNyY0RzdFswXSAtPSB0ZW1wUHJlZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUUYgPSBQUUYgKyBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgcFNyY0RzdFswXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgCisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7CisKKyAgICAgICAgLyogQ2FsIGFuZCBzdG9yZSBGWzBdWzBdIGludG8gdGhlIGNvbCBidWZmZXIgKi8KKyAgICAgICAgKnBQcmVkQnVmQ29sID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOworICAgIH0KKworCisgICAgaWYgKEFDUHJlZEZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIGlmIChwcmVkRGlyID09IE9NWF9WQ19WRVJUSUNBTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFByZWRCdWZSb3dbaV0gKiBwcmVkUVAsIGN1clFQKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgICAgIC8qUFFGWFt2XVswXSA9IFFGWFt2XVswXSAtIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgIEFDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaV0gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKlFGWFt2XVswXSA9IFBRRlhbdl1bMF0gKyAoUUZBW3ZdWzBdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byB0aGUgcm93IGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZSb3dbaV0gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDg7IGkgPCA2NDsgaSArPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZkNvbFtpPj4zXSAqIHByZWRRUCwgY3VyUVApOworICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgICAgICAvKlBRRlhbMF1bdV0gPSBRRlhbMF1bdV0gLSAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSAtPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIGFic29sdXRlIHZhbHVlcyBvZiBBQyBwcmVkaWN0aW9uIGVycm9yLCB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZSBBQworICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICpwU3VtRXJyICs9IGFybUFicyhwU3JjRHN0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLyogcFByZUFDUHJlZGljdFsxfjddIHN0b3JlIHRoZSBlcnJvciBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgQUMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlQUNQcmVkaWN0W2k+PjNdID0gcFNyY0RzdFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypRRlhbMF1bdV0gPSBQUUZYWzBdW3VdICsgKFFGQVswXVt1XSAqIFFQQSkgLy8gUVBYICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gKz0gdGVtcFByZWQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY5YTMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispCit7CisgICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCwgaW5kZXg7CisgICAgT01YX1MxNiAgICAgaGFsZlBlbFggPSAwLCBoYWxmUGVsWSA9IDAsIHgsIHk7CisgICAgT01YX0lOVCAgICAgY2FuZFNBRCwgcmVmU0FEID0gMDsKKyAgICBPTVhfSU5UICAgICBtaW5TQUQsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7CisgICAgT01YX1U4IHRlbXBQZWw7CisgICAgICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkgKyAocFNyY0RzdE1WLT5keC8yKTsKKworICAgIC8qIENvcHkgdGhlIGNhbmRpZGF0ZSB0byB0aGUgdGVtcG9yYXJ5IGxpbmVhciBhcnJheSAqLworICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsaW5kZXggPSAwOworICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7CisgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVmU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB0aGUgbWluU2FkIGFzIHJlZmVyZW5jZSBTQUQgKi8KKyAgICBtaW5TQUQgPSByZWZTQUQ7CisgICAgKnBEc3RTQUQgPSByZWZTQUQ7CisKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovCisgICAgZnJvbVggPSAxOworICAgIHRvWCAgID0gMTsKKyAgICBmcm9tWSA9IDE7CisgICAgdG9ZICAgPSAxOworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54IC0gMSkgPCBwUmVmUmVjdC0+eCkKKyAgICB7CisgICAgICAgIGZyb21YID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eCArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSAtIDEpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IDA7CisgICAgfQorCisgICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnkgKyBCbG9ja1NpemUgKyAxKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQorICAgIHsKKyAgICAgICAgdG9ZICAgPSAwOworICAgIH0KKworICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisgICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLworICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIHBvc2l0aW9uICovCisgICAgICAgICAgICBpZiAoIHggPT0gMCAmJiB5ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogKHBTcmNEc3RNVi0+ZHkvMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHBTcmNEc3RNVi0+ZHgvMik7CisKKyAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBwaXhlbCBhbmQgY2FsY3VsYXRlIHRoZSBTQUQqLworICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgY2FuZFNBRCA9IDAsaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLGluZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wUGVsID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZltpbmRleF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHhdICogYXJtQWJzKHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHldICogYXJtQWJzKHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHkgKyB4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJtQWJzKHgqeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcm1BYnMgKHgpICsgYXJtQWJzICh5KSAtIHJuZFZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvICgyICogKGFybUFicyAoeCkgKyBhcm1BYnMgKHkpKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzICh0ZW1wUGVsIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGlmIChhcm1WQ000UDJfQ29tcGFyZU1WICh4LCB5LCBjYW5kU0FELCBoYWxmUGVsWCwgaGFsZlBlbFksIG1pblNBRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBoYWxmUGVsWCA9IHg7CisgICAgICAgICAgICAgICAgaGFsZlBlbFkgPSB5OworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHBTcmNEc3RNVi0+ZHggKz0gaGFsZlBlbFg7CisgICAgcFNyY0RzdE1WLT5keSArPSBoYWxmUGVsWTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZmUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKKyAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKKyAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKKyAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCisgKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00CisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCisgKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgorICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCisgKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KKyAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispCit7CisKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgICAgIG91dGVyLCBpbm5lciwgY291bnQsaW5kZXg7CisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICAvKigyNTYqMjU2ICsxKSB0aGlzIGlzIHRvIG1ha2UgdGhlIFNBRCBtYXggaW5pdGlhbGx5Ki8KKyAgICBPTVhfSU5UICAgICBtaW5TQUQgPSAweDEwMDAxLCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmQnVmOworICAgIE9NWF9TMTYgICAgIHgsIHk7CisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsKKyAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FU3BlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgc2VhcmNoUmFuZ2UgPSAoKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYyktPnNlYXJjaFJhbmdlOworICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KKyAgICBmcm9tWCA9IHNlYXJjaFJhbmdlOworICAgIHRvWCAgID0gc2VhcmNoUmFuZ2U7CisgICAgZnJvbVkgPSBzZWFyY2hSYW5nZTsKKyAgICB0b1kgICA9IHNlYXJjaFJhbmdlOworCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCisgICAgeworICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgQmxvY2tTaXplICsgc2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBCbG9ja1NpemU7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gc2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKKyAgICB7CisgICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBCbG9ja1NpemU7CisgICAgfQorCisgICAgcERzdE1WLT5keCA9IC1mcm9tWDsKKyAgICBwRHN0TVYtPmR5ID0gLWZyb21ZOworICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLworICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKKyAgICB7CisKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIHkpICsgeDsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KKyAgICAgICAgICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMCwgY2FuZFNBRCA9IDA7CisgICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOworICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssIGluZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIHBEc3RNVi0+ZHgvMiwgcERzdE1WLT5keS8yLCBtaW5TQUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwRHN0U0FEID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBtaW5TQUQgICA9IGNhbmRTQUQ7CisgICAgICAgICAgICAgICAgcERzdE1WLT5keCA9IHgqMjsKKyAgICAgICAgICAgICAgICBwRHN0TVYtPmR5ID0geSoyOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTg2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZXNjYXBlIG1vZGUgY2hlY2sgCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgCisgKiBSZXR1cm4gVmFsdWU6CisgKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMworICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCisgKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKKyAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KKyAqCisgKi8KKworT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgIE9NWF9VMzIgcnVuLAorICAgICBPTVhfVTMyIHJ1blBsdXMsCisgICAgIE9NWF9TMTYgbGV2ZWwsCisgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAorICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAorICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQorKQoreworICAgIE9NWF9VOCBlc2NhcGUgPSAwLCBmTW9kZSA9IDAsIGVudHJpZXM7CisgICAgCisgICAgbGV2ZWwgPSBhcm1BYnMgKGxldmVsKTsKKyAgICBsZXZlbFBsdXMgPSBhcm1BYnMgKGxldmVsUGx1cyk7CisgICAgCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAorICAgICAgIE1vZGUgMCBjaGVjayAqLworICAgIGlmIChydW4gPD0gbWF4U3RvcmVSdW4pCisgICAgeworICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KKyAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuXTsKKyAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgZW50cmllcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlc2NhcGUgPSAxOworICAgIH0KKyAgICBpZihlc2NhcGUgJiYgc2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gNDsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsUGx1cyBhbmQgTGFzdCBjb21iaW5hdGlvbiAKKyAgICAgICBNb2RlIDEgY2hlY2sgKi8gICAgCisgICAgaWYgKGVzY2FwZSkKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gMTsKKyAgICAgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKKyAgICAgICAgeworICAgICAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1biArIDFdCisgICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOworICAgICAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbFBsdXMgPiBlbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuUGx1cywgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCisgICAgICAgTW9kZSAyIGNoZWNrICovICAgIAorICAgIGlmIChlc2NhcGUpCisgICAgeworICAgICAgICBlc2NhcGUgPSAwOworICAgICAgICBmTW9kZSA9IDI7CisgICAgICAgIGlmIChydW5QbHVzIDw9IG1heFN0b3JlUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuUGx1cyArIDFdCisgICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzXTsKKyAgICAgICAgICAgIGlmIChydW5QbHVzID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBzZWxlY3QgbW9kZSAzIC0tPiBGTEMgKi8KKyAgICBpZiAoZXNjYXBlKQorICAgIHsKKyAgICAgICAgZk1vZGUgPSAzOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZk1vZGU7Cit9CisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODg0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYwpAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIGNvbXBhcmluZyBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIAorICogdGhlIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqLworICAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlIAorICogYmVzdCBNViBhbmQgU0FECisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgbXZYCQl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBtdlkJCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0JICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAorICogW2luXQkgICAgYmVzdE1WWAl4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgYmVzdE1WWQl5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgYmVzdFNBRAliZXN0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdCAKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLCAKKyAgICBPTVhfUzE2IG12WSwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhfUzE2IGJlc3RNVlgsIAorICAgIE9NWF9TMTYgYmVzdE1WWSwgCisgICAgT01YX0lOVCBiZXN0U0FECispIAoreworICAgIGlmIChjYW5kU0FEIDwgYmVzdFNBRCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2FuZFNBRCA+IGJlc3RTQUQpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCisgICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8IChiZXN0TVZYKmJlc3RNVlgrYmVzdE1WWSpiZXN0TVZZKSApCisgICAgeworICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmNzEzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCkBAIC0wLDAgKzEsMTEyIEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EQ1RfVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSBEQ1QvSURDVCBjb2VmZmljZW50IG1hdHJpeAorICoKKyAqLworCisjaWZuZGVmIF9PTVhEQ1RDT1NUQUJfQ18KKyNkZWZpbmUgX09NWERDVENPU1RBQl9DXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworY29uc3QgT01YX0Y2NCBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1s4XVs4XSA9Cit7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKKyAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3OTAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDkyMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwOTYsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAxMTQwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ4NjAsIAorICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczODQwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDEzOCwgCisgICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMyNjAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwIAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTUyLCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMTA5MCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM2ODAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNzMwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAorICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTMzMAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCisgICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzNDIwLCAKKyAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDkyMCwgCisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAorICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MjgwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA5ODAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NTE3MCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzM0MCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDEzLCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNTEwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjcwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NTAwMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQzODgsIAorICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3MzYyMCwgCisgICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUzMzAsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzIwMCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDA3NjAgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzI5MCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAwNzYwLCAKKyAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDc4MCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0Mjc3CisgICAgICAgIH0KK307CisKKyNlbmRpZiAvKl9PTVhEQ1RDT1NUQUJfQ18qLworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU3MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlcgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4ICBzdGFydAorKQoreworICAgIE9NWF9VOCAgbGFzdCA9IDA7CisgICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIHN3aXRjaCAocHJlZERpcikKKyAgICB7CisgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKKyAgICAgICAgeworICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX1ZDX1ZFUlRJQ0FMOgorICAgICAgICB7CisgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKwkJCSAgcERzdCwKKwkJCSAgc2hvcnRWaWRlb0hlYWRlciwKKwkJCSAgc3RhcnQsCisJCQkgICZsYXN0LAorCQkJICAxMCwKKwkJCSAgNjIsCisJCQkgICA3LAorCQkJICAyMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50cmFMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgaWYgKGxhc3QgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YjU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludHJhIGJsb2NrLgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgorICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4IHN0YXJ0CispCit7CisgICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3RhcnQgPiAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZERpciA+IDIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwcmVkRGlyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9NWF9WQ19OT05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgMTQsCisgICAgICAgICAgICAgIDIwLAorICAgICAgICAgICAgICA5LAorICAgICAgICAgICAgICA2LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUKKyAgICAgICAgKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgICAgIAorICAgIH0gLyogUGF0dGVybiBjaGVjayBlbmRzKi8KKworICAgIHJldHVybiAoT01YX1N0c19Ob0Vycik7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M5NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBwdXR0aW5nIFZMQyBiaXRzCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispCit7CisgICAgT01YX0lOVCB0ZW1wSW5kZXg7CisJT01YX1UzMiB0ZW1wUnVuID0gcnVuLCBzaWduID0gMDsKKyAgICBPTVhfUzE2IHRlbXBMZXZlbCA9IGxldmVsOyAKKyAgICAKKyAgICAvKiBFc2NhcGUgc2VxdWVuY2UgYWRkaXRpb24gKi8KKyAgICBpZiAoZk1vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDAsIDEpOworCQl0ZW1wTGV2ZWwgPSBsZXZlbFBsdXM7CisKKyAgICB9CisgICAgZWxzZSBpZihmTW9kZSA9PSAyKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMiwgMik7CisJCXRlbXBSdW4gPSBydW5QbHVzOworICAgIH0KKyAgICBlbHNlIGlmIChmTW9kZSA9PSAzKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgMik7CisgICAgfQorICAgIGVsc2UgaWYgKGZNb2RlID09IDQpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOworCQlpZigodGVtcExldmVsICE9IDApICYmICh0ZW1wTGV2ZWwgIT0gLTEyOCkpCisJCXsKKwkJICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgOCk7CisJCX0KKwkJcmV0dXJuIE9NWF9TdHNfTm9FcnI7CQkKKyAgICB9CisgICAgCisgICAgaWYgKHRlbXBMZXZlbCA8IDApCisgICAgeworICAgICAgICBzaWduID0gMTsKKyAgICAgICAgdGVtcExldmVsID0gYXJtQWJzKHRlbXBMZXZlbCk7CisgICAgfQorICAgIC8qIFB1dHRpbmcgVkxDIGJpdHMgaW4gdGhlIHN0cmVhbSAqLworCWlmIChmTW9kZSA8IDMpCisJeworCQlpZiAodGVtcFJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKKwkJeworCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW21heFJ1bkZvck11bHRpcGxlRW50cmllcyArIDFdICsgCisJCQkJCQkodGVtcFJ1biAtIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAtIDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGVtcEluZGV4ID0gcFJ1bkluZGV4VGFibGUgW3RlbXBSdW5dICsgKHRlbXBMZXZlbCAtMSk7CisJCX0KKyAgICAKKwkJYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCQkJICBwVmxjVGFibGUgW3RlbXBJbmRleF0pOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpc2lnbiwgMSk7CisJfQorICAgIGVsc2UKKwl7CisJCWlmIChzaWduKQorCQl7CisJCQl0ZW1wTGV2ZWwgPSAtdGVtcExldmVsOworCQl9CisJCXRlbXBSdW4gID0gcnVuOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpbGFzdCwgMSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCB0ZW1wUnVuLCA2KTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCSAgIChPTVhfVTMyKSB0ZW1wTGV2ZWwsIDEyKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOworCX0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEyYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBwSW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispCit7CisgICAgLyogU3RvcmUgdGhlIHplcm8ncyBhcyBwZXIgdGhlIHJ1biBsZW5ndGggY291bnQgKi8KKyAgICBmb3IgKDtzdG9yZVJ1biA+IDA7IHN0b3JlUnVuLS0sICgqcEluZGV4KSsrKQorICAgIHsKKyAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKKyAgICB9CisgICAgLyogU3RvcmUgdGhlIGxldmVsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiovCisgICAgaWYgKHNpZ24gPT0gMSkKKyAgICB7CisgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IC1zdG9yZUxldmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSBzdG9yZUxldmVsOworICAgIH0KKyAgICAoKnBJbmRleCkrKzsKKworICAgIC8qIElmIGxhc3QgaXMgMSwgZmlsbCB0aGUgcmVtYWluaW5nIGVsbWVudHMgb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zICovCisgICAgaWYgKGxhc3QgPT0gMSkKKyAgICB7CisgICAgICAgIHdoaWxlICgqcEluZGV4IDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7CisgICAgICAgICAgICAoKnBJbmRleCkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzZjU5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9HZXRWTENCaXRzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKKyAqCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworIAorLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKQoreworICAgIE9NWF9VMzIgc3RvcmVSdW47CisgICAgT01YX1U4ICB0YWJJbmRleCwgbWFya2VyQml0OworICAgIE9NWF9TMTYgc3RvcmVMZXZlbDsKKyAgICBPTVhfVTE2IHVucGFja1JldEluZGV4OworCU9NWF9VOCAgaSwgZlR5cGUsIGVzY2FwZTsJCisJT01YX1U4ICBzaWduID0gMDsKKwkKKwkvKiBVbnBhY2tpbmcgdGhlIGJpdHN0cmVhbSBhbmQgUkxEICovCisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCA2NDspCisgICAgeworCQllc2NhcGUgPSBhcm1Mb29rQWhlYWRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKKwkJaWYgKGVzY2FwZSAhPSAzKQorCQl7CQorCQkJZlR5cGUgPSAwOyAvKiBOb3QgaW4gZXNjYXBlIG1vZGUgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWFybVNraXBCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNyk7CisJCQlpZihzaG9ydFZpZGVvSGVhZGVyKQorCQkJeworCQkJICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJCSAgc3RvcmVSdW4gPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA2KTsKKwkJCSAgc3RvcmVMZXZlbCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDgpOworCQkJICAKKwkJCSAgLyogUmVmIHRvIFRhYmxlIEItMTggKGMpIGluIE1QRUc0IFN0YW5kYXJkLSBGTEMgY29kZSBmb3IgICovCisJCQkgIC8qIExFVkVMIHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIDEsIHRoZSBzdG9yZUxldmVsIGlzICAqLworCQkJICAvKiBhIHNpZ25lZCB2YWx1ZSBhbmQgdGhlIHNpZ24gYW5kIHRoZSB1bnNpZ25lZCB2YWx1ZSBmb3IgKi8KKwkJCSAgLyogc3RvcmVMZXZlbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBhbmQgcGFzc2VkIHRvIGFybSAgICAgICovCisJCQkgIC8qIEZpbGxWTERCdWZmZXIgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICAgICAKKwkJCSAgc2lnbiA9IChzdG9yZUxldmVsICYgMHg4MCk7CisJCQkgIGlmKHNpZ249PTB4ODApCisJCQkgIHsKKwkJCSAgCXN0b3JlTGV2ZWw9KHN0b3JlTGV2ZWxeMHhmZikrMTsJCQkgIAorCQkJICAJc2lnbj0xOworCQkJICAJCisJCQkgIH0KKwkJCSAgCisJCQkgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHNpZ24qc3RvcmVMZXZlbCA9PSAxMjggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCisJCQkgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOworCQkJICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgc2lnbiwKKwkJCSAgICAqcExhc3QsCisJCQkgICAgJmksCisJCQkgICAgcFppZ3phZ1RhYmxlKTsKKwkJCSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKwkJCSAgICAKKwkJCX0KKwkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKKwkJCXsKKwkJCQlpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkpCisJCQkJeworCQkJCQlmVHlwZSA9IDM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWZUeXBlID0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZlR5cGUgPSAxOworCQkJfQorCQl9CisKKwkgICAgaWYgKGZUeXBlIDwgMykKKwkgICAgeworCSAgICAgICAgdW5wYWNrUmV0SW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKwkJCQkJCQkJCQlwVmxjVGFibGVMMCk7CisJCQlpZiAodW5wYWNrUmV0SW5kZXggIT0gQVJNX05PX0NPREVCT09LX0lOREVYKQorCQkgICAgeworCQkJICAgIC8qIERlY29kZSBydW4gYW5kIGxldmVsIGZyb20gdGhlIGluZGV4ICovCisJCQkgICAgLyogbGFzdCA9IDAgKi8KKwkJCSAgICAqcExhc3QgPSAwOworCQkJICAgIGlmICh1bnBhY2tSZXRJbmRleCA+IG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApCisJCQkgICAgeworCQkJCSAgICBzdG9yZUxldmVsID0gMTsKKwkJCQkgICAgc3RvcmVSdW4gPSAodW5wYWNrUmV0SW5kZXggLSBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwKSAKKwkJCQkJCQkrIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwwW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCQkKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisJCQkgICAgfQorCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCisJCQkgICAgeworCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwwW3N0b3JlTGV2ZWwtMV0gKyAxOworCQkJICAgIH0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCSAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKwkJCQkJCQkJCQkJcFZsY1RhYmxlTDEpOworCisJCQkgICAgYXJtUmV0RGF0YUVycklmKHVucGFja1JldEluZGV4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisJCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KKwkJCSAgICAvKiBsYXN0ID0gMSAqLworCQkJICAgICpwTGFzdCA9IDE7CisJCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAxOworCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEpIAorCQkJCQkJCSsgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDE7CisJCSAgICAgICAgfQorCQkgICAgICAgIGVsc2UKKwkJCSAgICB7CisJCQkJICAgIHRhYkluZGV4ID0gMTsKKwkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQorCQkJCSAgICB7CisJCQkJCSAgICB0YWJJbmRleCsrOworCQkJCSAgICB9CisJCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOworCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwxW3RhYkluZGV4IC0gMV0gKyAxOworCQkJICAgIH0KKwkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisKKwkJCSAgICBpZiAoZlR5cGUgPT0gMSkKKwkJCSAgICB7CisJCQkgICAgICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwxW3N0b3JlUnVuXSk7CQkJCQorCQkJICAgIH0KKwkJCSAgICBlbHNlIGlmIChmVHlwZSA9PSAyKQorCQkJICAgIHsKKwkJCQkgICAgc3RvcmVSdW4gPSBzdG9yZVJ1biArIHBSTUFYVGFibGVMMVtzdG9yZUxldmVsLTFdICsgMTsKKwkJCSAgICB9CisJCSAgICB9CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKKwkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorCQkJICAgIHN0b3JlUnVuLAorCQkJICAgIHBEc3QsCisJCQkgICAgc3RvcmVMZXZlbCwKKwkJCSAgICBzaWduLAorCQkJICAgICpwTGFzdCwKKwkJCSAgICAmaSwKKwkJCSAgICBwWmlnemFnVGFibGUpOwkJCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCSAgICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIHN0b3JlUnVuICA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOworCQkgICAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7CisJCSAgICBtYXJrZXJCaXQgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIGFybVJldERhdGFFcnJJZiggbWFya2VyQml0ID09IDAsIE9NWF9TdHNfRXJyKTsKKwkJICAgIHN0b3JlTGV2ZWwgID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMTIpOworCQkgICAgaWYgKHN0b3JlTGV2ZWwgJiAweDgwMCkKKwkJICAgIHsKKwkJCSAgICBzdG9yZUxldmVsIC09IDQwOTY7CisJCSAgICB9CQkJCisJCSAgICBhcm1SZXREYXRhRXJySWYoIHN0b3JlTGV2ZWwgPT0gMCB8fCBzdG9yZUxldmVsID09IC0yMDQ4ICwgT01YX1N0c19FcnIpOyAvKiBJbnZhbGlkIEZMQyAqLworCQkgICAgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7CisJCSAgICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKwkJCSAgICBzdG9yZVJ1biwKKwkJCSAgICBwRHN0LAorCQkJICAgIHN0b3JlTGV2ZWwsCisJCQkgICAgMCwgLyogU2lnbiBpcyBub3QgdXNlZCwgcHJlcHJvY2Vzc2luZyBkb25lICovCisJCQkgICAgKnBMYXN0LAorCQkJICAgICZpLAorCQkJICAgIHBaaWd6YWdUYWJsZSk7CisKKwkgICAgfQorICAgIH0gLyogRW5kIG9mIGZvcmxvb3AgZm9yIGkgKi8KKwlyZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIEZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdlOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKQEAgLTAsMCArMSw0OTUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAwIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV0gPSAKK3sgCisgICAgMCwgMjcsIDM3LCA0MiwgNDYsIDQ5LCA1MiwgCisgICAgNTUsIDU4LCA2MCwgNjIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAxNAorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XSA9IAoreworICAgICAgICB7MiwgICAgMn0sCisgICAgICAgIHszLCAgICA2fSwKKyAgICAgICAgezQsICAgIDE1fSwKKyAgICAgICAgezUsICAgIDEzfSwKKyAgICAgICAgezUsICAgIDEyfSwKKyAgICAgICAgezYsICAgIDIxfSwKKyAgICAgICAgezYsICAgIDE5fSwKKyAgICAgICAgezYsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDMxfSwKKyAgICAgICAgezgsICAgIDMwfSwKKyAgICAgICAgezgsICAgIDI5fSwKKyAgICAgICAgezksICAgIDM3fSwKKyAgICAgICAgezksICAgIDM2fSwKKyAgICAgICAgezksICAgIDM1fSwKKyAgICAgICAgezksICAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMzfSwKKyAgICAgICAgezEwLCAgIDMyfSwKKyAgICAgICAgezEwLCAgIDE1fSwKKyAgICAgICAgezEwLCAgIDE0fSwKKyAgICAgICAgezExLCAgICA3fSwKKyAgICAgICAgezExLCAgICA2fSwKKyAgICAgICAgezExLCAgIDMyfSwKKyAgICAgICAgezExLCAgIDMzfSwKKyAgICAgICAgezEyLCAgIDgwfSwKKyAgICAgICAgezEyLCAgIDgxfSwKKyAgICAgICAgezEyLCAgIDgyfSwKKyAgICAgICAgezQsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDIwfSwKKyAgICAgICAgezcsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDI4fSwKKyAgICAgICAgezksICAgIDMyfSwKKyAgICAgICAgezksICAgIDMxfSwKKyAgICAgICAgezEwLCAgIDEzfSwKKyAgICAgICAgezExLCAgIDM0fSwKKyAgICAgICAgezEyLCAgIDgzfSwKKyAgICAgICAgezEyLCAgIDg1fSwKKyAgICAgICAgezUsICAgIDExfSwKKyAgICAgICAgezcsICAgIDIxfSwKKyAgICAgICAgezksICAgIDMwfSwKKyAgICAgICAgezEwLCAgIDEyfSwKKyAgICAgICAgezEyLCAgIDg2fSwKKyAgICAgICAgezYsICAgIDE3fSwKKyAgICAgICAgezgsICAgIDI3fSwKKyAgICAgICAgezksICAgIDI5fSwKKyAgICAgICAgezEwLCAgIDExfSwKKyAgICAgICAgezYsICAgIDE2fSwKKyAgICAgICAgezksICAgIDM0fSwKKyAgICAgICAgezEwLCAgIDEwfSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezksICAgIDI4fSwKKyAgICAgICAgezEwLCAgICA4fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezksICAgIDI3fSwKKyAgICAgICAgezEyLCAgIDg0fSwKKyAgICAgICAgezcsICAgIDIwfSwKKyAgICAgICAgezksICAgIDI2fSwKKyAgICAgICAgezEyLCAgIDg3fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezEwLCAgICA5fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezExLCAgIDM1fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezAsICAgICAwfQorfTsKKworLyogCisqICBGb3IgSW50cmEKKyogIGxhc3QgPSAxIAorKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzhdID0gCit7CisgICAgMCwgIDgsIDExLCAxMywgMTUsIDE3LCAxOSwgMjEKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyMAorKiAgKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XSA9IAoreworICAgICAgICB7NCwgICAgIDd9LAorICAgICAgICB7NiwgICAgMTJ9LAorICAgICAgICB7OCwgICAgMjJ9LAorICAgICAgICB7OSwgICAgMjN9LAorICAgICAgICB7MTAsICAgIDZ9LAorICAgICAgICB7MTEsICAgIDV9LAorICAgICAgICB7MTEsICAgIDR9LAorICAgICAgICB7MTIsICAgODl9LAorICAgICAgICB7NiwgICAgMTV9LAorICAgICAgICB7OSwgICAgMjJ9LAorICAgICAgICB7MTAsICAgIDV9LAorICAgICAgICB7NiwgICAgMTR9LAorICAgICAgICB7MTAsICAgIDR9LAorICAgICAgICB7NywgICAgMTd9LAorICAgICAgICB7MTEsICAgMzZ9LAorICAgICAgICB7NywgICAgMTZ9LAorICAgICAgICB7MTEsICAgMzd9LAorICAgICAgICB7NywgICAgMTl9LAorICAgICAgICB7MTIsICAgOTB9LAorICAgICAgICB7OCwgICAgMjF9LAorICAgICAgICB7MTIsICAgOTF9LAorICAgICAgICB7OCwgICAgMjB9LAorICAgICAgICB7OCwgICAgMTl9LAorICAgICAgICB7OCwgICAgMjZ9LAorICAgICAgICB7OSwgICAgMjF9LAorICAgICAgICB7OSwgICAgMjB9LAorICAgICAgICB7OSwgICAgMTl9LAorICAgICAgICB7OSwgICAgMTh9LAorICAgICAgICB7OSwgICAgMTd9LAorICAgICAgICB7MTEsICAgMzh9LAorICAgICAgICB7MTEsICAgMzl9LAorICAgICAgICB7MTIsICAgOTJ9LAorICAgICAgICB7MTIsICAgOTN9LAorICAgICAgICB7MTIsICAgOTR9LAorICAgICAgICB7MTIsICAgOTV9LCAgCisgICAgICAgIHswLCAgICAgMH0KK307CisKKy8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMExNQVhbMTVdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXSA9IAoreworICAgIDgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJNQVhbMjddID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJNQVhbOF0gPQoreworICAgMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCisvKiAKKyogIEZvciBJbnRlcgorKiAgbGFzdCA9IDAgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUnVuSWR4WzEyXSA9IAoreyAKKyAgICAgMCwgIDEyLCAgMTgsICAyMiwgIDI1LCAgMjgsICAKKyAgICAzMSwgIDM0LCAgMzYsICAzOCwgIDQwLCAgNDIKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byAyNgorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XSA9IAoreworICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7NCwgICAgMTV9LAorICAgICAgICB7NiwgICAgMjF9LAorICAgICAgICB7NywgICAgMjN9LAorICAgICAgICB7OCwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzd9LAorICAgICAgICB7OSwgICAgMzZ9LAorICAgICAgICB7MTAsICAgMzN9LAorICAgICAgICB7MTAsICAgMzJ9LAorICAgICAgICB7MTEsICAgIDd9LAorICAgICAgICB7MTEsICAgIDZ9LAorICAgICAgICB7MTEsICAgMzJ9LAorICAgICAgICB7MywgICAgIDZ9LAorICAgICAgICB7NiwgICAgMjB9LAorICAgICAgICB7OCwgICAgMzB9LAorICAgICAgICB7MTAsICAgMTV9LAorICAgICAgICB7MTEsICAgMzN9LAorICAgICAgICB7MTIsICAgODB9LAorICAgICAgICB7NCwgICAgMTR9LAorICAgICAgICB7OCwgICAgMjl9LAorICAgICAgICB7MTAsICAgMTR9LAorICAgICAgICB7MTIsICAgODF9LAorICAgICAgICB7NSwgICAgMTN9LAorICAgICAgICB7OSwgICAgMzV9LAorICAgICAgICB7MTAsICAgMTN9LAorICAgICAgICB7NSwgICAgMTJ9LAorICAgICAgICB7OSwgICAgMzR9LAorICAgICAgICB7MTIsICAgODJ9LAorICAgICAgICB7NSwgICAgMTF9LAorICAgICAgICB7MTAsICAgMTJ9LAorICAgICAgICB7MTIsICAgODN9LAorICAgICAgICB7NiwgICAgMTl9LAorICAgICAgICB7MTAsICAgMTF9LAorICAgICAgICB7MTIsICAgODR9LAorICAgICAgICB7NiwgICAgMTh9LAorICAgICAgICB7MTAsICAgMTB9LAorICAgICAgICB7NiwgICAgMTd9LAorICAgICAgICB7MTAsICAgIDl9LAorICAgICAgICB7NiwgICAgMTZ9LAorICAgICAgICB7MTAsICAgIDh9LAorICAgICAgICB7NywgICAgMjJ9LAorICAgICAgICB7MTIsICAgODV9LAorICAgICAgICB7NywgICAgMjF9LAorICAgICAgICB7NywgICAgMjB9LAorICAgICAgICB7OCwgICAgMjh9LAorICAgICAgICB7OCwgICAgMjd9LAorICAgICAgICB7OSwgICAgMzN9LAorICAgICAgICB7OSwgICAgMzJ9LAorICAgICAgICB7OSwgICAgMzF9LAorICAgICAgICB7OSwgICAgMzB9LAorICAgICAgICB7OSwgICAgMjl9LAorICAgICAgICB7OSwgICAgMjh9LAorICAgICAgICB7OSwgICAgMjd9LAorICAgICAgICB7OSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgMzR9LAorICAgICAgICB7MTEsICAgMzV9LAorICAgICAgICB7MTIsICAgODZ9LAorICAgICAgICB7MTIsICAgODd9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworIAorCisvKiAKKyogIEZvciBJbnRyYQorKiAgbGFzdCA9IDEgCisqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM10gPSAKK3sKKyAgICAwLCAzLCA1Cit9OworCisvKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAorKiAgZm9yIHJ1biA9IDAgdG8gNDAKKyogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZworKi8KK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV0gPSAKK3sKKyAgICAgICAgezQsICAgICA3fSwKKyAgICAgICAgezksICAgIDI1fSwKKyAgICAgICAgezExLCAgICA1fSwKKyAgICAgICAgezYsICAgIDE1fSwKKyAgICAgICAgezExLCAgICA0fSwKKyAgICAgICAgezYsICAgIDE0fSwKKyAgICAgICAgezYsICAgIDEzfSwKKyAgICAgICAgezYsICAgIDEyfSwKKyAgICAgICAgezcsICAgIDE5fSwKKyAgICAgICAgezcsICAgIDE4fSwKKyAgICAgICAgezcsICAgIDE3fSwKKyAgICAgICAgezcsICAgIDE2fSwKKyAgICAgICAgezgsICAgIDI2fSwKKyAgICAgICAgezgsICAgIDI1fSwKKyAgICAgICAgezgsICAgIDI0fSwKKyAgICAgICAgezgsICAgIDIzfSwKKyAgICAgICAgezgsICAgIDIyfSwKKyAgICAgICAgezgsICAgIDIxfSwKKyAgICAgICAgezgsICAgIDIwfSwKKyAgICAgICAgezgsICAgIDE5fSwKKyAgICAgICAgezksICAgIDI0fSwKKyAgICAgICAgezksICAgIDIzfSwKKyAgICAgICAgezksICAgIDIyfSwKKyAgICAgICAgezksICAgIDIxfSwKKyAgICAgICAgezksICAgIDIwfSwKKyAgICAgICAgezksICAgIDE5fSwKKyAgICAgICAgezksICAgIDE4fSwKKyAgICAgICAgezksICAgIDE3fSwKKyAgICAgICAgezEwLCAgICA3fSwKKyAgICAgICAgezEwLCAgICA2fSwKKyAgICAgICAgezEwLCAgICA1fSwKKyAgICAgICAgezEwLCAgICA0fSwKKyAgICAgICAgezExLCAgIDM2fSwKKyAgICAgICAgezExLCAgIDM3fSwKKyAgICAgICAgezExLCAgIDM4fSwKKyAgICAgICAgezExLCAgIDM5fSwKKyAgICAgICAgezEyLCAgIDg4fSwKKyAgICAgICAgezEyLCAgIDg5fSwKKyAgICAgICAgezEyLCAgIDkwfSwKKyAgICAgICAgezEyLCAgIDkxfSwKKyAgICAgICAgezEyLCAgIDkyfSwKKyAgICAgICAgezEyLCAgIDkzfSwKKyAgICAgICAgezEyLCAgIDk0fSwKKyAgICAgICAgezEyLCAgIDk1fSwKKyAgICAgICAgeyAwLCAgICAwfQorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN10gPSAKK3sKKyAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCisgICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLAorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV0gPSAKK3sKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJNQVhbMTJdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorfTsKKworLyogUk1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJNQVhbM10gPSAKK3sKKyAgIDQwLCAgMSwgIDAKK307CisKKy8qIAorKiAgRm9yIEludHJhIC0gTHVtaW5hbmNlCisqLworCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MywgICAgIDN9LAorICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MywgICAgIDJ9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyogIEZvciBJbnRyYSAtIENocm9taW5hbmNlCisqLworIAorY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzE0XSA9IAoreworICAgICAgICB7MiwgICAgIDN9LAorICAgICAgICB7MiwgICAgIDJ9LAorICAgICAgICB7MiwgICAgIDF9LAorICAgICAgICB7MywgICAgIDF9LAorICAgICAgICB7NCwgICAgIDF9LAorICAgICAgICB7NSwgICAgIDF9LAorICAgICAgICB7NiwgICAgIDF9LAorICAgICAgICB7NywgICAgIDF9LAorICAgICAgICB7OCwgICAgIDF9LAorICAgICAgICB7OSwgICAgIDF9LAorICAgICAgICB7MTAsICAgIDF9LAorICAgICAgICB7MTEsICAgIDF9LAorICAgICAgICB7MTIsICAgIDF9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyAqICBNb3Rpb24gdmVjdG9yIGRlY29kaW5nIHRhYmxlCisgKi8KKyAKK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl0gPQoreworICAgICAgICB7MTMsICAgICA1fSwKKyAgICAgICAgezEzLCAgICAgN30sCisgICAgICAgIHsxMiwgICAgIDV9LAorICAgICAgICB7MTIsICAgICA3fSwKKyAgICAgICAgezEyLCAgICAgOX0sCisgICAgICAgIHsxMiwgICAgMTF9LAorICAgICAgICB7MTIsICAgIDEzfSwKKyAgICAgICAgezEyLCAgICAxNX0sCisgICAgICAgIHsxMSwgICAgIDl9LAorICAgICAgICB7MTEsICAgIDExfSwKKyAgICAgICAgezExLCAgICAxM30sCisgICAgICAgIHsxMSwgICAgMTV9LAorICAgICAgICB7MTEsICAgIDE3fSwKKyAgICAgICAgezExLCAgICAxOX0sCisgICAgICAgIHsxMSwgICAgMjF9LAorICAgICAgICB7MTEsICAgIDIzfSwKKyAgICAgICAgezExLCAgICAyNX0sCisgICAgICAgIHsxMSwgICAgMjd9LAorICAgICAgICB7MTEsICAgIDI5fSwKKyAgICAgICAgezExLCAgICAzMX0sCisgICAgICAgIHsxMSwgICAgMzN9LAorICAgICAgICB7MTEsICAgIDM1fSwKKyAgICAgICAgezEwLCAgICAxOX0sCisgICAgICAgIHsxMCwgICAgMjF9LAorICAgICAgICB7MTAsICAgIDIzfSwKKyAgICAgICAgezgsICAgICAgN30sCisgICAgICAgIHs4LCAgICAgIDl9LAorICAgICAgICB7OCwgICAgIDExfSwKKyAgICAgICAgezcsICAgICAgN30sCisgICAgICAgIHs1LCAgICAgIDN9LAorICAgICAgICB7NCwgICAgICAzfSwKKyAgICAgICAgezMsICAgICAgM30sCisgICAgICAgIHsxLCAgICAgIDF9LAorICAgICAgICB7MywgICAgICAyfSwKKyAgICAgICAgezQsICAgICAgMn0sCisgICAgICAgIHs1LCAgICAgIDJ9LAorICAgICAgICB7NywgICAgICA2fSwKKyAgICAgICAgezgsICAgICAxMH0sCisgICAgICAgIHs4LCAgICAgIDh9LAorICAgICAgICB7OCwgICAgICA2fSwKKyAgICAgICAgezEwLCAgICAyMn0sCisgICAgICAgIHsxMCwgICAgMjB9LAorICAgICAgICB7MTAsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAzNH0sCisgICAgICAgIHsxMSwgICAgMzJ9LAorICAgICAgICB7MTEsICAgIDMwfSwKKyAgICAgICAgezExLCAgICAyOH0sCisgICAgICAgIHsxMSwgICAgMjZ9LAorICAgICAgICB7MTEsICAgIDI0fSwKKyAgICAgICAgezExLCAgICAyMn0sCisgICAgICAgIHsxMSwgICAgMjB9LAorICAgICAgICB7MTEsICAgIDE4fSwKKyAgICAgICAgezExLCAgICAxNn0sCisgICAgICAgIHsxMSwgICAgMTR9LAorICAgICAgICB7MTEsICAgIDEyfSwKKyAgICAgICAgezExLCAgICAxMH0sCisgICAgICAgIHsxMSwgICAgIDh9LAorICAgICAgICB7MTIsICAgIDE0fSwKKyAgICAgICAgezEyLCAgICAxMn0sCisgICAgICAgIHsxMiwgICAgMTB9LAorICAgICAgICB7MTIsICAgICA4fSwKKyAgICAgICAgezEyLCAgICAgNn0sCisgICAgICAgIHsxMiwgICAgIDR9LAorICAgICAgICB7MTMsICAgICA2fSwKKyAgICAgICAgezEzLCAgICAgNH0sCisgICAgICAgIHsgMCwgICAgIDB9Cit9OworCisvKiBFbmQgb2YgZmlsZSAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWVmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfUHV0VkxDQml0cy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBwdXQgYml0cyB0byBiaXRzdHJlYW0gCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisKKyAKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispCit7CisKKyAgICBPTVhfVTMyIHN0b3JlUnVuID0gMCwgcnVuLCBzdG9yZVJ1blBsdXM7CisgICAgT01YX1U4ICBsYXN0ID0gMCwgZmlyc3QgPSAxLCBmTW9kZTsKKyAgICBPTVhfUzE2IGxldmVsLCBzdG9yZUxldmVsID0gMCwgc3RvcmVMZXZlbFBsdXM7CisgICAgT01YX0lOVCBpOworICAgIAorICAgICAgICAvKiBSTEUgZW5jb2RpbmcgYW5kIHBhY2tpbmcgdGhlIGJpdHMgaW50byB0aGUgc3RyZWFtcyAqLworICAgICAgICBmb3IgKGkgPSBzdGFydCwgcnVuPTA7IGkgPCA2NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbCAgID0gcFFEY3RCbGtDb2VmW3BaaWd6YWdUYWJsZVtpXV07CisKKyAgICAgICAgICAgIC8qIENvdW50aW5nIHRoZSBydW4gKi8KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGb3VuZCBhIG5vbi16ZXJvIGNvZWZmICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMFthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKKwkJCQkJCQkJCSAgc3RvcmVSdW5QbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAorCQkJCQkJCQkJICBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgc3RvcmVSdW4gICA9IHJ1bjsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8qIGVuZCBvZiBmb3IgbG9vcCBmb3IgNjQgZWxlbWVudHMgKi8KKworICAgICAgICAvKiB3cml0aW5nIHRoZSBsYXN0IGVsZW1lbnQgKi8KKyAgICAgICAgbGFzdCA9IDE7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCisgICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCisgICAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwxW3J1bl0pOworICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAorICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDFbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKKyAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSk7CisgICAgICAgIAorICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAorCQkJCQkJICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKKwkJCQkJCSAgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwxKTsKKwlyZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2QwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKykKK3sKKyAgICBPTVhfVTggIGJsb2NrRENMZWZ0OworICAgIE9NWF9VOCAgYmxvY2tEQ1RvcDsKKyAgICBPTVhfVTggIGJsb2NrRENUb3BMZWZ0OworCisgICAgaWYgKGJsb2NrSW5kZXggPT0gMykKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqKHBDb2VmQnVmQ29sIC0gOCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJsb2NrRENUb3AgPSAqcENvZWZCdWZSb3c7CisgICAgfQorICAgIGJsb2NrRENMZWZ0ID0gKnBDb2VmQnVmQ29sOworICAgIGJsb2NrRENUb3BMZWZ0ID0gKihwQ29lZkJ1ZlJvdyAtIDgpOworCisgICAgaWYgKGFybUFicyhibG9ja0RDTGVmdCAtIGJsb2NrRENUb3BMZWZ0KSA8IGFybUFicyhibG9ja0RDVG9wTGVmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmxvY2tEQ1RvcCkpCisgICAgeworICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19WRVJUSUNBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfSE9SSVpPTlRBTDsKKyAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlswXTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0N2M2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpAQCAtMCwwICsxLDU4IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XSA9IAoreworICAgICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKKyAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCisgICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAgIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwgCisgICAgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAorICAgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCisgICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCit9OworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICAxLCAgMiwgIDMsICA4LCAgOSwgMTYsIDE3LAorICAgIDEwLCAxMSwgIDQsICA1LCAgNiwgIDcsIDE1LCAxNCwKKyAgICAxMywgMTIsIDE5LCAxOCwgMjQsIDI1LCAzMiwgMzMsCisgICAgMjYsIDI3LCAyMCwgMjEsIDIyLCAyMywgMjgsIDI5LAorICAgIDMwLCAzMSwgMzQsIDM1LCA0MCwgNDEsIDQ4LCA0OSwKKyAgICA0MiwgNDMsIDM2LCAzNywgMzgsIDM5LCA0NCwgNDUsIAorICAgIDQ2LCA0NywgNTAsIDUxLCA1NiwgNTcsIDU4LCA1OSwKKyAgICA1MiwgNTMsIDU0LCA1NSwgNjAsIDYxLCA2MiwgNjMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICA4LCAxNiwgMjQsICAxLCAgOSwgIDIsIDEwLAorICAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCA1NywgNDksCisgICAgIDQxLCAzMywgMjYsIDE4LCAgMywgMTEsICA0LCAxMiwKKyAgICAgMTksIDI3LCAzNCwgNDIsIDUwLCA1OCwgMzUsIDQzLAorICAgICA1MSwgNTksIDIwLCAyOCwgIDUsIDEzLCAgNiwgMTQsCisgICAgIDIxLCAyOSwgMzYsIDQ0LCA1MiwgNjAsIDM3LCA0NSwgCisgICAgIDUzLCA2MSwgMjIsIDMwLCAgNywgMTUsIDIzLCAzMSwKKyAgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzCit9OworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAorICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworCisgICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDE2eDE2ICovCisgICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTk2ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiA4eDggKi8KKyAgICBPTVhfVTggQmxvY2tTaXplID0gODsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTRlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCisgKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAorICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAorICogICAgICAgICAgICAtNC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKKyAgIAorICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKKyAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIHBTcmNSZWZCdWYsCisgICAgIHJlZldpZHRoLAorICAgICBwUmVmUmVjdCwKKyAgICAgcFNyY0N1cnJCdWYsCisgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgIHBTcmNQcmVNViwKKyAgICAgcFNyY1ByZVNBRCwKKyAgICAgcE1FU3BlYywKKyAgICAgcERzdE1WLAorICAgICBwRHN0U0FELAorICAgICBCbG9ja1NpemUpCisgICAgICk7CisKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2U2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQKKykKK3sKKyAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OworICAgCisgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgCisgICByZXR1cm4gKCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBwU3JjUmVmQnVmLAorICAgICByZWZXaWR0aCwKKyAgICAgcFJlZlJlY3QsCisgICAgIHBTcmNDdXJyQnVmLAorICAgICBwQ3VyclBvaW50UG9zLAorICAgICBwU3JjUHJlTVYsCisgICAgIHBTcmNQcmVTQUQsCisgICAgIHBNRVNwZWMsCisgICAgIHBEc3RNViwKKyAgICAgcERzdFNBRCwKKyAgICAgQmxvY2tTaXplKQorICAgICApOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzdhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RDVDh4OGJsay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBEQ1QKKyAqIAorICovCisgCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0RDVF9UYWJsZS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKK3sKKyAgICBPTVhfSU5UIHgsIHksIHUsIHY7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKKyAgICB7CisgICAgICAgIGZvciAodiA9IDA7IHYgPCA4OyB2KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHggKiA4KSArIHldICoKKyAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeF1bdV0gKgorICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh1ICogOCkgKyB2XT0gYXJtUm91bmRGbG9hdFRvUzE2IChzdW0pOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmN2JhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXIsIGksIGosIGNvdW50OworICAgIE9NWF9JTlQgIHByZWRRUDsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocENvZWZCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRUEJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChjdXJRUCA8PSAwKSB8fCAoY3VyUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID4gNSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3RlcCAlIDgpICE9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICBhcm1SZXRBcmdFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIGZvciAoaiA9IDAsIGNvdW50ID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpXSA9IGFybUNsaXAgKDAsIDI1NSwgcFRlbXBCdWYyW2NvdW50XSk7CisgICAgICAgIH0KKyAgICAgICAgcERzdCArPSBzdGVwOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE1OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCkBAIC0wLDAgKzEsMjQzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBkZWNvZGluZyBNViBhbmQgcGFkZGluZyB0aGUgc2FtZQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKKyAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKKyAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCisgKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCisgKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAorICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKKyAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAorICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKKyAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAorICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAorICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAorICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBzeW50YXggCisgKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCisgKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KKyAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCisgKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBEc3RNVkN1ck1CLAorICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWRNRVsxMl07CisgICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7CisgICAgT01YX1MzMiBtdkhvclJlc2lkdWFsID0gMSwgbXZWZXJSZXNpZHVhbCA9IDEsIG12SG9yRGF0YSwgbXZWZXJEYXRhOworICAgIE9NWF9TOCBzY2FsZUZhY3RvciwgaW5kZXg7CisgICAgT01YX1MxNiBoaWdoLCBsb3csIHJhbmdlOworCisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoZmNvZGVGb3J3YXJkIDwgMSkgfHwgKGZjb2RlRm9yd2FyZCA+IDcpKSwgXAorICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3RNVkN1ck1CKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKKyAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKKyAgICAgICApCisgICAgeworICAgICAgICAvKiBBbGwgTVYncyBhcmUgemVybyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keCA9IDA7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpXS5keSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyAgICB9CisKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0VikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0Vl9RKSkKKyAgICB7CisgICAgICAgIGNvdW50ID0gNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSAxOworICAgIH0KKworICAgIC8qIENhbGN1bGF0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KKyAgICBzY2FsZUZhY3RvciA9IDEgPDwgKGZjb2RlRm9yd2FyZCAtMSk7CisgICAgaGlnaCA9ICAoIDMyICogc2NhbGVGYWN0b3IpIC0gMTsKKyAgICBsb3cgPSAgICggKC0zMikgKiBzY2FsZUZhY3Rvcik7CisgICAgcmFuZ2UgPSAoIDY0ICogc2NhbGVGYWN0b3IpOworCisgICAgLyogSHVmZm1hbiBkZWNvZGluZyBhbmQgTVYgcmVjb25zdHJ1Y3Rpb24gKi8KKyAgICBmb3IgKGlCbGsgPSAwOyBpQmxrIDwgY291bnQ7IGlCbGsrKykKKyAgICB7CisKKyAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgSG9yaXpvbnRhbCBkYXRhIGFuZCByZXNpZHVhbCAqLworICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRCk7CisgICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOworCisgICAgICAgIG12SG9yRGF0YSA9IGluZGV4IC0gMzI7CisKKyAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZIb3JEYXRhICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IFZlcnRpY2FsIGRhdGEgYW5kIHJlc2lkdWFsICovCisgICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgbXZWZXJEYXRhID0gaW5kZXggLSAzMjsKKworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdlZlckRhdGEgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGRpZmZlcnRpYWwgTVYgKi8KKyAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12SG9yRGF0YSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9IG12SG9yRGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keCA9ICgoYXJtQWJzKG12SG9yRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIG12SG9yUmVzaWR1YWwgKyAxOworICAgICAgICAgICAgaWYgKG12SG9yRGF0YSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmZk1WLmR4ID0gLWRpZmZNVi5keDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdlZlckRhdGEgPT0gMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSBtdlZlckRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmTVYuZHkgPSAoKGFybUFicyhtdlZlckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBtdlZlclJlc2lkdWFsICsgMTsKKyAgICAgICAgICAgIGlmIChtdlZlckRhdGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZmZNVi5keSA9IC1kaWZmTVYuZHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZwRHN0TVZDdXJNQltpQmxrXSwKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FLAorICAgICAgICAgICAgaUJsayk7CisKKyAgICAgICAgLyogQWRkaW5nIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0ZWQgTVYgdG8gcmVjb25zdHJ1Y3QgTVYgKi8KKyAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gZGlmZk1WLmR4OworICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSBkaWZmTVYuZHk7CisKKyAgICAgICAgLyogQ2hlY2tpbmcgdGhlIHJhbmdlIGFuZCBrZWVwaW5nIGl0IHdpdGhpbiB0aGUgbGltaXRzICovCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHggPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHggPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCAtPSByYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcERzdE1WQ3VyTUJbaUJsa10uZHkgPCBsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocERzdE1WQ3VyTUJbaUJsa10uZHkgPiBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keSAtPSByYW5nZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBwRHN0TVZDdXJNQlsxXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlsyXSA9IHBEc3RNVkN1ck1CWzBdOworICAgICAgICBwRHN0TVZDdXJNQlszXSA9IHBEc3RNVkN1ck1CWzBdOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE4ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50ZXIgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICBPTVhfVTggIGxhc3Qsc3RhcnQgPSAwOworICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKwkJCSAgcERzdCwKKwkJCSAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgc3RhcnQsCisJCQkgICZsYXN0LAorCQkJICAxMSwKKwkJCSAgNDIsCisJCQkgICAyLAorCQkJICAgNSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgaWYgKGxhc3QgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTkzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCisgKiBmb3IgaW50cmEgYmxvY2suCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KKworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBEc3QsCisgICAgIHByZWREaXIsCisgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMDBkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgLyogRHVtbXkgaW5pdGlsYWl6YXRpb24gdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCisgICAgT01YX1M4ICBEQ1ZhbHVlU2l6ZSA9IDA7CisgICAgT01YX1UxNiBwb3dPZlNpemUsIGZldGNoRENiaXRzOworICAgIE9NWF9VOCBzdGFydCA9IDE7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KKyAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleCk7CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCisgICAgeworICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4KTsKKyAgICB9CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID09IC0xLCBPTVhfU3RzX0Vycik7CisgICAgYXJtUmV0RGF0YUVycklmKERDVmFsdWVTaXplID4gMTIsIE9NWF9TdHNfRXJyKTsKKworCisgICAgaWYgKERDVmFsdWVTaXplID09IDApCisgICAgeworICAgICAgICBwRHN0WzBdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmV0Y2hEQ2JpdHMgPSAoT01YX1UxNikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKKworICAgICAgICBpZiAoIChmZXRjaERDYml0cyA+PiAoRENWYWx1ZVNpemUgLSAxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsdWxhdGUgcG93ICovCisgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgIHBEc3RbMF0gPSAgKE9NWF9TMTYpIChmZXRjaERDYml0cyBeIChwb3dPZlNpemUgLSAxKSk7CisgICAgICAgICAgICBwRHN0WzBdID0gLXBEc3RbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0WzBdID0gZmV0Y2hEQ2JpdHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICB7CisgICAgICAgICAgICAvKiByZWFkaW5nIGFuZCBjaGVja2luZyB0aGUgbWFya2VyIGJpdCovCisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpID09IDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgICBzdGFydCk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjJiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZU1WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgorICoKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZCwgZGlmZk1WOworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gd2FybmluZyAqLworICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOworICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCwgbXZWZXJSZXNpZHVhbCwgbXZIb3JEYXRhLCBtdlZlckRhdGE7CisgICAgT01YX1U4IHNjYWxlRmFjdG9yLCBpbmRleDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCisgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8CisgICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCisgICAgICAgKQorICAgIHsKKyAgICAgICAgLyogTm8gY2FuZGlkYXRlIHZlY3RvcnMgaGVuY2UgbWFrZSB0aGVtIHplcm8gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR4ID0gMDsKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSA0OworICAgIH0KKyAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBjb3VudCA9IDE7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLworICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKKworICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQorICAgIHsKKworICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKKyAgICAgICAgICAgIHBNVkN1ck1CLAorICAgICAgICAgICAgcFNyY01WTGVmdE1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKKyAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICAgICAgICAgICZkc3RNVlByZWQsCisgICAgICAgICAgICBkc3RNVlByZWRNRSwKKyAgICAgICAgICAgIGlCbGsgKTsKKworICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVyZW50aWFsIG1vdGlvbiB2ZWN0b3IgKGRpZmZNVikgKi8KKyAgICAgICAgZGlmZk1WLmR4ID0gcE1WQ3VyTUJbaUJsa10uZHggLSBkc3RNVlByZWQuZHg7CisgICAgICAgIGRpZmZNVi5keSA9IHBNVkN1ck1CW2lCbGtdLmR5IC0gZHN0TVZQcmVkLmR5OworCisgICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgSG9yaXphbnRhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZIb3JEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHgpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12SG9yRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR4KSAtIG12SG9yUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdkhvckRhdGEgPSAtbXZIb3JEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBWZXJ0aWNhbCBNViAqLworICAgICAgICBpZiAoZGlmZk1WLmR5ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAwOworICAgICAgICAgICAgbXZWZXJEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHkpIC0gMSkgJSBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIG12VmVyRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR5KSAtIG12VmVyUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7CisgICAgICAgICAgICBpZiAoZGlmZk1WLmR5IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdlZlckRhdGEgPSAtbXZWZXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSHVmZm1hbiBlbmNvZGluZyAqLworCisgICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKKyAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZIb3JEYXRhLzIpICsgMTYpICogMiwKKyAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAorICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKKyAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLworICAgICAgICBpbmRleCA9IG12SG9yRGF0YSArIDMyOworICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHggIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZIb3JSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcworICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdlZlckRhdGEvMikgKyAxNikgKiAyLAorICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCisgICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZworICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCisgICAgICAgIGluZGV4ID0gbXZWZXJEYXRhICsgMzI7CisgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7CisgICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdlZlclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjNzNlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludGVyIGJsb2NrLgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcGF0dGVybiwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgT01YX1U4IHN0YXJ0ID0gMDsKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgMjYsCisgICAgICAgICAgICAgIDQwLAorICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAorCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKKyAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlCisgICAgICAgICk7CisgICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDc5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCBzdGFydCA9IDA7CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgcHBCaXRTdHJlYW0sCisgICAgIHBCaXRPZmZzZXQsCisgICAgIHBRRGN0QmxrQ29lZiwKKyAgICAgcHJlZERpciwKKyAgICAgcGF0dGVybiwKKyAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgc3RhcnQpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YWNkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispCit7CisgICAgT01YX1MxNiBkY1ZhbHVlLCBwb3dPZlNpemU7CisgICAgT01YX1U4ICBEQ1ZhbHVlU2l6ZSwgc3RhcnQgPSAxOworICAgIE9NWF9VMTYgYWJzRENWYWx1ZTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gT01YX1ZDX05PTkUpICYmIChwcmVkRGlyICE9IE9NWF9WQ19IT1JJWk9OVEFMKSAmJiAocHJlZERpciAhPSBPTVhfVkNfVkVSVElDQUwpICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmIChwYXR0ZXJuKQorICAgIHsKKyAgICAgICAgZGNWYWx1ZSA9IHBRRGN0QmxrQ29lZlswXTsKKyAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBzaXplICovCisgICAgICAgIERDVmFsdWVTaXplID0gYXJtTG9nU2l6ZSAoYWJzRENWYWx1ZSk7CisgICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLworICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgICAgIHsKKworICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4W0RDVmFsdWVTaXplXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworCisgICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkaXRpb25hbCBjb2RlIGdlbmVyYXRpb24gaW4gY2FzZSBvZiBuZWdhdGl2ZQorICAgICAgICAgICBkYyB2YWx1ZSB0aGUgYWRkaXRpb25hbCAqLworICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGNWYWx1ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY2FsdWxhdGUgMiBwb3cgKi8KKyAgICAgICAgICAgICAgICBwb3dPZlNpemUgPSAoMSA8PCBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBhYnNEQ1ZhbHVlID0gIGFic0RDVmFsdWUgXiAocG93T2ZTaXplIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpYWJzRENWYWx1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOworCisgICAgICAgICAgICBpZiAoRENWYWx1ZVNpemUgPiA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICAgIHByZWREaXIsCisgICAgICAgICAgICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNmZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNNVkN1ck1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjEsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMiwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzLAorICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWRNRSwKKyAgICAgT01YX0lOVCBpQmxrCisgKQoreworICAgIE9NWFZDTW90aW9uVmVjdG9yIENhbmRNVjsKKwljb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjE7CisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYyOworICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMzsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKwlhcm1SZXRBcmdFcnJJZihpQmxrIT0wICYmIHBTcmNNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsayA8IDApIHx8IChpQmxrID4gMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsgCisKKyAgICBDYW5kTVYuZHggPSBDYW5kTVYuZHkgPSAwOworCS8qIEJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgZXh0cmFjdCB0aGUgbW90aW9uIHZlY3RvcnMgYW5kCisgICAgICAgdGhlIHRyYW5wZXJhbmN5IHN0YXR1cyAqLworICAgCisgICAgCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwgKi8KKyAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjMgPSAmQ2FuZE1WOworCisgICAgCisgICAgc3dpdGNoIChpQmxrKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJICAgIHBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzFdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlsyXTsKKwkJCX0KKwkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07CisJCQl9CisJCQlpZiAoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMiA9PSBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMyA9IHBDYW5kTVYyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzNdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKKwkJCX0KKwkJCWlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzNdOworCQkJfQorCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07CisJCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKKwkJCWJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMl07CisJCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKKwkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOworCQkJYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MgKi8KKyAgICBwRHN0TVZQcmVkLT5keCA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR4LCBwQ2FuZE1WMi0+ZHgsIHBDYW5kTVYzLT5keCk7CisgICAgcERzdE1WUHJlZC0+ZHkgPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keSwgcENhbmRNVjItPmR5LCBwQ2FuZE1WMy0+ZHkpOworICAgICAgICAKKyAgICBpZiAocERzdE1WUHJlZE1FICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCB0aGVzZSBjYW4gYmUgdXNlZAorICAgICAgICAgICBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR4ID0gcENhbmRNVjEtPmR4OworICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHkgPSBwQ2FuZE1WMS0+ZHk7CisgICAgICAgIHBEc3RNVlByZWRNRVsxXS5keCA9IHBDYW5kTVYyLT5keDsKKyAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR5ID0gcENhbmRNVjItPmR5OworICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHggPSBwQ2FuZE1WMy0+ZHg7CisgICAgICAgIHBEc3RNVlByZWRNRVsyXS5keSA9IHBDYW5kTVYzLT5keTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4NmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgSURDVAorICogCisgKi8KKworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCit7CisgICAgT01YX0lOVCB4LCB5LCB1LCB2OworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKKyAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh1ICogOCkgKyB2XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCisgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IChPTVhfUzE2KSBmbG9vcihzdW0gKyAwLjUpOworCisgICAgICAgICAgICAvKiBTYXR1cmF0ZSB0byBbLTI1NiwgMjU1XSAqLworICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSBhcm1DbGlwICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2ZhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwpAQCAtMCwwICsxLDM1NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2suYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsVmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgdmVydGljYWwgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCisgKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICAgICAgb2YgOC4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOworICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxWZXIoCisgICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsIAorICAgICAgT01YX1U4ICpwRHN0LAorICAgICAgT01YX0lOVCBybmRWYWwpCit7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKKyAgT01YX0lOVCB5LCB4OworICAKKyAgcFRlbXBTcmMxID0gcFNyYzsgIAorICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQorICB7CisgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICB7CisgICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKKyAgICB9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBob3Jpem9udGFsIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLCBzdWJjbGF1c2UgNy42LjIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcworICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCisgKiAgICAgICAgICAgICAgICAgIG9mIDguCisgKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgorICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsSG9yKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICAgT01YX0lOVCBzcmNTdGVwLCAKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgcm5kVmFsKQoreworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7CisgIE9NWF9JTlQgeSwgeDsKKyAgCisgIHBUZW1wU3JjMSA9IHBTcmM7CisgIHBUZW1wU3JjMiA9IHBUZW1wU3JjMSArIDE7CisKKyAgc3JjU3RlcCAtPSA4OworICBmb3IgKHk9MDsgeTw4OyB5KyspCisgIHsKKyAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgeworICAgICAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrKSArIDEgLSBybmRWYWwpID4+IDE7CisgICAgfQorICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOworICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOworICB9Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBib3RoIAorICogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLAorICogc3ViY2xhdXNlIDcuNi4yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7CisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlckhvcigKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIHJuZFZhbCkKK3sKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMzsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzQ7CisgIE9NWF9JTlQgeSwgeDsKKworICBwVGVtcFNyYzEgPSBwU3JjOworICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKKyAgcFRlbXBTcmMzID0gcFNyYyArIDE7CisgIHBUZW1wU3JjNCA9IHBTcmMgKyBzcmNTdGVwICsgMTsKKworICBzcmNTdGVwIC09IDg7CisgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgeworICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKwl7CisJICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKysgKyAqcFRlbXBTcmMzKysgKyAqcFRlbXBTcmM0KyspICsgCisJICAgICAgICAgICAgICAgICAgMiAtIHJuZFZhbCkgPj4gMjsKKwl9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMzICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmM0ICs9IHNyY1N0ZXA7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgY29weSB0aGUgcmVzdWx0IHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtpbl0gcHJlZGljdFR5cGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjEuMi4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgICAgICAgICAgICAgICAgSWYgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzCisgKiAgICAgICAgICAgICAgICAgIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgorICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIGRzdFN0ZXApCit7CisgICAgT01YX1U4IHgseSxjb3VudCxpbmRleDsKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKyxpbmRleCArPSAoc3JjU3RlcCAtOCksIGNvdW50ICs9IChkc3RTdGVwIC0gOCkpCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1tpbmRleF07CisgICAgICAgIH0gICAgICAgCisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIElOVEVSIGJsb2NrIGJ5IHN1bW1pbmcgdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gcmVzdWx0cworICogYW5kIHRoZSByZXN1bHRzIG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIChwcmVkaWN0aW9uIHJlc2lkdWFscykuCisgKiBPdXRwdXQgaW50ZW5zaXRpZXMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBwU3JjUmVzaWR1ZSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uCisgKiAgICAgICAgICAgICAgICAgIHJlc2lkdWFscy4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCx0aGVuIG5vIHByZWRpY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLgorICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKKyAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCisgICAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgZHN0U3RlcCkKK3sKKyAgICAgIAorICBPTVhfVTggeCx5OworICBPTVhfSU5UIHRlbXA7CisgIAorICBmb3IoeSA9IDA7IHkgPCA4OyB5KyspCisgIHsKKyAgICBmb3IoeCA9IDA7IHggPCA4OyB4KyspCisgICAgeworICAgICAgdGVtcCA9IHBTcmNbeF0gKyBwU3JjUmVzaWR1ZVt4XTsgICAgICAgICAKKyAgICAgIHBEc3RbeF0gPSBhcm1DbGlwKDAsMjU1LHRlbXApOworICAgIH0KKyAgICBwRHN0ICs9IGRzdFN0ZXA7CisgICAgcFNyYyArPSA4OworICAgIHBTcmNSZXNpZHVlICs9IDg7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAorICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCisgKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCisgKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCisgKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCisgKiAgICAgICAgICAgIDYuMi4xLjIuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKKyAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCisgKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jaygKKwkJY29uc3QgT01YX1U4ICpwU3JjLAorCQlPTVhfSU5UIHNyY1N0ZXAsCisJCWNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorCQlPTVhfVTggKnBEc3QsIAorCQlPTVhfSU5UIGRzdFN0ZXAsCisJCU9NWF9JTlQgcHJlZGljdFR5cGUsCisJCU9NWF9JTlQgcm5kVmFsKQoreworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9VOCBwVGVtcERzdFs2NF07CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVzaWR1ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGRzdFN0ZXAgJSA4KSB8fCAoc3JjU3RlcCAlIDgpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgocHJlZGljdFR5cGUgIT0gT01YX1ZDX0lOVEVHRVJfUElYRUwpICYmCisgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9YKSAmJgorICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1hZKQorICAgICAgICAgICAgICAgICAgICksT01YX1N0c19CYWRBcmdFcnIpOyAKKyAgICBhcm1SZXRBcmdFcnJJZigoKHJuZFZhbCAhPSAwKSAmJiAocm5kVmFsICE9IDEpKSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgc3dpdGNoKHByZWRpY3RUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBPTVhfVkNfSU5URUdFUl9QSVhFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcyhwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsSG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9ZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbFZlcihwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYocFNyY1Jlc2lkdWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKCYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwKTsgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXNpZHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FTW9kZSwgCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywgCisgICAgT01YX1UzMiAqcFNpemUKKyAgICkKK3sKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBTaXplLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDJfTUVTcGVjKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTllNzFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUluaXQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKKyAgICB2b2lkICpwTUVTcGVjCisgICApCit7CisgICAgQVJNVkNNNFAyX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMl9NRVNwZWMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoRW5hYmxlOHg4ICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4OworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlBlbFNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlICAgICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOyAgICAgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ybmRWYWwgICAgICAgICAgICAgID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOworICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQ5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBtb3Rpb24gc2VhcmNoIDE2eDE2IG1hY3JvYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2CisgKgorICogRGVzY3JpcHRpb246CisgKiAxNngxNiBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LgorICogSWYgaGFsZiBwZWwgc2VhcmNoIGlzIGVuYWJsZWQgaXQgYWxzbyBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBjb25zdCBPTVhfSU5UIHNyY1JlZlN0ZXAsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgT01YX0lOVCBybmRWYWw7CisgICAgCisgICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgCisgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBTcmNDdXJyQnVmLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICBwU3JjUHJlTVYsCisgICAgICAgIHBTcmNQcmVTQUQsCisgICAgICAgIHBNRVBhcmFtcywKKyAgICAgICAgcERzdE1WLAorICAgICAgICBwRHN0U0FEKTsKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlKQorICAgIHsKKyAgICAgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4CisgKgorICogRGVzY3JpcHRpb246CisgKiA4eDggYmxvY2sgbWF0Y2ggd3JhcHBlciBmdW5jdGlvbiwgY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguCisgKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4CisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCisgKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKiAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCBzcmNSZWZTdGVwLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgIE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOworICAgIE9NWF9JTlQgcm5kVmFsOworICAgIAorICAgIHJuZFZhbCA9IHBNRVBhcmFtcy0+cm5kVmFsOworICAgIAorICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAorICAgICAgICBwU3JjUmVmQnVmLAorICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgIHBTcmNQcmVNViwKKyAgICAgICAgcFNyY1ByZVNBRCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgIHBEc3RTQUQpOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKKyAgICAgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgcFJlZlJlY3QsCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICBwU3JjRHN0TVYsCisgICAgICAgICAgICBwRHN0U0FEKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKKyAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAorICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCisgKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAorICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCisgKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKKyAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKKyAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKKyAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCisgKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKKyAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCisgKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKKyAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAorICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKKyAqICAgICAgICAgICAgaWdub3JlZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAorICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKKyAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKKyAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKKyAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKKyAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCisgKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKKyAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKykKK3sKKyAKKyAgICBPTVhfSU5UIGludHJhU0FELCBhdmVyYWdlLCBjb3VudCwgaW5kZXgsIHgsIHk7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVYxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQxNngxNjsKKyAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQ4eDg7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgICpwTUVQYXJhbXM7IAorCU9NWFZDTTRQMkNvb3JkaW5hdGUgVGVtcEN1cnJQb2ludFBvczsgCisgICAgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFRlbXBDdXJyUG9pbnRQb3M7IAorICAgIE9NWF9VOCBhVGVtcFNyY0N1cnJCdWZbMjcxXTsKKyAgICBPTVhfVTggKnBUZW1wU3JjQ3VyckJ1ZjsKKyAgICBPTVhfVTggKnBEc3Q7CisgICAgT01YX1U4IGFEc3RbNzFdOworICAgIE9NWF9TMzIgZHN0U3RlcCA9IDg7CisgICAgT01YX0lOVCBwcmVkaWN0VHlwZTsKKwlPTVhfUzMyIFNhZDsKKyAgICBjb25zdCBPTVhfVTggKnBUZW1wU3JjUmVmQnVmOworICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjJbNF07CisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzWzRdOworICAgICAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKHNyY0N1cnJTdGVwICUgMTYpIHx8IChzcmNSZWZTdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIAorICAgIHBUZW1wQ3VyclBvaW50UG9zID0gJihUZW1wQ3VyclBvaW50UG9zKTsKKyAgICBwVGVtcFNyY0N1cnJCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhhVGVtcFNyY0N1cnJCdWYpOworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggPSBwQ3VyclBvaW50UG9zLT54OworICAgIHBUZW1wQ3VyclBvaW50UG9zLT55ID0gcEN1cnJQb2ludFBvcy0+eTsKKyAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI7CisgICAgCisgICAgLyogUHJlcGFyaW5nIGEgbGluZWFyIGJ1ZmZlciBmb3IgYmxvY2sgbWF0Y2ggKi8KKyAgICBmb3IgKHkgPSAwLCBpbmRleCA9IGNvdW50ID0gMDsgeSA8IDE2OyB5KyssIGluZGV4ICs9IHNyY0N1cnJTdGVwIC0gMTYpCisgICAgeworICAgICAgICBmb3IoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWZbY291bnRdID0gcFNyY0N1cnJCdWZbaW5kZXhdOworICAgICAgICB9CisgICAgfQorICAgIGZvcih5ID0gMCwgaW5kZXggPSAwOyB5IDwgMjsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgMjsgeCsrLGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzBdICE9IE5VTEwpICYmIChwTUJJbmZvWzBdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxW2luZGV4XSA9ICYocE1CSW5mb1swXS0+cE1WMFt5XVt4XSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzFdICE9IE5VTEwpICYmIChwTUJJbmZvWzFdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9ICYocE1CSW5mb1sxXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMltpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwTUJJbmZvWzNdICE9IE5VTEwpICYmIChwTUJJbmZvWzNdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9ICYocE1CSW5mb1szXS0+cE1WMFt5XVt4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1tpbmRleF0gPSBOVUxMOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkvKiBDYWxjdWxhdGluZyBTQUQgYXQgTVYoMCwwKSAqLworCWFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorCQkJCQkgIDE2LAorCQkJCQkgIHBTcmNSZWZCdWYsCisJCQkJCSAgc3JjUmVmU3RlcCwKKwkJCQkJICAmU2FkLAorCQkJCQkgIDE2LAorCQkJCQkgIDE2KTsKKwkqcERzdFNBRCA9IFNhZDsKKworICAgIC8qIE1vZGUgZGVjaXNpb24gZm9yIE5PVF9DT0RFRCBNQiAqLworCWlmKCpwRHN0U0FEID09IDApCisJeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gMDsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IDA7CisgICAgICAgICpwRHN0U0FEICAgPSAwOworCQlyZXR1cm4gT01YX1N0c19Ob0VycjsKKwl9CisKKyAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMF0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzBdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1swXSwKKyAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIEludGVyIDEgTVYgKi8KKyAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKKyAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgcFJlZlJlY3QsCisgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICAmZHN0TVYxNngxNiwKKyAgICAgICAgJmRzdFNBRDE2eDE2KTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIGFsbCB3aXRoIDEgTVYgdmFsdWVzICovCisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7CisgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7IAorICAgIAorICAgICpwRHN0U0FEICAgPSBkc3RTQUQxNngxNjsgICAgICAgCisgICAgCisgICAgaWYgKHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4KQorICAgIHsKKyAgICAgICAgLyogSW50ZXIgNE1WICovCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEID0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMV0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzFdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgCisgICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBwRHN0QmxvY2tTQURbMV0gPSBkc3RTQUQ4eDg7CisgICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggLT0gODsKKyAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgKz0gODsKKyAgICAgICAgcFNyY1JlZkJ1ZiArPSAoc3JjUmVmU3RlcCAqIDgpIC0gODsKKyAgICAgICAgCisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsyXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMl0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzJdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzBdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IDg7CisgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVszXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbM10sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzNdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzFdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OyAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNraW5nIGlmIDRNViBpcyBlcXVhbCB0byAxTVYgKi8KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2VsZWN0IHRoZSA0IE1WICovCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI0VjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBmaW5kaW5nIHRoZSBlcnJvciBpbiBpbnRyYSBtb2RlICovCisgICAgZm9yIChjb3VudCA9IDAsIGF2ZXJhZ2UgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCisgICAgeworICAgICAgICBhdmVyYWdlID0gYXZlcmFnZSArIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF07CisgICAgfQorICAgIGF2ZXJhZ2UgPSBhdmVyYWdlLzI1NjsKKyAgICAKKwlpbnRyYVNBRCA9IDA7CisKKyAgICAvKiBJbnRyYSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTYgOyBjb3VudCsrKQorICAgIHsKKyAgICAgICAgaW50cmFTQUQgKz0gYXJtQWJzICgocFRlbXBTcmNDdXJyQnVmW2NvdW50XSkgLSAoYXZlcmFnZSkpOworICAgIH0KKyAgICAKKwkvKiBVc2luZyB0aGUgTVBFRzQgVk0gZm9ybXVsYSBmb3IgaW50cmEvaW50ZXIgbW9kZSBkZWNpc2lvbiAKKwkgICBWYXIgPCAoU0FEIC0gMipOQikgd2hlcmUgTkIgPSBOXjIgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMKKwkgICBvZiB0aGUgbWFjcm9ibG9jay4qLworCisgICAgaWYgKGludHJhU0FEIDw9ICgqcERzdFNBRCAtIDUxMikpCisgICAgeworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkE7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKKyAgICAgICAgKnBEc3RTQUQgICA9IGludHJhU0FEOworICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSAweEZGRkY7CisgICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IDB4RkZGRjsKKyAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gMHhGRkZGOworICAgICAgICBwRHN0QmxvY2tTQURbM10gPSAweEZGRkY7CisgICAgfQorCisgICAgaWYocFNyY0RzdE1CQ3Vyci0+bWJUeXBlID09IE9NWF9WQ19JTlRFUikKKyAgICB7CisgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCAqIGRzdE1WMTZ4MTYuZHkpICsgZHN0TVYxNngxNi5keDsKKyAgICAKKyAgICAgIGlmKChkc3RNVjE2eDE2LmR4ICYgMHgxKSAmJiAoZHN0TVYxNngxNi5keSAmIDB4MSkpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWFk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGRzdE1WMTZ4MTYuZHggJiAweDEpCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keSAmIDB4MSkKKyAgICAgIHsKKyAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9ZOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19JTlRFR0VSX1BJWEVMOworICAgICAgfQorICAgICAgCisgICAgICBwRHN0ID0gYXJtQWxpZ25UbzhCeXRlcygmKGFEc3RbMF0pKTsKKyAgICAgIC8qIENhbGN1bGF0aW5nIEJsb2NrIFNBRCBhdCBNVihkc3RNVjE2eDE2LmR4LGRzdE1WMTZ4MTYuZHkpICovCisJICAvKiBCbG9jayAwICovCisgICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKyAgICAKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICBwRHN0QmxvY2tTQURbMF0gPSBTYWQ7CisgICAKKyAgICAgIC8qIEJsb2NrIDEgKi8KKyAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsJCQkJCSAgCisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzFdID0gU2FkOworCQorICAgICAgLyogQmxvY2sgMiAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKworICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IFNhZDsKKworCSAgLyogQmxvY2sgMyAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7CisKKyAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgKDE2KjgpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzNdID0gU2FkOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKQEAgLTAsMCArMSwxMjEgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9TMTYuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIG1vZHVsZXMgZm9yIEFDIERDIHByZWRpY3Rpb24KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorICkKK3sKKyAgICBPTVhfVTggZmxhZzsKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGN1clFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAwOworICAgIHJldHVybiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgICAgIHBTcmNEc3QsCisgICAgICAgIE5VTEwsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBOVUxMKTsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NGY3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIFF1YW50aXphdGlvbgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9VOCBRUCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UIGNvZWZmQ291bnQ7CisgICAgT01YX0lOVCBmU2lnbjsKKyAgICBPTVhfSU5UIG1heENscEFDID0gMCwgbWluQ2xwQUMgPSAwOworICAgIE9NWF9JTlQgbWF4Q2xwREMgPSAwLCBtaW5DbHBEQyA9IDA7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLworICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICBtYXhDbHBEQyA9IDI1NDsKKyAgICAgICBtaW5DbHBEQyA9IDE7CisgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgbWluQ2xwQUMgPSAtMTI3OyAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1heENscERDID0gMjA0NzsKKyAgICAgICAgbWluQ2xwREMgPSAtMjA0NzsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoUVAvMikpLygyICogUVApOworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOworICAgICAgICAKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBpZiAoY29lZmZDb3VudCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQorICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwREMsIG1heENscERDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9CisgICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgUXVhbnRpemF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLworICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LGZTaWduOworICAgIE9NWF9JTlQgbWF4Q2xwQUMsIG1pbkNscEFDOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPj0gMTApKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIC8qIE9uZSBhcmd1bWVudCBjaGVjayBpcyBkZWxheWVkIHVudGlsIHdlIGhhdmUgYXNjZXJ0YWluZWQgdGhhdCAgKi8KKyAgIC8qIHBRTWF0cml4IGlzIG5vdCBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIAorICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAxMjc7CisgICAgICAgIG1pbkNscEFDID0gLTEyNzsKKyAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIAorICAgICAgICAvKiBDbGlwIGJldHdlZW4gMSBhbmQgMjU0ICovCisgICAgICAgIHBTcmNEc3RbMF0gPSAoT01YX1MxNikgYXJtQ2xpcCAoMSwgMjU0LCBwU3JjRHN0WzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OworICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAorICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLworICAgICAgICBpZiAoKGJsb2NrSW5kZXggIDwgNCkgfHwgKGJsb2NrSW5kZXggID4gNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYmxvY2tJbmRleCA8IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOworICAgIH0KKyAgICAKKyAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCisgICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCisgICAgeworICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkvKDIgKiBRUCk7CisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247CisKKyAgICAgICAgLyogQ2xpcCAqLworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBkZTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKQEAgLTAsMCArMSw5NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciBpbnZlcnNlIFF1YW50aXphdGlvbgorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAKKwkgKQoreworCisgICAgT01YX0lOVCBjb2VmZkNvdW50LCBTaWduOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICAgICAgICAKKyAgICAgICAgLyogUXVhbnRpemUgdGhlIGNvZWZmICovCisgICAgICAgIGlmIChRUCAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCkBAIC0wLDAgKzEsMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIGludmVyc2UgUXVhbnRpemF0aW9uCisgKiAKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisKKyAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KKyAgICBPTVhfSU5UIGRjU2NhbGVyID0gMCwgY29lZmZDb3VudCwgU2lnbjsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KKyAgICAKKyAgICAvKiBsaW5lYXIgaW50cmEgREMgbW9kZSAqLworICAgIGlmKHNob3J0VmlkZW9IZWFkZXIpCisgICAgeworICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgfQorICAgIC8qIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlICovCisgICAgZWxzZQorICAgIHsKKyAgICAKKyAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDkgJiYgUVAgPD0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCArIDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIFFQKSAtIDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogRGVxdWFudCB0aGUgREMgdmFsdWUsIHRoaXMgYXBwbGllcyB0byBib3RoIHRoZSBtZXRob2RzICovCisgICAgcFNyY0RzdFswXSA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKKworICAgIC8qIFNhdHVyYXRlICovCisgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKKworICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KKyAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCisKKyAgICAgICAgaWYgKFFQICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVAgLSAxOworICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBjNTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludGVyIHRleHR1cmUgZGF0YQorICogCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIoCisgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfUzE2ICogcFJlYywKKyAgICAgT01YX1U4IFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkIAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmZmVyWzcyXTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZmZlcjsKKyAgICBPTVhfSU5UIGk7CisgICAgICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWZmZXIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmZmVyKTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBvbXhWQ000UDJfRENUOHg4YmxrIChwU3JjLCBwRHN0KTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAorICAgICBwRHN0LAorICAgICBRUCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICB7CisgICAgICAgIHBUZW1wQnVmZmVyW2ldID0gcERzdFtpXTsKKyAgICB9CisKKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZmZlciwKKyAgICAgUVApOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZmZlciwgcFJlYyk7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ0NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludHJhIHRleHR1cmUgZGF0YQorICogCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCisgKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCisgKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAorICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAorICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKKyAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAorICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCisgKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAorICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKKyAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKKyAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKKyAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKKyAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKKyAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKKyAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCisgKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAorICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKKyAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCisgKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCisgKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKKyAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKKyAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCisgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKKyAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCisgKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKKyAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKKyAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAorICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCisgKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKKyAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCisgKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAorICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCisgKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCisgKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAorICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAorICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAorICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKKyAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgIHBTcmMsIHBSZWMuICAKKyAqCisgKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCisgKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4ICogcFJlYywKKyAgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfVTggY3VyUXAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2IHRlbXBCdWYzWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjIsKnBUZW1wQnVmMzsKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7CisgICAgT01YX1U4ICBmbGFnOworICAgIE9NWF9JTlQgeCwgeSwgY291bnQsIHByZWREaXI7CisgICAgT01YX0lOVCBwcmVkUVAsIEFDUHJlZEZsYWc7CisgICAgCisKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKKyAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7CisgICAgcFRlbXBCdWYzID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjMpOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZUFDUHJlZGljdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFN1bUVyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFwQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoZHN0U3RlcCA8PSAwKSB8fAorICAgICAgICAgICAgICAgIChkc3RTdGVwICYgNykgfHwgKHNyY1N0ZXAgJiA3KQorICAgICAgICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA5KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtUmV0QXJnRXJySWYoKGN1clFwIDw9IDApIHx8IChjdXJRcCA+PTMyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisKKyAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLworICAgIGlmIChibG9ja0luZGV4IDw9IDMpCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7CisgICAgfQorICAgIC8qIENvbnZlcnRpbmcgZnJvbSAyLWQgdG8gMS1kIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4PSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFNyY1soeSpzcmNTdGVwKSArIHhdOworICAgICAgICB9CisgICAgfQorCisgICAgb214VkNNNFAyX0RDVDh4OGJsayAgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIGN1clFwLAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKworICAgIC8qIENvbnZlcnRpbmcgZnJvbSAxLUQgdG8gMi1EIGJ1ZmZlciAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3RvcmluZyB0ZW1wYnVmMiB0byB0ZW1wYnVmMSAqLworICAgICAgICAgICAgcFRlbXBCdWYxW2NvdW50XSA9IHBUZW1wQnVmMltjb3VudF07CisgICAgICAgICAgICBwRHN0Wyh5KmRzdFN0ZXApICsgeF0gPSBwVGVtcEJ1ZjJbY291bnRdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQUMgYW5kIERDIHByZWRpY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcFByZWRCdWZSb3csCisgICAgICAgIHBQcmVkQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFwQnVmKTsKKworICAgIGFybVJldERhdGFFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGZsYWcgPSAxOworICAgIGlmICgqcFN1bUVyciA8IDApCisgICAgeworICAgICAgICBBQ1ByZWRGbGFnID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQUNQcmVkRmxhZyA9IDE7CisgICAgfQorCisgICAgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICAgICBwVGVtcEJ1ZjIsCisgICAgICAgIHBQcmVBQ1ByZWRpY3QsCisgICAgICAgIHBQcmVkQnVmUm93LAorICAgICAgICBwUHJlZEJ1ZkNvbCwKKyAgICAgICAgY3VyUXAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wLAorICAgICAgICBmbGFnLAorICAgICAgICBwU3VtRXJyKTsKKworICAgIC8qIFJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIGRhdGEgKi8KKyAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIGN1clFwLAorICAgICAgICB2aWRlb0NvbXAsCisgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMyk7CisgICAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA2NDsgY291bnQrKykKKyAgICB7CisgICAgICAgIHBSZWNbY291bnRdID0gYXJtTWF4KDAscFRlbXBCdWYzW2NvdW50XSk7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjZjJlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENIRUNLX01FTU9SWV9VU0FHRSBwcmludHMgYW5kIHN1bXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY2FsbHMgdG8KKyAqIEgyNjRTd0RlY01hbGxvYygpICovCisvKiAjZGVmaW5lIENIRUNLX01FTU9SWV9VU0FHRSAqLworCisvKiBfTk9fT1VUIGRpc2FibGVzIG91dHB1dCBmaWxlIHdyaXRpbmcgKi8KKy8qICNkZWZpbmUgX05PX09VVCAqLworCisvKiBEZWJ1ZyBwcmludHMgKi8KKyNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKKworLyogQ1ZTIHRhZyBuYW1lIGZvciBpZGVudGlmaWNhdGlvbiAqLworY29uc3QgY2hhciB0YWdOYW1lWzI1Nl0gPSAiJE5hbWU6IEZJUlNUX0FORFJPSURfQ09QWVJJR0hUICQiOworCit2b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSk7Cit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpOworCisvKiBHbG9iYWwgdmFyaWFibGVzIGZvciBzdHJlYW0gaGFuZGxpbmcgKi8KK3U4ICpzdHJlYW1TdG9wID0gTlVMTDsKK3UzMiBwYWNrZXRpemUgPSAwOwordTMyIG5hbFVuaXRTdHJlYW0gPSAwOworRklMRSAqZm91dHB1dCA9IE5VTEw7CisKKyNpZmRlZiBTT0NfREVTSUdORVIKKworLy8gSW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZGVmaW5lZCBpbiBJbml0Q2FjaGUucworZXh0ZXJuIHZvaWQgY2FjaGVfaW5pdCh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICAkU3ViJCRtYWluCisKKyAgICBQdXJwb3NlOgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBDIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24gYW5kCisgICAgICAgIGJlZm9yZSBtYWluLiBJdHMgcHVycG9zZSBpcyB0byBkbyBhbnkgZnVydGhlciBpbml0aWFsaXNhdGlvbiBiZWZvcmUgdGhlCisgICAgICAgIGFwcGxpY2F0aW9uIHN0YXJ0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50ICRTdWIkJG1haW4oY2hhciBhcmdjLCBjaGFyICogYXJndltdKQoreworICBjYWNoZV9pbml0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIHNvbWUgZXh0cmEgc2V0dXAgd29yayBzZXR0aW5nIHVwIGNhY2hlcworICByZXR1cm4gJFN1cGVyJCRtYWluKGFyZ2MsIGFyZ3YpOyAvLyBjYWxscyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24gb2YgZGVjb2RlciB0ZXN0YmVuY2guIFByb3ZpZGVzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKKyAgICAgICAgd2l0aCBmaWxlIEkvTyBmb3IgSC4yNjQgZGVjb2Rlci4gUHJpbnRzIG91dCB0aGUgdXNhZ2UgaW5mb3JtYXRpb24KKyAgICAgICAgd2hlbiBleGVjdXRlZCB3aXRob3V0IGFyZ3VtZW50cy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgbWF4TnVtUGljcyA9IDA7CisgICAgdTggKmJ5dGVTdHJtU3RhcnQ7CisgICAgdTggKmltYWdlRGF0YTsKKyAgICB1OCAqdG1wSW1hZ2UgPSBOVUxMOworICAgIHUzMiBzdHJtTGVuOworICAgIHUzMiBwaWNTaXplOworICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKKyAgICBIMjY0U3dEZWNSZXQgcmV0OworICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OworICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7CisgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOworICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKKyAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIGRlY1ZlcjsKKyAgICB1MzIgcGljRGVjb2RlTnVtYmVyOworICAgIHUzMiBwaWNEaXNwbGF5TnVtYmVyOworICAgIHUzMiBudW1FcnJvcnMgPSAwOworICAgIHUzMiBjcm9wRGlzcGxheSA9IDA7CisgICAgdTMyIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMDsKKworICAgIEZJTEUgKmZpbnB1dDsKKworICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICIiOworCisgICAgLyogUHJpbnQgQVBJIHZlcnNpb24gbnVtYmVyICovCisgICAgZGVjVmVyID0gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpOworICAgIERFQlVHKCgiSC4yNjQgRGVjb2RlciBBUEkgdiVkLiVkXG4iLCBkZWNWZXIubWFqb3IsIGRlY1Zlci5taW5vcikpOworCisgICAgLyogUHJpbnQgdGFnIG5hbWUgaWYgJy1UJyBhcmd1bWVudCBwcmVzZW50ICovCisgICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCisgICAgeworICAgICAgICBERUJVRygoIiVzXG4iLCB0YWdOYW1lKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUuaDI2NFxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0X3d4eHhoeXl5Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LVAgcGFja2V0LWJ5LXBhY2tldCBtb2RlXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtVSBOQUwgdW5pdCBzdHJlYW0gbW9kZVxuIikpOworICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgZm9yIChpID0gMTsgaSA8ICh1MzIpKGFyZ2MtMSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFja2V0aXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItVSIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuYWxVbml0U3RyZWFtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVIiKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwicmIiKTsKKyAgICBpZiAoZmlucHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KKyAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIuIGlmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCisgICAgYnl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgIGlmIChieXRlU3RybVN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIGZyb20gZmlsZSB0byBidWZmZXIgYW5kIGNsb3NlIGlucHV0IGZpbGUgKi8KKyAgICBmcmVhZChieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKKyAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICB7CisgICAgICAgIERFQlVHKCgiREVDT0RFUiBJTklUSUFMSVpBVElPTiBGQUlMRURcbiIpKTsKKyAgICAgICAgZnJlZShieXRlU3RybVN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCisgICAgc3RyZWFtU3RvcCA9IGJ5dGVTdHJtU3RhcnQgKyBzdHJtTGVuOworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgLyogZ2V0IHBvaW50ZXIgdG8gbmV4dCBwYWNrZXQgYW5kIHRoZSBzaXplIG9mIHBhY2tldAorICAgICAqIChmb3IgcGFja2V0aXplIG9yIG5hbFVuaXRTdHJlYW0gbW9kZXMpICovCisgICAgaWYgKCAodG1wID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSkpICE9IDAgKQorICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gdG1wOworCisgICAgcGljRGVjb2RlTnVtYmVyID0gcGljRGlzcGxheU51bWJlciA9IDE7CisgICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFBpY3R1cmUgSUQgaXMgdGhlIHBpY3R1cmUgbnVtYmVyIGluIGRlY29kaW5nIG9yZGVyICovCisgICAgICAgIGRlY0lucHV0LnBpY0lkID0gcGljRGVjb2RlTnVtYmVyOworCisgICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7CisKKyAgICAgICAgc3dpdGNoKHJldCkKKyAgICAgICAgeworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgICAgICAvKiBTdHJlYW0gaGVhZGVycyB3ZXJlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICogLT4gc3RyZWFtIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisKKyAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgREVCVUcoKCJQcm9maWxlICVkXG4iLCBkZWNJbmZvLnByb2ZpbGUpKTsKKworICAgICAgICAgICAgICAgIERFQlVHKCgiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCkpOworCisgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJDcm9wcGluZyBwYXJhbXM6ICglZCwgJWQpICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBDcm9wcGVkIGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wSW1hZ2UgPSBtYWxsb2MocGljU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXBJbWFnZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIG91dHB1dCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8ucGljV2lkdGggKiBkZWNJbmZvLnBpY0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9ICgzICogcGljU2l6ZSkvMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBERUJVRygoInZpZGVvUmFuZ2UgJWQsIG1hdHJpeENvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby52aWRlb1JhbmdlLCBkZWNJbmZvLm1hdHJpeENvZWZmaWNpZW50cykpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKworICAgICAgICAgICAgICAgIC8qIElmIC1PIG9wdGlvbiBub3QgdXNlZCwgZ2VuZXJhdGUgZGVmYXVsdCBmaWxlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAob3V0RmlsZU5hbWVbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihvdXRGaWxlTmFtZSwgIm91dF93JWRoJWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6CisgICAgICAgICAgICAgICAgLyogUGljdHVyZSBpcyByZWFkeSBhbmQgbW9yZSBkYXRhIHJlbWFpbnMgaW4gaW5wdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICogLT4gdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKKworICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wSW1hZ2UscGljU2l6ZSkgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYXQKKyAgICAgICAgICAgICAgICAgKiBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgY2FzZSAqLworCisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOworCisgICAgICAgICAgICAgICAgLyogSWYgZW5vdWdoIHBpY3R1cmVzIGRlY29kZWQgLT4gZm9yY2UgZGVjb2RpbmcgdG8gZW5kCisgICAgICAgICAgICAgICAgICogYnkgc2V0dGluZyB0aGF0IG5vIG1vcmUgc3RyZWFtIGlzIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIHBpY0RlY29kZU51bWJlciA9PSBtYXhOdW1QaWNzKQorICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkZWNvZGluZyBudW1iZXIgZm9yIGV2ZXJ5IGRlY29kZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgIHBpY0RlY29kZU51bWJlcisrOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlICggSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDApID09CisgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLworICAgICAgICAgICAgICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxkZWNJbmZvKSBhbHdheXMgaW5pdGlhbGl6ZWQgaWYgcGljdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIGZvciBkaXNwbGF5ICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6CisgICAgICAgICAgICAgICAgLyogSW5wdXQgc3RyZWFtIHdhcyBkZWNvZGVkIGJ1dCBubyBwaWN0dXJlIGlzIHJlYWR5CisgICAgICAgICAgICAgICAgICogLT4gR2V0IG1vcmUgZGF0YSAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVRygoIkZBVEFMIEVSUk9SXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworICAgIC8qIGlmIG91dHB1dCBpbiBkaXNwbGF5IG9yZGVyIGlzIHByZWZlcnJlZCwgdGhlIGRlY29kZXIgc2hhbGwgYmUgZm9yY2VkCisgICAgICogdG8gb3V0cHV0IHBpY3R1cmVzIHJlbWFpbmluZyBpbiBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBVc2UgZnVuY3Rpb24KKyAgICAgKiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24KKyAgICAgKiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMgYXJlIHJlYWR5IGZvciBkaXNwbGF5LiBTZWNvbmQgcGFyYW1ldGVyCisgICAgICogZm9yIHRoZSBmdW5jdGlvbiBpcyBzZXQgdG8gJzEnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBlbmQgb2YgdGhlCisgICAgICogc3RyZWFtIGFuZCBhbGwgcGljdHVyZXMgc2hhbGwgYmUgb3V0cHV0ICovCisgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICB7CisgICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKKyAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKKyAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKKyAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBERUJVRygoIlxuIikpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKKworICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCisgICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKKworICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCisgICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKKyAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAorICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgaWYgKGZvdXRwdXQpCisgICAgICAgIGZjbG9zZShmb3V0cHV0KTsKKworICAgIC8qIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOworICAgIGZyZWUodG1wSW1hZ2UpOworCisgICAgREVCVUcoKCJPdXRwdXQgZmlsZTogJXNcbiIsIG91dEZpbGVOYW1lKSk7CisKKyAgICBERUJVRygoIkRFQ09ESU5HIERPTkVcbiIpKTsKKyAgICBpZiAobnVtRXJyb3JzIHx8IHBpY0RlY29kZU51bWJlciA9PSAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJFUlJPUlMgRk9VTkRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUuIFNpemUgb2YgdGhlCisgICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQoreworCisgICAgLyogZm91dHB1dCBpcyBnbG9iYWwgZmlsZSBwb2ludGVyICovCisgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGRlZmluZS4KKyAgICAgICAgICogSWYgZmlsZSBvcGVuIGZhaWxzIC0+IGV4aXQgKi8KKyAgICAgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgIm5vbmUiKSAhPSAwKQorICAgICAgICB7CisjaWYgIWRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGZvdXRwdXQgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgICAgICAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpKTsKKyAgICAgICAgICAgICAgICBleGl0KDEwMCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3V0cHV0ICYmIGRhdGEpCisgICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmb3V0cHV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IE5leHRQYWNrZXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIEdldCB0aGUgcG9pbnRlciB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBpbiBpbnB1dCBzdHJlYW0uIFVzZXMKKyAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyAncGFja2V0aXplJyBhbmQgJ25hbFVuaXRTdHJlYW0nIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgZGVjb2RlciBpbnB1dCBzdHJlYW0gbW9kZSBhbmQgJ3N0cmVhbVN0b3AnIHRvIGRldGVybWluZSB0aGUgZW5kCisgICAgICAgIG9mIHN0cmVhbS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0cmVhbSBtb2RlczoKKyAgICAgICAgICAgIGRlZmF1bHQgLSB0aGUgd2hvbGUgc3RyZWFtIGF0IG9uY2UKKyAgICAgICAgICAgIHBhY2tldGl6ZSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGggc3RhcnQgY29kZSBwcmVmaXgKKyAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4CisKKyAgICAgICAgcFN0cm0gc3RvcmVzIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHByZXZpb3VzIGRlY29kZXIgaW5wdXQgYW5kIGlzCisgICAgICAgIHJlcGxhY2VkIHdpdGggcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGVjb2RlciBpbnB1dC4KKworICAgICAgICBSZXR1cm5zIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIE5leHRQYWNrZXQodTggKipwU3RybSkKK3sKKworICAgIHUzMiBpbmRleDsKKyAgICB1MzIgbWF4SW5kZXg7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAqc3RyZWFtOworICAgIHU4IGJ5dGU7CisgICAgc3RhdGljIHUzMiBwcmV2SW5kZXg9MDsKKworICAgIC8qIEZvciBkZWZhdWx0IHN0cmVhbSBtb2RlIGFsbCB0aGUgc3RyZWFtIGlzIGluIGZpcnN0IHBhY2tldCAqLworICAgIGlmICghcGFja2V0aXplICYmICFuYWxVbml0U3RyZWFtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGluZGV4ID0gMDsKKyAgICBzdHJlYW0gPSAqcFN0cm0gKyBwcmV2SW5kZXg7CisgICAgbWF4SW5kZXggPSAodTMyKShzdHJlYW1TdG9wIC0gc3RyZWFtKTsKKworICAgIGlmIChtYXhJbmRleCA9PSAwKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICAvKiBsZWFkaW5nIHplcm9zIG9mIGZpcnN0IE5BTCB1bml0ICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107CisgICAgfSB3aGlsZSAoYnl0ZSAhPSAxICYmIGluZGV4IDwgbWF4SW5kZXgpOworCisgICAgLyogaW52YWxpZCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCB8fCBpbmRleCA8IDMpCisgICAgeworICAgICAgICBERUJVRygoIklOVkFMSUQgQllURSBTVFJFQU1cbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeCAqLworICAgIGlmIChuYWxVbml0U3RyZWFtKQorICAgIHsKKyAgICAgICAgc3RyZWFtICs9IGluZGV4OworICAgICAgICBtYXhJbmRleCAtPSBpbmRleDsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAvKiBTZWFyY2ggc3RyZWFtIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4ICovCisgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKKyAgICAgICAgaWYgKCFieXRlKQorICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3RhcnQgY29kZSBwcmVmaXggaGFzIHR3byB6ZXJvcworICAgICAgICAgICAgICogVGhpcmQgemVybyBpcyBhc3N1bWVkIHRvIGJlIGxlYWRpbmcgemVybyBvZiBuZXh0IHBhY2tldAorICAgICAgICAgICAgICogRm91cnRoIGFuZCBtb3JlIHplcm9zIGFyZSBhc3N1bWVkIHRvIGJlIHRyYWlsaW5nIHplcm9zIG9mIHRoaXMKKyAgICAgICAgICAgICAqIHBhY2tldCAqLworICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXggLT0gNDsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQrMTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1heEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyogU3RvcmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKyAgICAqcFN0cm0gPSBzdHJlYW07CisgICAgcHJldkluZGV4ID0gaW5kZXg7CisKKyAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgdHJhaWxpbmcgemVyb3MgKi8KKyAgICBpZiAobmFsVW5pdFN0cmVhbSkKKyAgICAgICAgaW5kZXggLT0gemVyb0NvdW50OworCisgICAgcmV0dXJuKGluZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKKworICAgIFB1cnBvc2U6CisgICAgICAgIFBlcmZvcm0gY3JvcHBpbmcgZm9yIHBpY3R1cmUuIElucHV0IHBpY3R1cmUgcEluSW1hZ2Ugd2l0aCBkaW1lbnNpb25zCisgICAgICAgIHBpY1dpZHRoIHggcGljSGVpZ2h0IGlzIGNyb3BwZWQgd2l0aCBwQ3JvcFBhcmFtcyBhbmQgdGhlIHJlc3VsdGluZworICAgICAgICBwaWN0dXJlIGlzIHN0b3JlZCBpbiBwT3V0SW1hZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCit7CisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKKyAgICB1OCAqcE91dCwgKnBJbjsKKworICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKKyAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+CisgICAgICAgICAgIHBpY1dpZHRoICkgfHwKKyAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgorICAgICAgICAgICBwaWNIZWlnaHQgKSApCisgICAgeworICAgICAgICAvKiBqdXN0IHRvIHByZXZlbnQgbGludCB3YXJuaW5nLCByZXR1cm5pbmcgbm9uLXplcm8gd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICogcmV0dXJuIHdpdGhvdXQgZnJlZWluZyB0aGUgbWVtb3J5ICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKKyAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKKworICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBsdW1hICovCisgICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKKyAgICBwT3V0ID0gcE91dEltYWdlOworCisgICAgLyogQ29weSBsdW1hIHBpeGVsIHZhbHVlcyAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA+Pj0gMTsKKyAgICBvdXRIZWlnaHQgPj49IDE7CisKKyAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY2IgKi8KKyAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKKworICAgIC8qIENvcHkgY2IgcGl4ZWwgdmFsdWVzICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNyICovCisgICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogQ29weSBjciBwaXhlbCB2YWx1ZXMgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICByZXR1cm4gKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY1RyYWNlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhcHBlbmRzCisgICAgICAgIHRyYWNlIG1lc3NhZ2VzIHRvIGZpbGUgbmFtZWQgJ2RlY19hcGkudHJjJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKQoreworICAgIEZJTEUgKmZwOworCisgICAgZnAgPSBmb3BlbigiZGVjX2FwaS50cmMiLCAiYXQiKTsKKworICAgIGlmICghZnApCisgICAgICAgIHJldHVybjsKKworICAgIGZ3cml0ZShzdHJpbmcsIDEsIHN0cmxlbihzdHJpbmcpLCBmcCk7CisgICAgZndyaXRlKCJcbiIsIDEsMSwgZnApOworCisgICAgZmNsb3NlKGZwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNYWxsb2MKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWFsbG9jIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWFsbG9jIGZvciBhbGxvY2F0aW9uIG9mIG1lbW9yeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkKK3sKKworI2lmIGRlZmluZWQoQ0hFQ0tfTUVNT1JZX1VTQUdFKQorICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGVjb2RlciBoYXMgdG8gZnJlZSBhbmQgcmVhbGxvY2F0ZSBzb21lIG9mIHRoZSBidWZmZXJzCisgICAgICogdGhlIHRvdGFsIHZhbHVlIHdpbGwgYmUgaW52YWxpZCAqLworICAgIHN0YXRpYyB1MzIgbnVtQnl0ZXMgPSAwOworICAgIG51bUJ5dGVzICs9IHNpemU7CisgICAgREVCVUcoKCJBbGxvY2F0ZWQgJWQgYnl0ZXMsIHRvdGFsICVkXG4iLCBzaXplLCBudW1CeXRlcykpOworI2VuZGlmCisKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCit7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFkYzc1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIG1haW4gZnVuY3Rpb24uIEFzc3VtaW5nIHRoYXQgZXhlY3V0YWJsZSBpcyBuYW1lZCAnZGVjb2RlcicgdGhlIHVzYWdlCisgICAgICAgIGlzIGFzIGZvbGxvd3MKKworICAgICAgICAgICAgZGVjb2RlciBpbnB1dEZpbGVOYW1lCisKKyAgICAgICAgLCB3aGVyZSBpbnB1dEZpbGVOYW1lIHNoYWxsIGJlIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIGgyNjQgc3RyZWFtCisgICAgICAgIGRhdGEuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKKyAgICB1OCAqYnl0ZVN0cm1TdGFydDsKKyAgICB1OCAqYnl0ZVN0cm07CisgICAgdTMyIHN0cm1MZW47CisgICAgdTMyIHBpY1NpemU7CisgICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIHUzMiBwaWNOdW1iZXI7CisKKyAgICBGSUxFICpmaW5wdXQ7CisgICAgRklMRSAqZm91dHB1dDsKKworICAgIC8qIENoZWNrIHRoYXQgZW5vdWdoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZ2l2ZW4sIGlmIG5vdCAtPiBwcmludCB1c2FnZQorICAgICAqIGluZm9ybWF0aW9uIG91dCAqLworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIHByaW50ZiggIlVzYWdlOiAlcyBmaWxlLmgyNjRcbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgb3V0cHV0IGZpbGUgbmFtZWQgb3V0Lnl1di4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZvdXRwdXQgPSBmb3Blbigib3V0Lnl1diIsICJ3YiIpOworICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgorICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KKyAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sICJyYiIpOworICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCisgICAgZnNlZWsoZmlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgcmV3aW5kKGZpbnB1dCk7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmVhbSBidWZmZXIsIGV4aXQgaWYgdW5zdWNjZXNzZnVsICovCisgICAgYnl0ZVN0cm0gPSBieXRlU3RybVN0YXJ0ID0gKHU4ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7CisgICAgaWYgKGJ5dGVTdHJtID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLworICAgIGZyZWFkKGJ5dGVTdHJtLCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLworICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIDApOworICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLworICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OworICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgcGljTnVtYmVyID0gMDsKKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIHN0YXJ0IHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCisgICAgICogVGhlIGRlY29kaW5nIHRpbWUgc2hvdWxkIGJlIG1lYXN1cmVkIG92ZXIgc2V2ZXJhbCBmcmFtZXMgYW5kIGFmdGVyCisgICAgICogdGhhdCBhdmVyYWdlIGZwcyAoZnJhbWVzL3NlY29uZCkgY2FuIGJlIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBzdGFydFRpbWUgPSBHZXRUaW1lKCk7CisgICAgICoKKyAgICAgKiBUbyBwcmV2ZW50IGNhbGN1bGF0aW5nIGZpbGUgSS9PIGxhdGVuc2llcyBhcyBhIGRlY29kaW5nIHRpbWUsCisgICAgICogY29tbWVudCBvdXQgV3JpdGVPdXRwdXQgZnVuY3Rpb24gY2FsbC4gQWxzbyBwcmludHMgdG8gc3Rkb3V0IG1pZ2h0CisgICAgICogY29uc3VtZSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGN5Y2xlcyBkdXJpbmcgbWVhc3VyZW1lbnQgKi8KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCisgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOworCisgICAgICAgIHN3aXRjaChyZXQpCisgICAgICAgIHsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIGRpbWVuc2lvbnMgYXJlIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCisgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc2l6ZSBpbiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIFlDYkNyIDQ6MjowIHBpY3R1cmUgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIDE2LWJpdCBSR0IgcGljdHVyZSBpbiBieXRlcworICAgICAgICAgICAgICAgICAqIHBpY1NpemUgPSAoZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0KSAqIDI7ICovCisKKyAgICAgICAgICAgICAgICBwcmludGYoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworCisgICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQorICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcworICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLworICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KKyAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsgcGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRDoKKyAgICAgICAgICAgICAgICAvKiBldmFsdWF0aW9uIHZlcnNpb24gb2YgdGhlIGRlY29kZXIgaGFzIGxpbWl0ZWQgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgKiBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIkVWQUxVQVRJT04gTElNSVQgUkVBQ0hFRFxuIik7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJVTlJFQ09WRVJBQkxFIEVSUk9SXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLworICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKKworZW5kOgorCisgICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKKyAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgorICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgorICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKKyAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KKyAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09CisgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZKSB7CisKKyAgICAgICAgcGljTnVtYmVyKys7CisKKyAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAorICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKKyAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQorICAgICAgICAgKiBpbiBSR0ItZm9ybWF0CisgICAgICAgICAqCisgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLworCisgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBpY1NpemUpOworICAgIH0KKworICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIGVuZCB0aW1lIChpbiBzZWNvbmRzKSBoZXJlLgorICAgICAqCisgICAgICogZW5kVGltZSA9IEdldFRpbWUoKTsKKyAgICAgKgorICAgICAqIE5vdyB0aGUgcGVyZm9ybWFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZnJhbWVzIHBlciBzZWNvbmQ6CisgICAgICogZnBzID0gcGljTnVtYmVyIC8gKGVuZFRpbWUgLSBzdGFydFRpbWUpOyAqLworCisKKyAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOworCisgICAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgICBmY2xvc2UoZm91dHB1dCk7CisKKyAgICAvKiBmcmVlIGJ5dGUgc3RyZWFtIGJ1ZmZlciAqLworICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7CisKKyAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlIHBvaW50ZWQgYnkgZmlkLiBTaXplIG9mIHRoZQorICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCit7CisgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZpZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKKyAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCit7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBIMjY0U3dEZWNJbml0CisgICAgICAgICAgSDI2NFN3RGVjR2V0SW5mbworICAgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UKKyAgICAgICAgICBIMjY0U3dEZWNEZWNvZGUKKyAgICAgICAgICBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCisgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIFZlcnNpb24gSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgSDI2NFNXREVDX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTiAzCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0gyNjRERUNfVFJBQ0UgICAgICAgICAgIFRyYWNlIEgyNjQgRGVjb2RlciBBUEkgZnVuY3Rpb24gY2FsbHMuCitIMjY0REVDX0VWQUxVQVRJT04gICAgICBDb21waWxlIGV2YWx1YXRpb24gdmVyc2lvbiwgcmVzdHJpY3RzIG51bWJlciBvZiBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGRlY29kZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpICAgIEgyNjRTd0RlY1RyYWNlKHN0cikKKyNlbHNlCisjZGVmaW5lIERFQ19BUElfVFJDKHN0cikKKyNlbmRpZgorCisjaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCisjZGVmaW5lIEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCAgIDUwMAorI2VuZGlmCisKK3ZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7Cit9CisKK3ZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSkgeworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpIHsKKyAgICBmcmVlKHB0cik7Cit9CisKK3ZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KSB7CisgICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOworfQorCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KSB7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0luaXQoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBJbml0aWFsaXplIGRlY29kZXIgc29mdHdhcmUuIEZ1bmN0aW9uIHJlc2VydmVzIG1lbW9yeSBmb3IgdGhlCisgICAgICAgICAgICBkZWNvZGVyIGluc3RhbmNlIGFuZCBjYWxscyBoMjY0YnNkSW5pdCB0byBpbml0aWFsaXplIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgZGVjb2RlciB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0cnkgdG8gcHJvdmlkZSBvdXRwdXQgcGljdHVyZXMgaW4gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciwgc2F2ZXMgbWVtb3J5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBpbnN0YW5jZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCAgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSIGludmFsaWQgcGFyYW1ldGVycworICAgICAgICAgICAgSDI2NFNXREVDX01FTV9GQUlMICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZykKK3sKKyAgICB1MzIgcnYgPSAwOworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIik7CisKKyAgICAvKiBjaGVjayB0aGF0IHJpZ2h0IHNoaWZ0IG9uIG5lZ2F0aXZlIG51bWJlcnMgaXMgcGVyZm9ybWVkIHNpZ25lZCAqLworICAgIC8qbGludCAtc2F2ZSAtZSogZm9sbG93aW5nIGNoZWNrIGNhdXNlcyBtdWx0aXBsZSBsaW50IG1lc3NhZ2VzICovCisgICAgaWYgKCAoKC0xKT4+MSkgIT0gKC0xKSApCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IFJpZ2h0IHNoaWZ0IGlzIG5vdCBzaWduZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19JTklURkFJTCk7CisgICAgfQorICAgIC8qbGludCAtcmVzdG9yZSAqLworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YoZGVjQ29udGFpbmVyX3QpKTsKKworICAgIGlmIChwRGVjQ29udCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgZGVjSW5zdCAlcCBub091dHB1dFJlb3JkZXJpbmcgJWQiLAorICAgICAgICAgICAgKHZvaWQqKWRlY0luc3QsIG5vT3V0cHV0UmVvcmRlcmluZyk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHJ2ID0gaDI2NGJzZEluaXQoJnBEZWNDb250LT5zdG9yYWdlLCBub091dHB1dFJlb3JkZXJpbmcpOworICAgIGlmIChydiAhPSBIQU5UUk9fT0spCisgICAgeworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKHBEZWNDb250KTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19NRU1GQUlMKTsKKyAgICB9CisKKyAgICBwRGVjQ29udC0+ZGVjU3RhdCAgPSBJTklUSUFMSVpFRDsKKyAgICBwRGVjQ29udC0+cGljTnVtYmVyID0gMDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBPSzogcmV0dXJuICVwIiwgKHZvaWQqKXBEZWNDb250KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgKmRlY0luc3QgPSAoZGVjQ29udGFpbmVyX3QgKilwRGVjQ29udDsKKworICAgIHJldHVybihIMjY0U1dERUNfT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0SW5mbygpCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgcmVhZCBhY2Nlc3MgdG8gZGVjb2RlciBpbmZvcm1hdGlvbi4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIEgyNjRTd0RlY0RlY29kZSBmdW5jdGlvbiBoYXMKKyAgICAgICAgICAgIGluZGljYXRlZCB0aGF0IGhlYWRlcnMgYXJlIHJlYWR5LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcERlY0luZm8gICAgcG9pbnRlciB0byBpbmZvIHN0cnVjdCB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZICBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHlldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0luZm8gKnBEZWNJbmZvKQoreworCisgICAgc3RvcmFnZV90ICpwU3RvcmFnZTsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjSW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBkZWNJbnN0IG9yIHBEZWNJbmZvIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIHBTdG9yYWdlID0gJigoKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdCktPnN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgPT0gTlVMTCB8fCBwU3RvcmFnZS0+YWN0aXZlUHBzID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IEhlYWRlcnMgbm90IGRlY29kZWQgeWV0Iik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfSERSU19OT1RfUkRZKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZigoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyLAorICAgICAgICAiSDI2NFN3RGVjR2V0SW5mbyMgZGVjSW5zdCAlcCAgcERlY0luZm8gJXAiLCBkZWNJbnN0LCAodm9pZCopcERlY0luZm8pOworICAgIERFQ19BUElfVFJDKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIpOworI2VuZGlmCisKKyAgICAvKiBoMjY0YnNkUGljV2lkdGggYW5kIC1IZWlnaHQgcmV0dXJuIGRpbWVuc2lvbnMgaW4gbWFjcm9ibG9jayB1bml0cywKKyAgICAgKiBwaWNXaWR0aCBhbmQgLUhlaWdodCBpbiBwaXhlbHMgKi8KKyAgICBwRGVjSW5mby0+cGljV2lkdGggICAgICAgID0gaDI2NGJzZFBpY1dpZHRoKHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT5waWNIZWlnaHQgICAgICAgPSBoMjY0YnNkUGljSGVpZ2h0KHBTdG9yYWdlKSA8PCA0OworICAgIHBEZWNJbmZvLT52aWRlb1JhbmdlICAgICAgPSBoMjY0YnNkVmlkZW9SYW5nZShwU3RvcmFnZSk7CisgICAgcERlY0luZm8tPm1hdHJpeENvZWZmaWNpZW50cyA9IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMocFN0b3JhZ2UpOworCisgICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHBTdG9yYWdlLAorICAgICAgICAmcERlY0luZm8tPmNyb3BwaW5nRmxhZywKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BMZWZ0T2Zmc2V0LAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKKyAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQpOworCisgICAgLyogc2FtcGxlIGFzcGVjdCByYXRpbyAqLworICAgIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEZWNJbmZvLT5wYXJIZWlnaHQpOworCisgICAgLyogcHJvZmlsZSAqLworICAgIHBEZWNJbmZvLT5wcm9maWxlID0gaDI2NGJzZFByb2ZpbGUocFN0b3JhZ2UpOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIE9LIik7CisKKyAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY1JlbGVhc2UoKQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWxlYXNlIHRoZSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBjYWxscyBoMjY0YnNkU2h1dERvd24gdG8KKyAgICAgICAgICAgIHJlbGVhc2UgaW5zdGFuY2UgZGF0YSBhbmQgZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZQorICAgICAgICAgICAgaW5zdGFuY2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGVjSW5zdCAgICAgRGVjb2RlciBpbnN0YW5jZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKworICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNSZWxlYXNlIyBFUlJPUjogZGVjSW5zdCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNSZWxlYXNlIyBkZWNJbnN0ICVwIixkZWNJbnN0KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgaDI2NGJzZFNodXRkb3duKCZwRGVjQ29udC0+c3RvcmFnZSk7CisKKyAgICBIMjY0U3dEZWNGcmVlKHBEZWNDb250KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0RlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc3RyZWFtIGRhdGEuIENhbGxzIGgyNjRic2REZWNvZGUgdG8gZG8gdGhlIGFjdHVhbCBkZWNvZGluZy4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UKKyAgICAgICAgICAgIHBJbnB1dCAgICAgIHBvaW50ZXIgdG8gaW5wdXQgc3RydWN0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEICAgZGVjb2RlciBpbnN0YW5jZSBub3QgaW5pdGlhbGl6ZWQgeWV0CisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisKKyAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCAgICBzdHJlYW0gYnVmZmVyIGRlY29kZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSAgIGhlYWRlcnMgZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICAgICAgICAgICAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgbm90IGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgICAgICAgICAgICAgICAgICBzZXJpb3VzIGVycm9yIGluIGRlY29kaW5nLCBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgcGFyYW1ldGVyIHNldHMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZWNvZGUgcGljdHVyZSBkYXRhCisgICAgICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCB0aGlzIGNhbiBvbmx5IG9jY3VyIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gdmVyc2lvbiBpcyB1c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IG51bWJlciBvZiBmcmFtZXMgcmVhY2hlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5wdXQgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY091dHB1dCAqcE91dHB1dCkKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgc3RybUxlbjsKKyAgICB1MzIgbnVtUmVhZEJ5dGVzOworICAgIHU4ICp0bXBTdHJlYW07CisgICAgdTMyIGRlY1Jlc3VsdCA9IDA7CisgICAgSDI2NFN3RGVjUmV0IHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMiKTsKKworICAgIC8qIENoZWNrIHRoYXQgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KKyAgICBpZiAocElucHV0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IHBJbnB1dCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIGlmICgocElucHV0LT5wU3RyZWFtID09IE5VTEwpIHx8IChwSW5wdXQtPmRhdGFMZW4gPT0gMCkpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCAqKWRlY0luc3Q7CisKKyAgICAvKiBDaGVjayBpZiBkZWNvZGVyIGlzIGluIGFuIGluY29ycmVjdCBtb2RlICovCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwRGVjQ29udC0+ZGVjU3RhdCA9PSBVTklOSVRJQUxJWkVEKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IERlY29kZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICB9CisKKyNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KKyAgICBpZiAocERlY0NvbnQtPnBpY051bWJlciA+PSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQpCisgICAgICAgIHJldHVybihIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCk7CisjZW5kaWYKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIGRlY0luc3QgJXAgIHBJbnB1dCAlcCAgcE91dHB1dCAlcCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcElucHV0LCAodm9pZCopcE91dHB1dCk7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyAgID0gTlVMTDsKKworICAgIG51bVJlYWRCeXRlcyA9IDA7CisgICAgc3RybUxlbiA9IHBJbnB1dC0+ZGF0YUxlbjsKKyAgICB0bXBTdHJlYW0gPSBwSW5wdXQtPnBTdHJlYW07CisgICAgcERlY0NvbnQtPnN0b3JhZ2UuaW50cmFDb25jZWFsbWVudEZsYWcgPSBwSW5wdXQtPmludHJhQ29uY2VhbG1lbnRNZXRob2Q7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogUmV0dXJuIEhEUlNfUkRZIGFmdGVyIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICBpZiAocERlY0NvbnQtPmRlY1N0YXQgPT0gTkVXX0hFQURFUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY1Jlc3VsdCA9IEgyNjRCU0RfSERSU19SRFk7CisgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IElOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogQ29udGludWUgZGVjb2Rpbmcgbm9ybWFsbHkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGVjUmVzdWx0ID0gaDI2NGJzZERlY29kZSgmcERlY0NvbnQtPnN0b3JhZ2UsIHRtcFN0cmVhbSwgc3RybUxlbiwKKyAgICAgICAgICAgICAgICBwSW5wdXQtPnBpY0lkLCAmbnVtUmVhZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICB0bXBTdHJlYW0gKz0gbnVtUmVhZEJ5dGVzOworICAgICAgICAvKiBjaGVjayBpZiB0b28gbWFueSBieXRlcyBhcmUgcmVhZCBmcm9tIHN0cmVhbSAqLworICAgICAgICBpZiAoIChpMzIpKHN0cm1MZW4gLSBudW1SZWFkQnl0ZXMpID49IDAgKQorICAgICAgICAgICAgc3RybUxlbiAtPSBudW1SZWFkQnl0ZXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cm1MZW4gPSAwOworCisgICAgICAgIHBPdXRwdXQtPnBTdHJtQ3VyclBvcyA9IHRtcFN0cmVhbTsKKworICAgICAgICBzd2l0Y2ggKGRlY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX0hEUlNfUkRZOgorCisgICAgICAgICAgICAgICAgaWYocERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkICYmCisgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5udW1PdXQgIT0KKyAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm91dEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZpcnN0IGFsbCBEUEIgc3RvcmVkIHBpY3R1cmVzCisgICAgICAgICAgICAgICAgICAgICAqIERQQiBmbHVzaCBjYXVzZWQgYnkgbmV3IFNQUyAqLworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+ZGVjU3RhdCA9IE5FV19IRUFERVJTOworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgcERlY0NvbnQtPnBpY051bWJlcisrOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm1MZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7CisKKyAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBpZiAoICFoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cygmcERlY0NvbnQtPnN0b3JhZ2UpICYmCisgICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9FUlI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfTUVNRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoc3RybUxlbik7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBPSzogRGVjUmVzdWx0ICVkIiwKKyAgICAgICAgICAgIHJldHVyblZhbHVlKTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuKHJldHVyblZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEFQSVZlcnNpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIEFQSQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBBUEkgdmVyc2lvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKQoreworICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gdmVyOworCisgICAgdmVyLm1ham9yID0gSDI2NFNXREVDX01BSk9SX1ZFUlNJT047CisgICAgdmVyLm1pbm9yID0gSDI2NFNXREVDX01JTk9SX1ZFUlNJT047CisKKyAgICByZXR1cm4odmVyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNOZXh0UGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIgaWYgYW55IGF2YWlsYWJsZS4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIGRlY0luc3QgICAgIGRlY29kZXIgaW5zdGFuY2UuCisgICAgICAgICAgICBmbHVzaEJ1ZmZlciBmb3JjZSBvdXRwdXQgb2YgYWxsIGJ1ZmZlcmVkIHBpY3R1cmVzCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIG5vIHBpY3R1cmVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheQorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgcGljdHVyZSBhdmFpbGFibGUgZm9yIGRpc3BsYXkKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjTmV4dFBpY3R1cmUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LAorICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsIHUzMiBmbHVzaEJ1ZmZlcikKK3sKKworICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKKyAgICB1MzIgbnVtRXJyTWJzLCBpc0lkclBpYywgcGljSWQ7CisgICAgdTMyICpwT3V0UGljOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyIpOworCisgICAgaWYgKGRlY0luc3QgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIEVSUk9SOiBkZWNJbnN0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7CisgICAgfQorCisgICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7CisKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIGRlY0luc3QgJXAgcE91dHB1dCAlcCAlcyAlZCIsCisgICAgICAgICAgICBkZWNJbnN0LCAodm9pZCopcE91dHB1dCwgImZsdXNoQnVmZmVyIiwgZmx1c2hCdWZmZXIpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICBpZiAoZmx1c2hCdWZmZXIpCisgICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcigmcERlY0NvbnQtPnN0b3JhZ2UpOworCisgICAgcE91dFBpYyA9ICh1MzIqKWgyNjRic2ROZXh0T3V0cHV0UGljdHVyZSgmcERlY0NvbnQtPnN0b3JhZ2UsICZwaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0lkclBpYywgJm51bUVyck1icyk7CisKKyAgICBpZiAocE91dFBpYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19PSyIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE91dHB1dC0+cE91dHB1dFBpY3R1cmUgPSBwT3V0UGljOworICAgICAgICBwT3V0cHV0LT5waWNJZCAgICAgICAgICA9IHBpY0lkOworICAgICAgICBwT3V0cHV0LT5pc0lkclBpY3R1cmUgICA9IGlzSWRyUGljOworICAgICAgICBwT3V0cHV0LT5uYnJPZkVyck1CcyAgICA9IG51bUVyck1iczsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBPSzogcmV0dXJuIEgyNjRTV0RFQ19QSUNfUkRZIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUElDX1JEWSk7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjE3MGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCitjb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2CisKKy8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLworI2lmZGVmIF9fYXJtCisjZGVmaW5lIF9OT19PVVQKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7CisKK3UzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCisgICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7CisKK3ZvaWQgQ3JvcFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIEZJTEUgKmZvdXRwdXQ7CisgICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdOworICAgIHU4ICpieXRlU3RybVN0YXJ0OworICAgIHUzMiBwaWNOdW1iZXI7Cit9IERlY29kZXI7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICAgIGkzMiBpbnN0Q291bnQsIGluc3RSdW5uaW5nOworICAgIGkzMiBpOworICAgIHUzMiBtYXhOdW1QaWNzOworICAgIHUzMiBzdHJtTGVuOworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgdTMyIG51bUVycm9ycyA9IDA7CisgICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKKyAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOworICAgIEZJTEUgKmZpbnB1dDsKKyAgICBEZWNvZGVyICoqZGVjb2RlcjsKKyAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAib3V0Lnl1diI7CisKKworICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdGFnTmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChhcmdjIDwgMikKKyAgICB7CisgICAgICAgIERFQlVHKCgKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUxLjI2NCBbZmlsZTIuMjY0XSAuLiBbZmlsZU4uMjY0XVxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pKTsKKyAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOworI2Vsc2UKKyAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0Lnl1dilcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKKyNlbmRpZgorICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOworICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIGluc3RDb3VudCA9IGFyZ2MgLSAxOworCisgICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisgICAgbWF4TnVtUGljcyA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IChhcmdjLTEpOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7CisgICAgICAgICAgICBpbnN0Q291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnN0Q291bnQgPCAxKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJObyBpbnB1dCBmaWxlc1xuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBtdWx0aXBsZSBkZWNvZGVyIGluc3RhbmNlcworICAgICAqIG9uZSBpbnN0YW5jZSBmb3IgZXZlcnkgc3RyZWFtIGZpbGUgKi8KKyAgICBkZWNvZGVyID0gKERlY29kZXIgKiopbWFsbG9jKHNpemVvZihEZWNvZGVyKikqKHUzMilpbnN0Q291bnQpOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgZXhpdCgxMDApOworICAgIH0KKworICAgIC8qIHByZXBhcmUgZWFjaCBkZWNvZGVyIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgZGVjb2RlcltpXSA9IChEZWNvZGVyICopY2FsbG9jKDEsIHNpemVvZihEZWNvZGVyKSk7CisKKyAgICAgICAgLyogb3BlbiBpbnB1dCBmaWxlICovCisgICAgICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0sInJiIik7CisgICAgICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIDwlcz5cbiIsIGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0pKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIERFQlVHKCgiUmVhZGluZyBpbnB1dCBmaWxlWyVkXSAlc1xuIiwgaSwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOworCisgICAgICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIHRvIGJ1ZmZlciAqLworICAgICAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOworICAgICAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOworICAgICAgICByZXdpbmQoZmlucHV0KTsKKyAgICAgICAgZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOworICAgICAgICBpZiAoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKKyAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBmcmVhZChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOworICAgICAgICBmY2xvc2UoZmlucHV0KTsKKworICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlICovCisgICAgICAgIGlmIChzdHJjbXAob3V0RmlsZU5hbWUsICJub25lIikgIT0gMCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoX05PX09VVCkKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPmZvdXRwdXQgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICIlcyVpIiwgb3V0RmlsZU5hbWUsIGkpOworICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IGZvcGVuKGRlY29kZXJbaV0tPm91dEZpbGVOYW1lLCAid2IiKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZVxuIikpOworICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmKGRlY29kZXJbaV0tPmRlY0luc3QpLCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7CisKKyAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiSW5pdCBmYWlsZWQgJWRcbiIsIHJldCkpOworICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICB9CisKKyAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9IGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQ7CisgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOworICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKKworICAgIH0KKworICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBkZWNvZGUgb25jZSB1c2luZyBlYWNoIGluc3RhbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY091dHB1dCkpOworCisgICAgICAgICAgICBzd2l0Y2gocmV0KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNvZGVyW2ldLT5kZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIENyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBXaWR0aCAlZCBIZWlnaHQgJWRcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5waWNIZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIHZpZGVvUmFuZ2UgJWQsIG1hdHJpY0NvZWZmaWNpZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPmRlY0luZm8udmlkZW9SYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuIC09CisgICAgICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAwKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzOworCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBkZWNvZGVyW2ldLT5waWNOdW1iZXIgPT0gbWF4TnVtUGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BBUkFNX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBGQVRBTCBFUlJPUlxuIiwgaSkpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIGFueSBvZiB0aGUgaW5zdGFuY2VzIGlzIHN0aWxsIHJ1bm5pbmcgKD1oYXMgbW9yZSBkYXRhKSAqLworICAgICAgICBpbnN0UnVubmluZyA9IGluc3RDb3VudDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIGluc3RSdW5uaW5nLS07CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKGluc3RSdW5uaW5nKTsKKworCisgICAgLyogZ2V0IGxhc3QgZnJhbWVzIGFuZCBjbG9zZSBlYWNoIGluc3RhbmNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNQaWN0dXJlKSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY29kZXJbaV0tPnBpY051bWJlcisrOworCisgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAorICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKKyAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQorICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgIH0KKworICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY29kZXJbaV0tPmRlY0luc3QpOworCisgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0KQorICAgICAgICAgICAgZmNsb3NlKGRlY29kZXJbaV0tPmZvdXRwdXQpOworCisgICAgICAgIGZyZWUoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCk7CisKKyAgICAgICAgZnJlZShkZWNvZGVyW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGRlY29kZXIpOworCisgICAgaWYgKG51bUVycm9ycykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZm91dHB1dCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAorICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKQoreworICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7CisgICAgdTMyIHRtcCwgcGljU2l6ZTsKKworICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLT5jcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgorICAgICAgICAgICAgICAgICAgZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKKyAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgZGVjSW5mby0+cGljV2lkdGgsIGRlY0luZm8tPnBpY0hlaWdodCwKKyAgICAgICAgICAgICYoZGVjSW5mby0+Y3JvcFBhcmFtcykpOworICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICBmcmVlKHRtcEltYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8tPnBpY1dpZHRoICogZGVjSW5mby0+cGljSGVpZ2h0OworICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCBpbWFnZURhdGEsIHBpY1NpemUpOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKK3sKKyAgICBpZiAoZmlkKQorICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKK3sKKyAgICBmcmVlKHB0cik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQoreworICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKKyAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQoreworCisgICAgdTMyIGksIGo7CisgICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7CisgICAgdTggKnBPdXQsICpwSW47CisKKyAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8CisgICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgorICAgICAgICAgICBwaWNXaWR0aCApIHx8CisgICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KKyAgICAgICAgICAgcGljSGVpZ2h0ICkgKQorICAgIHsKKyAgICAgICAgLyogZHVlIHRvIGxpbnQgd2FybmluZyAqLworICAgICAgICBmcmVlKHBPdXRJbWFnZSk7CisgICAgICAgIHJldHVybigxKTsKKyAgICB9CisKKyAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7CisgICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OworICAgIHBPdXQgPSBwT3V0SW1hZ2U7CisKKyAgICAvKiBsdW1hICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOworICAgIH0KKworICAgIG91dFdpZHRoID4+PSAxOworICAgIG91dEhlaWdodCA+Pj0gMTsKKworICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogY2IgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7CisKKyAgICAvKiBjciAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOworICAgIH0KKworICAgIHJldHVybiAoMCk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzRhNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKQEAgLTAsMCArMSwyOTggQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKK3B0ckEgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2Jsb2NrICAgUk4gMQorCit4MCAgICAgIFJOIDIKK2NvdW50ICAgUk4gMgorCit5MCAgICAgIFJOIDMKK3ZhbFggICAgUk4gMworCit3aWR0aCAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit0bXA3ICAgIFJOIDUKKworY2hyUFcgICBSTiA2Cit0bXA4ICAgIFJOIDYKKwordG1wMSAgICBSTiA3CitjaHJQSCAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit4RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDYsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXA2ID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzEgICAgICAgICAgOy8vIHRtcDYgPSB4MCArIGNocm9tYVBhcnRXaWR0aCArIDEKKyAgICBDTVAgICAgIHRtcDYsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXA2ID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQ01QICAgICB0bXA2LCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wOCwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDggPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIE1PViAgICAgdG1wMiwgdG1wOCAgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wOCxjaHJQSCx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKKyAgICBNTEEgICAgIGJsb2NrLCBjaHJQSCwgdG1wOCwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUEgpKihjaHJvbWFQVysxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIGNoclBILCBbc3AsICMweGZjXSAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDgsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDgKKyAgICBTVUIgICAgIGNoclBXLCBjaHJQVywgIzEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKKworICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKKyAgICBQS0hCVCAgIHZhbFgsIHZhbFgsIHhGcmFjLCBMU0wgIzE2ICA7Ly8gfHhGcmFjfHZhbFggfAorICAgIE1PViAgICAgdmFsWCwgdmFsWCwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKKyAgICBNT1YgICAgIGMzMiwgIzMyCisKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ2IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCisKK2xvb3AxX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4CisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKK2xvb3AxX3gKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKKworICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgorICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgorCisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgorICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgorCisgICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisKKyAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0CisgICAgQkdFICAgICBsb29wMV95CisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCitsb29wMl94CisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sICMxCisKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDEsIHRtcDMsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDYsIHRtcDIsIHRtcDQsIExTTCAjMTYKKworICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQorCisgICAgU01MQUQgICB0bXA1LCB0bXA1LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA2LCB0bXA2LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBQS0hCVCAgIHRtcDcsIHRtcDMsIHRtcDEsIExTTCAjMTYKKyAgICBQS0hCVCAgIHRtcDgsIHRtcDQsIHRtcDIsIExTTCAjMTYKKworICAgIFNNTEFEICAgdG1wNywgdG1wNywgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wOCwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCisKKyAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKKyAgICBCQ1MgICAgIGxvb3AyX3gKKworICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2CisgICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKKyAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKKyAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKKyAgICBTVUIgICAgIHB0ckEsIHB0ckEsICMxCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQyMGFkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpAQCAtMCwwICsxLDMzOSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIAorOy0tICAgICAgICAgICAgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworCis7Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCitwdHJBICAgIFJOIDAKKworbWIgICAgICBSTiAxCitibG9jayAgIFJOIDEKKworeDAgICAgICBSTiAyCitjb3VudCAgIFJOIDIKKworeTAgICAgICBSTiAzCit2YWxZICAgIFJOIDMKKword2lkdGggICBSTiA0CisKK3RtcDQgICAgUk4gNQoraGVpZ2h0ICBSTiA1CisKK3RtcDEgICAgUk4gNgorCit0bXAyICAgIFJOIDcKKwordG1wMyAgICBSTiA4CisKK3ZhbFggICAgUk4gOQorCit0bXA1ICAgIFJOIDEwCitjaHJQVyAgIFJOIDEwCisKK3RtcDYgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKworeEZyYWMgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDgKKzsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwYworCitoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKKworICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAorICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorCisgICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aCsxCisgICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAorICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCisgICAgQ01QICAgICB0bXAxLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbAorCitkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wMywgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDMgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0V2lkdGgrMQorICAgIEFERCAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAorICAgIE1MQSAgICAgYmxvY2ssIHRtcDIsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKzEpKihjaHJvbWFQSCsxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIHRtcDIsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIHRtcDEKKworc2tpcF9maWxsCisgICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCisgICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDRdICAgICA7Ly8geUZyYWMKKyAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0KKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKKyAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYworICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICBjMzIsICMzMgorCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENiCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorCitsb29wMV95CisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0KKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKKyAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAorCisgICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCisgICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCisKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Citsb29wMV94CisgICAgOy8vIGZpcnN0CisgICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQorICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAorICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8CisKKyAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKKyAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQorCisgICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCisgICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKKworICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKworICAgIDsvLyBzZWNvbmQKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ3IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCisgICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCisgICAgQUREICAgICBtYiwgbWIsICM2NAorCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4CisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KK2xvb3AyX3kKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQorICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAorICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8CisKKyAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKworICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AyX3gKKyAgICA7Ly8gZmlyc3QKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKKworICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1CisKKyAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgOy8vIHNlY29uZCAKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1CisKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKKyAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDJfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AyX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKKyAgICBMRE1GRCAgIHNwISx7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOWRmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwpAQCAtMCwwICsxLDI4OCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorcHRyQSAgICBSTiAwCisKK21iICAgICAgUk4gMQorYmxvY2sgICBSTiAxCisKK3gwICAgICAgUk4gMgorY291bnQgICBSTiAyCisKK3kwICAgICAgUk4gMwordmFsWSAgICBSTiAzCisKK3dpZHRoICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3RtcDcgICAgUk4gNQorCitjaHJQVyAgIFJOIDYKK3RtcDggICAgUk4gNgorCit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK3RtcDUgICAgUk4gMTEKK2NoclBIICAgUk4gMTEKKwordG1wNiAgICBSTiAxMgorCitjMzIgICAgIFJOIDE0Cit5RnJhYyAgIFJOIDE0CisKKzsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisKKzsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCis7Ly8KKzsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Cis7Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAorOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKKzsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCis7Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAorOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKKzsvLyAgdTMyIHlGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAorOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Cis7Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKKworaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweGM0CisKKyAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIENNUCAgICAgdG1wMSwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKKyAgICBDTVAgICAgIHRtcDEsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAxLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRIZWlnaHQrMQorICAgIE1PViAgICAgdG1wMiwgY2hyUFcgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQorICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCisgICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisgICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCisgICAgTUxBICAgICBibG9jaywgY2hyUFcsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKSooY2hyb21hUEgrMSkKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAorICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAorICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jaworICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgorCisgICAgU1RSICAgICB0bXAxLCBbc3AsICMweGZjXSAgICAgICA7Ly8gaGVpZ2h0CisgICAgU1RSICAgICBjaHJQVywgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNT1YgICAgIHdpZHRoLCBjaHJQVworCitza2lwX2ZpbGwKKyAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKKyAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB5RnJhYworICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAorICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8CisgICAgTU9WICAgICB2YWxZLCB2YWxZLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQorICAgIE1PViAgICAgYzMyLCAjMzIKKworCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIDsvLyBDYgorICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KKworbG9vcDFfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AxX3gKKyAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAorICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKKworICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCisgICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8CisKKyAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKKworCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDFfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kgCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENyCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCisgICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKyAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQorICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKKyAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMworICAgIEFERCAgICAgbWIsIG1iLCAjNjQKKworICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitsb29wMl95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorbG9vcDJfeAorICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jaworICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAorCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKworICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAorICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMl94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5NjhiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwpAQCAtMCwwICsxLDI1MSBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZiBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCisKK3dpZHRoICAgUk4gNAoreF8zXzEgICBSTiA0CisKK2hlaWdodCAgUk4gNQoreF82XzQgICBSTiA1CisKK3BhcnRXICAgUk4gNgoreF83XzUgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wMSAgICBSTiA3CisKK3RtcDIgICAgUk4gOAorCit0bXAzICAgIFJOIDkKKwordG1wNCAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQorbXVsdF8yMF9tNSAgUk4gMTIKKworcGx1czE2ICBSTiAxNAorCisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgorCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKKyAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3kKKworICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKworICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgorCisgICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCisgICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0CisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCisgICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgorICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0CisKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQorICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQorICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAorICAgIEJDUyAgICAgbG9vcF94CisKK25leHRfeQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmIDsvLyArd2lkdGgKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDMsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTI0M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCkBAIC0wLDAgKzEsMjczIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKKworbWIgICAgICBSTiAxCitidWZmICAgIFJOIDEKKworY291bnQgICBSTiAyCit4MCAgICAgIFJOIDIKKworeTAgICAgICBSTiAzCit4XzJfMCAgIFJOIDMKKword2lkdGggICBSTiA0Cit4XzNfMSAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKKworcGFydFcgICBSTiA2Cit4XzdfNSAgIFJOIDYKKworcGFydEggICBSTiA3Cit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK211bHRfMjBfMDEgIFJOIDExCisKK211bHRfMjBfbTUgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKworCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB0bXA0LCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQ01QICAgICB0bXAyLCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKKyAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSB3aWR0aAorICAgIE1PViAgICAgY291bnQsIHdpZHRoCisgICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOworICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKKyAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKKworCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgorICAgIE1PViAgICAgcGx1czE2LCAjMTYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAorbG9vcF95CisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKworbG9vcF94CisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCisgICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgorICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKKyAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KKyAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAorCis7Ly8gcXVhcnRlciBwZWwgcG9zaXRpb24KKyAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAorICAgIE1WTiAgICAgdG1wMywgdG1wMworICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMworICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKKworICAgIEJDQyAgICAgbmV4dF95CisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgorICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCisgICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAorCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCisgICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisKKzsvLyBxdWFydGVyIHBlbAorICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCisgICAgTVZOICAgICB0bXAzLCB0bXAzCisgICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCisgICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCisKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNTICAgICBsb29wX3gKKworbmV4dF95CisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWM3OWIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKQEAgLTAsMCArMSw1MzYgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgCis7LS0gICAgICAgICAgICBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3kwICAgICAgUk4gMworeF8yXzAgICBSTiAzCityZXMgICAgIFJOIDMKKworeF8zXzEgICBSTiA0Cit0bXAxICAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKK3RtcDIgICAgUk4gNQorCitwYXJ0VyAgIFJOIDYKK3hfN181ICAgUk4gNgordG1wMyAgICBSTiA2CisKK3BhcnRIICAgUk4gNwordG1wNCAgICBSTiA3CisKK3RtcDUgICAgUk4gOAorCit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAorCittdWx0XzIwXzAxICBSTiAxMQordG1wYiAgICAgICAgUk4gMTEKKworbXVsdF8yMF9tNSAgUk4gMTIKK3dpZHRoICAgICAgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKKworOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCis7Ly8KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKKzsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgorOy8vCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKKzsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgorOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Cis7Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAorOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCisKKworaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0CisKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBBREQgICAgIHRtcGEsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgIzUgICAgICAgICAgOy8vICh4MCtwYXJ0Vys1KQorICAgIENNUCAgICAgdG1wYSwgd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wNSwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQorICAgIEFERCAgICAgdG1wNSwgdG1wNSwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQorICAgIENNUCAgICAgdG1wNSwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCisKKworZG9fZmlsbAorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyB0bXA1ID0gcGFydEggKyA1CisgICAgQUREICAgICB0bXBhLCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wYSA9IHBhcnRXICsgNQorICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcGF9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQrNQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKKyAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKKyAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQorICAgIFNUUiAgICAgdG1wYSwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBMRFIgICAgIHRtcDYsIFtzcCwjMHgyMjhdICAgICAgIDsvLyBob3JWZXJPZmZzZXQKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgorICAgIE1MQSAgICAgdG1wNSwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wNSAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICA7Ly8gc3RvcmUgInJlZiIgZm9yIHZlcnRpY2FsIGZpbHRlcmluZworICAgIEFORCAgICAgdG1wNiwgdG1wNiwgIzIgICAgICAgICAgOy8vIGNhbGN1bGF0ZSByZWYgZm9yIGhvcml6b250YWwgZmlsdGVyCisgICAgTU9WICAgICB0bXBhLCAjMgorICAgIEFERCAgICAgdG1wNiwgdG1wYSwgdG1wNiwgTFNSICMxCisgICAgTUxBICAgICByZWYsIHRtcDYsIHdpZHRoLCByZWYKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAorCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIHdpZHRoCisgICAgTU9WICAgICBjb3VudCwgd2lkdGgKKyAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7CisgICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOworICAgIEFERCAgICAgdG1wNSwgcGFydEgsIHBhcnRXLCBMU0wgIzQKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNSwgTFNMICMxNgorCisKKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMSAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQiAgICA7Ly8gY29uc3RhbnQgbXVsdGlwbGllcnMKKyAgICBNT1YgICAgIHBsdXMxNiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gY29uc3RhbnQgZm9yIGFkZAorICAgIEFORCAgICAgdG1wNCwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNCwgTFNMICM4ICA7Ly8gcGFydEgtMSB0byBsb3dlciBwYXJ0IG9mIHRvcCBieXRlCisKKzsvLyBIT1JJWk9OVEFMIFBBUlQKKworbG9vcF95X2hvcgorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICAgOy8vIHBhcnRXLTEgdG8gdXBwZXIgcGFydCBvZiB0b3AgYnl0ZQorICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorCitsb29wX3hfaG9yCisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA2LCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXA1LCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXBhLCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQVRCICB0bXA2LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEICAgdG1wNSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcGEsIHhfNl80LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0CisgICAgU01MQURYICB0bXA2LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNgorICAgIFNNTEFEWCAgdG1wNSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDUKKyAgICBTTUxBRFggIHRtcGEsIHhfN181LCBtdWx0XzIwX201LCB0bXBhCisKKyAgICBTTUxBQkIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA0CisgICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKKyAgICBTTUxBQkIgIHRtcDUsIHhfN181LCBtdWx0XzIwX201LCB0bXA1CisgICAgU01MQURYICB0bXA2LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNgorICAgIFNNTEFCQiAgdG1wYSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcGEKKworICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1CisgICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKKyAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0CisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0CisgICAgQkNDICAgICBuZXh0X3lfaG9yCisKKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDYsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDUsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcGEsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBVEIgIHRtcDYsIHhfN181LCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQUQgICB0bXA1LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNQorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wYSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBRFggIHRtcDYsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQURYICB0bXA1LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNQorICAgIFNNTEFEWCAgdG1wYSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDQKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorICAgIFNNTEFCQiAgdG1wNSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDUKKyAgICBTTUxBRFggIHRtcDYsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA2CisgICAgU01MQUJCICB0bXBhLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wYQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCisgICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQorICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKKyAgICBCQ1MgICAgIGxvb3BfeF9ob3IKKworbmV4dF95X2hvcgorICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgICAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgICAgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkgIDsvLyBkZWNyZW1lbnQgY291bnRlciAocGFydFcpCisgICAgQkdFICAgICBsb29wX3lfaG9yCisKKworCis7Ly8gVkVSVElDQUwgUEFSVAorOy8vCis7Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgorOy8vCis7Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCis7Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCis7Ly8gaW4gZWFjaCByb3VuZC4KKzsvLworOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAorOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAorOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAorOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAorOy8vICAgICAgICAgICAuLgorOy8vICAgICAgICAgICAuLgorOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgorOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgorOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgorOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgorCis7Ly8gQXBwcm9hY2ggdG8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0byBxdWFydGVyIHBlbCBwb3NpdGlvbi4KKzsvLyA0IGJ5dGVzIGFyZSBwcm9jZXNzZWQgcGFyYWxsZWwKKzsvLworOy8vIGFsZ29yaXRobSAoYStiKzEpLzIuIFJvdWRpbmcgdXB3YXJkcyArMSBjYW4gYmUgYWNoaWV2ZWQgYnkgCis7Ly8gbmVnYXRpbmcgc2Vjb25kIG9wZXJhbmQgdG8gZ2V0IG9uZSdzIGNvbXBsZW1lbnQgKGluc3RlYWQgb2YgMidzKQorOy8vIGFuZCB1c2luZyBzdWJ0cmFjdGlvbiwgRU9SIGlzIHVzZWQgdG8gY29ycmVjdCBzaWduLgorOy8vCis7Ly8gTVZOICAgICBiLCBiCis7Ly8gVUhTVUI4ICBhLCBhLCBiCis7Ly8gRU9SICAgICBhLCBhLCAweDgwODA4MDgwCisKKworICAgIExEUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcGEsIFtzcCwgIzB4MjI4XSAgICAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0CisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICAgICAgOy8vIG1iCisgICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHgyMThdICAgICAgICAgOy8vIHdpZHRoCisgICAgQUREICAgICByZWYsIHJlZiwgIzIgICAgICAgICAgICAgICAgOy8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBvc2l0aW9uCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCAjMQorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcGEKKyAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwICAgICAgICA7Ly8gKzE2IHRvIGxvd2VyIGFuZCB1cHBlcmYgaGFsZndvcmRzCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGICAgOy8vIHBhcnRXaWR0aC0xCisKKyAgICBBTkQgICAgIHRtcGEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcGEsIExTTCAjOAorCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wNiwgTFNMICM4ICA7Ly8gcGFydFdpZHRoLTEKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wMSwgW21iXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZOICAgICB0bXAxLCB0bXAxCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKworICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKworICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCisKKworICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAyLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDIsIHRtcDIKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDMsIHRtcDMKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDUsIFttYl0KKyAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAorICAgIE1WTiAgICAgdG1wNSwgdG1wNQorCisgICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOCAgICAgICAgOy8vIGRlY3JlbWVudCB4IGxvb3AgY291bnRlcgorCisgICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCisgICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOworICAgIEFERCAgICAgcmVmLCByZWYsICM0ICAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCisKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKKworICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIG1iLCBtYiwgIzY0ICAgICAgICAgICAgICAgICA7Ly8gc2V0IENhcnJ5PTAKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4QyA8PCAyNCAgICA7Ly8gZGVjcmVtZW50IHkgbG9vcCBjb3VudGVyCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3AsIHNwLCAjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgxYWVkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCkBAIC0wLDAgKzEsMTYzIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorOw0KKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCis7DQorOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKzsNCis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOy0tDQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gaG9yaXpvbnRhbCBwYXJ0IG9mIA0KKzstLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZCBmdW5jdGlvbnMNCis7LS0NCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKw0KKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQ0KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQ0KKyAgICBFTFNFDQorICAgICAgICBSRVFVSVJFOA0KKyAgICAgICAgUFJFU0VSVkU4DQorICAgIEVORElGDQorDQorICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQ0KKw0KKw0KKzsvLyBSZWdpc3RlciBhbGxvY2F0aW9uDQorDQorcmVmICAgICBSTiAwICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gcmVmZXJlbmNlIGltYWdlDQorbWIgICAgICBSTiAxICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gaW50ZXJwb2xhdGVkIG1iDQorY291bnQgICBSTiAyICAgIDsvLyBiaXQtcGFja2VkIHdpZHRoIGFuZCBjb3VudCB2YWx1ZXMNCisNCit4XzJfMCAgIFJOIDQNCit4XzNfMSAgIFJOIDUNCit4XzZfNCAgIFJOIDYNCit4XzdfNSAgIFJOIDcNCisNCit0bXAxICAgIFJOIDgNCit0bXAyICAgIFJOIDkNCit0bXAzICAgIFJOIDEwDQordG1wNCAgICBSTiAxMQ0KKw0KK211bHRfMjBfMDEgIFJOIDEyICAgOy8vIFsyMCwgIDFdDQorbXVsdF8yMF9tNSAgUk4gMTQgICA7Ly8gWzIwLCAtNV0NCisNCisNCisgICAgICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUGFydA0KKw0KKzsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaA0KKzsvLw0KKzsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMNCis7Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4NCis7Ly8NCis7Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzANCis7Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4NCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQ0KKzsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01DQorOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjANCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDENCisNCisNCitoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQorICAgIFNUTUZEICAgc3AhLCB7cjQtcjExLCBscn0NCisNCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyDQorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpDQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQ0KKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQ0KKyAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTENCisgICAgOy8vIFsxNTowMF0gd2lkdGgNCisNCisNCisgICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDENCisgICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkINCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQorbG9vcF95DQorICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0NCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjMTINCisgICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQ0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4DQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQorDQorbG9vcF94DQorICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDQyAgICAgbmV4dF95DQorDQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCisNCisgICAgU01VQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201DQorICAgIFNNVUxUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDENCisgICAgU01VTFRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMQ0KKw0KKyAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQNCisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNA0KKw0KKyAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxDQorICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDINCisgICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMw0KKyAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDENCisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMg0KKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQ0KKyAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzDQorICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQNCisNCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQorICAgIEJDUyAgICAgbG9vcF94DQorDQorbmV4dF95DQorICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQ0KKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgIDsvLyArd2lkdGgNCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMxNiAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xDQorICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjApDQorICAgIEJHRSAgICAgbG9vcF95DQorDQorICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30NCisNCisgICAgRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0NGZjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKQEAgLTAsMCArMSwzNDcgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjMTYgICAgOy8vIHxwYXJ0SHxwYXJ0V3wKKyAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDAwMQorICAgIFNTVUIxNiAgY291bnQsIGNvdW50LCB0bXA1OyAgICAgOy8vIHxwYXJ0SC0xfHBhcnRXLTF8CisgICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAorCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgOy8vIHBhcnRXaWR0aAorCisKK2xvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzI0ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGgKKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisgICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aAorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAzLCBbcmVmXQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKyAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0CisKKyAgICBCQ1MgICAgIGxvb3BfeAorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7CisgICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgQUREICAgICB0bXAyLCB0bXAxLCAjMSAgICAgICAgICAgICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI2NmM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwpAQCAtMCwwICsxLDM3NCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCityZXMgICAgIFJOIDMKK3kwICAgICAgUk4gMworCit0bXAxICAgIFJOIDQKKwordG1wMiAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMyAgICBSTiA2CitwYXJ0VyAgIFJOIDYKKwordG1wNCAgICBSTiA3CitwYXJ0SCAgIFJOIDcKKwordG1wNSAgICBSTiA4Cit0bXA2ICAgIFJOIDkKKwordG1wYSAgICBSTiAxMAordG1wYiAgICBSTiAxMQord2lkdGggICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCisKKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKK2gyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDUsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAorICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1CisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KKworCitza2lwX2ZpbGwKKyAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAorICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisKKyAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjOCAgICA7Ly8gfHh4fHh4fHBhcnRIfHBhcnRXfAorICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMTAwCisgICAgUlNCICAgICBjb3VudCwgdG1wNSwgY291bnQsIExTTCAjOCAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHh4fAorICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHgyMjhdICAgICAgOy8vIHZlck9mZnNldAorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8dmVyT2Zmc2V0fAorICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAKKworICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwIDsvLyBwYXJ0V2lkdGgKKworCitsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMxNiAgOy8vIHBhcnRXaWR0aC0xIHRvIHRvcCBieXRlCisKK2xvb3BfeAorICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAorICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAorICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAorICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAorICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAorICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKworICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBNT1ZTICAgIHRtcDEsIGNvdW50LCBMU0wgIzMxICAgICAgICA7Ly8gdXBkYXRlIGZsYWdzICh2ZXJPZmZzZXQpCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAxLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQorCisKKyAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXAyLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wMiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAyICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdworCisgICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDMsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAzLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisgICAgTVZORVEgICB0bXA1LCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAorICAgIE1WTk5FICAgdG1wNSwgdG1wMSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKKworICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorCisgICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgorICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjQgICAgICAgIDsvLyAocGFydFdpZHRoLTEpIC09IDQ7CisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKyAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAorIAorICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBNT1YgICAgIHRtcDIsICMxCisgICAgQUREICAgICB0bXAyLCB0bXAyLCB0bXAxLCBMU1IgIzggICAgOy8vIHBhcnRXaWR0aAorICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCisgICAgQUREICAgICBtYiwgbWIsICM2NDsKKyAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCisgICAgQkdFICAgICBsb29wX3kKKworICAgIEFERCAgICAgc3Asc3AsIzB4MWY0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQorCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGQ4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdApAQCAtMCwwICsxLDE1IEBACitlY2hvIG9mZgorc2V0IEFTTUZMQUdTPSAtY2hlY2tyZWdsaXN0IC1DUFUgQVJNMTEzNiAtUHJlRGVmaW5lICJIMjY0REVDX1dJTkFTTSBTRVRMIHtUUlVFfSIKK3NldCBBU009IkQ6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxWQ1xjZVxiaW5ceDg2X2FybVxhcm1hc20iCitlY2hvIG9uCisKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKKworcmVtICVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCityZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTE2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKQEAgLTAsMCArMSw2NiBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkQ2xlYXJNYkxheWVyCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCitwTWJMYXllciAgICBSTiAgMAorc2l6ZSAgICAgICAgUk4gIDEKK3BUbXAgICAgICAgIFJOICAyCitzdGVwICAgICAgICBSTiAgMworCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FaZXJvICAgUU4gIFEwLlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgorOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RDbGVhck1iTGF5ZXIKKworICAgIFZNT1YgICAgcVplcm8sICMwCisgICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2CisgICAgTU9WICAgICBzdGVwLCAjMzIKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorCitsb29wCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0CisgICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAorICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAorICAgIEJDUyAgICAgbG9vcAorCisgICAgQlggICAgICBscgorICAgIEVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZDczZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zCkBAIC0wLDAgKzEsNDkgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCit2YWx1ZSAgICBSTiAgMAorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmFjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucwpAQCAtMCwwICsxLDE4MCBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkRmlsbFJvdzcKKworOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKKworcmVmICAgICBSTiAwCitmaWxsICAgIFJOIDEKK2xlZnQgICAgUk4gMgordG1wMiAgICBSTiAyCitjZW50ZXIgIFJOIDMKK3JpZ2h0ICAgUk4gNAordG1wMSAgICBSTiA1CisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworcVRtcDAgICBRTiAgUTAuVTgKK3FUbXAxICAgUU4gIFExLlU4CitkVG1wMCAgIEROICBEMC5VOAorZFRtcDEgICBETiAgRDEuVTgKK2RUbXAyICAgRE4gIEQyLlU4CitkVG1wMyAgIEROICBEMy5VOAorCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Cis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZEZpbGxSb3c3CisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQKKyAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKKyAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQorICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKKworc3dpdGNoX2NlbnRlcgorICAgICAgICBBU1IgICAgICB0bXAyLGNlbnRlciwjMgorICAgICAgICBDTVAgICAgICB0bXAyLCM5CisgICAgICAgIEFERENDICAgIHBjLHBjLHRtcDIsTFNMICMyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCisgICAgICAgIEIgICAgICAgIGNhc2VfMQorICAgICAgICBCICAgICAgICBjYXNlXzIKKyAgICAgICAgQiAgICAgICAgY2FzZV8zCisgICAgICAgIEIgICAgICAgIGNhc2VfNAorICAgICAgICBCICAgICAgICBjYXNlXzUKKyAgICAgICAgQiAgICAgICAgY2FzZV82CisgICAgICAgIEIgICAgICAgIGNhc2VfNworICAgICAgICBCICAgICAgICBjYXNlXzgKKztjYXNlXzgKKzsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV83Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfNgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAorO2Nhc2VfNAorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMworOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMgorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorO2Nhc2VfMQorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorCitjYXNlXzgKKyAgICAgICAgVkxEMSAgICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAgcVRtcDEsIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV83CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV81CisgICAgICAgIFZMRDEgICAgcVRtcDAsIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQKKyAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfMworICAgICAgICBWTEQxICAgIGRUbXAwLCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzEyCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAgZFRtcDAsIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8yCisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzEKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKKworbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgY2VudGVyLCAjMAorICAgICAgICBMRFJCTkUgICB0bXAyLCBbcmVmXSwgIzEKKyAgICAgICAgU1VCTkUgICAgY2VudGVyLCBjZW50ZXIsICMxCisgICAgICAgIFNUUkJORSAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQ01QICAgICAgcmlnaHQsIzAKKyAgICAgICAgUE9QRVEgICAge3I0LXI2LHBjfQorICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmLCMtMV0KKworbG9vcF9yaWdodAorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMzNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCkBAIC0wLDAgKzEsODIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZEZsdXNoQml0cworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworcFN0cm1EYXRhICAgICAgIFJOICAwCitudW1CaXRzICAgICAgICAgUk4gIDEKK3JlYWRCaXRzICAgICAgICBSTiAgMgorc3RybUJ1ZmZTaXplICAgIFJOICAzCitwU3RybUJ1ZmZTdGFydCAgUk4gIDEKK3BTdHJtQ3VyclBvcyAgICBSTiAgMgorYml0UG9zSW5Xb3JkICAgIFJOICAxCisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworCisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsKKzsgICAgICAgIElucHV0czoKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7Cis7ICAgICAgICBSZXR1cm5zOgorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RGbHVzaEJpdHMKKzsvLyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKzsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9CisKK2VuZF9vZl9zdHJlYW0KKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCis7Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQorCisgICAgRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTA3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKQEAgLTAsMCArMSwxNTIgQEAKKzsKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7CisKKyAgICBSRVFVSVJFOAorICAgIFBSRVNFUlZFOAorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKyAgICBFWFBPUlQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworaW1hZ2UgICBSTiAgMAorZGF0YSAgICBSTiAgMQord2lkdGggICBSTiAgMgorbHVtYSAgICBSTiAgMworY2IgICAgICBSTiAgNAorY3IgICAgICBSTiAgNQorY3dpZHRoICBSTiAgNgorCis7IC0tIE5FT04gcmVnaXN0ZXJzIC0tCisKK3FSb3cwICAgUU4gIFEwLlU4CitxUm93MSAgIFFOICBRMS5VOAorcVJvdzIgICBRTiAgUTIuVTgKK3FSb3czICAgUU4gIFEzLlU4CitxUm93NCAgIFFOICBRNC5VOAorcVJvdzUgICBRTiAgUTUuVTgKK3FSb3c2ICAgUU4gIFE2LlU4CitxUm93NyAgIFFOICBRNy5VOAorcVJvdzggICBRTiAgUTguVTgKK3FSb3c5ICAgUU4gIFE5LlU4CitxUm93MTAgIFFOICBRMTAuVTgKK3FSb3cxMSAgUU4gIFExMS5VOAorcVJvdzEyICBRTiAgUTEyLlU4CitxUm93MTMgIFFOICBRMTMuVTgKK3FSb3cxNCAgUU4gIFExNC5VOAorcVJvdzE1ICBRTiAgUTE1LlU4CisKK2RSb3cwICAgRE4gIEQwLlU4CitkUm93MSAgIEROICBEMS5VOAorZFJvdzIgICBETiAgRDIuVTgKK2RSb3czICAgRE4gIEQzLlU4CitkUm93NCAgIEROICBENC5VOAorZFJvdzUgICBETiAgRDUuVTgKK2RSb3c2ICAgRE4gIEQ2LlU4CitkUm93NyAgIEROICBENy5VOAorZFJvdzggICBETiAgRDguVTgKK2RSb3c5ICAgRE4gIEQ5LlU4CitkUm93MTAgIEROICBEMTAuVTgKK2RSb3cxMSAgRE4gIEQxMS5VOAorZFJvdzEyICBETiAgRDEyLlU4CitkUm93MTMgIEROICBEMTMuVTgKK2RSb3cxNCAgRE4gIEQxNC5VOAorZFJvdzE1ICBETiAgRDE1LlU4CisKKzsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworOworOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKzsgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKzsgICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgorOworOyAgICAgICAgSW5wdXRzOgorOyAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKKzsgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCis7Cis7ICAgICAgICBPdXRwdXRzOgorOyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCis7Cis7ICAgICAgICBSZXR1cm5zOgorOyAgICAgICAgICAgIG5vbmUKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCis7ICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzF9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93Mn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzV9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWFAMTI4XSwgd2lkdGgKKworICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgO2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDtjYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Y3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgO2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzB9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OH0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzF9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93OX0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzJ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTB9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3czfSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzExfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93NH0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMn0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEzfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzZ9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93N30sIFtjYkA2NF0KKyAgICBWU1QxICAgIHtkUm93MTV9LCBbY3JANjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzlmNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUwpAQCAtMCwwICsxLDQxIEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisKKworCisgICAgLm1hY3JvIFJFUVVJUkU4CisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVuZG0KKworICAgIC5tYWNybyBQUkVTRVJWRTgKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKyAgICAuZW5kbQorCisKKyAgICAubWFjcm8gZnVuY3Rpb24gbmFtZSwgZXhwb3J0PTAKKy5pZiBcZXhwb3J0CisgICAgLmdsb2JhbCBcbmFtZQorLmVuZGlmCisgICAgLnR5cGUgICBcbmFtZSwgJWZ1bmN0aW9uCisgICAgLmZ1bmMgICBcbmFtZQorXG5hbWU6CisgICAgLmVuZG0KKworICAgIC5tYWNybyBlbmRmdW5jdGlvbgorICAgIC5lbmRmdW5jCisgICAgLmVuZG0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhOTQwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKQEAgLTAsMCArMSw2OCBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKworI2luY2x1ZGUgImFzbV9jb21tb24uUyIKKworICAgIHByZXNlcnZlOAorCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBNYkxheWVyICAgIHIwCisjZGVmaW5lIHNpemUgICAgICAgIHIxCisjZGVmaW5lIHBUbXAgICAgICAgIHIyCisjZGVmaW5lIHN0ZXAgICAgICAgIHIzCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVplcm8gICBRMC5VOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RDbGVhck1iTGF5ZXIsIGV4cG9ydD0xCisKKyAgICBWTU9WICAgIHFaZXJvLCAjMAorICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgorICAgIE1PViAgICAgc3RlcCwgIzMyCisgICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKKworbG9vcDoKKyAgICBWU1QxICAgIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorICAgIFZTVDEgICAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCisgICAgVlNUMSAgICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKKyAgICBCQ1MgICAgIGxvb3AKKworICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI1M2QwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCkBAIC0wLDAgKzEsNDggQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisgICAgLmFybQorICAgIC50ZXh0CisKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHZhbHVlICAgIHIwCisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKworICAgICAgICBJbnB1dHM6CisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmdW5jdGlvbiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MsIGV4cG9ydD0xCisKKyAgICBDTFogICAgIHZhbHVlLCB2YWx1ZQorICAgIEJYICAgICAgbHIKKworZW5kZnVuY3Rpb24KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKQEAgLTAsMCArMSwxNDMgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICBwcmVzZXJ2ZTgKKworICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIHJlZiAgICAgcjAKKyNkZWZpbmUgZmlsbCAgICByMQorI2RlZmluZSBsZWZ0ICAgIHIyCisjZGVmaW5lIHRtcDIgICAgcjIKKyNkZWZpbmUgY2VudGVyICByMworI2RlZmluZSByaWdodCAgIHI0CisjZGVmaW5lIHRtcDEgICAgcjUKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworI2RlZmluZSBxVG1wMCAgICAgUTAuVTgKKyNkZWZpbmUgcVRtcDEgICAgIFExLlU4CisjZGVmaW5lIGRUbXAwICAgICBEMC5VOAorI2RlZmluZSBkVG1wMSAgICAgRDEuVTgKKyNkZWZpbmUgZFRtcDIgICAgIEQyLlU4CisjZGVmaW5lIGRUbXAzICAgICBEMy5VOAorCisvKgordm9pZCBoMjY0YnNkRmlsbFJvdzcoY29uc3QgdTggKiByZWYsIHU4ICogZmlsbCwgaTMyIGxlZnQsIGkzMiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICBpMzIgcmlnaHQpOworKi8KKworZnVuY3Rpb24gaDI2NGJzZEZpbGxSb3c3LCBleHBvcnQ9MQorCisgICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKKyAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KKyAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgorICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQorCitsb29wX2xlZnQ6CisgICAgICAgIFNVQlMgICAgIGxlZnQsIGxlZnQsICMxCisgICAgICAgIFNUUkIgICAgIHRtcDEsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9sZWZ0CisKK3N3aXRjaF9jZW50ZXI6CisgICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCisgICAgICAgIENNUCAgICAgIHRtcDIsIzkKKyAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgY2FzZV8xCisgICAgICAgIEIgICAgICAgIGNhc2VfMgorICAgICAgICBCICAgICAgICBjYXNlXzMKKyAgICAgICAgQiAgICAgICAgY2FzZV80CisgICAgICAgIEIgICAgICAgIGNhc2VfNQorICAgICAgICBCICAgICAgICBjYXNlXzYKKyAgICAgICAgQiAgICAgICAgY2FzZV83CisgICAgICAgIEIgICAgICAgIGNhc2VfOAorCitjYXNlXzg6CisgICAgICAgIFZMRDEgICAge3FUbXAwLCBxVG1wMX0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMzIKKyAgICAgICAgVlNUMSAgICB7cVRtcDB9LCBbZmlsbF0hCisgICAgICAgIFZTVDEgICAge3FUbXAxfSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzc6CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV82OgorICAgICAgICBWTEQxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjQKKyAgICAgICAgVlNUMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNToKKyAgICAgICAgVkxEMSAgICB7cVRtcDB9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzIwCisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAge3FUbXAwfSwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzQ6CisgICAgICAgIFZMRDEgICAge3FUbXAwfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgorICAgICAgICBWU1QxICAgIHtxVG1wMH0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8zOgorICAgICAgICBWTEQxICAgIHtkVG1wMH0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzI6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CitjYXNlXzE6CisgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0CisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CisKK2xvb3BfY2VudGVyOgorICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCisgICAgICAgIEJFUSAgICAgIGp1bXAKKyAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZl0sICMxCisgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjMQorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIEJORSAgICAgIGxvb3BfY2VudGVyCitqdW1wOgorICAgICAgICBDTVAgICAgICByaWdodCwjMAorICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9CisgICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQorCitsb29wX3JpZ2h0OgorICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCisgICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAorCisgICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KKworZW5kZnVuY3Rpb24KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YzMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpAQCAtMCwwICsxLDc4IEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisKKyAgICAuYXJtCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIHBTdHJtRGF0YSAgICAgICByMAorI2RlZmluZSBudW1CaXRzICAgICAgICAgcjEKKyNkZWZpbmUgcmVhZEJpdHMgICAgICAgIHIyCisjZGVmaW5lIHN0cm1CdWZmU2l6ZSAgICByMworI2RlZmluZSBwU3RybUJ1ZmZTdGFydCAgcjEKKyNkZWZpbmUgcFN0cm1DdXJyUG9zICAgIHIyCisjZGVmaW5lIGJpdFBvc0luV29yZCAgICByMQorCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisKKyAgICAgICAgSW5wdXRzOgorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Z1bmN0aW9uIGgyNjRic2RGbHVzaEJpdHMsIGV4cG9ydD0xCisKKyAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCisKKyAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCisgICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3CisKKyAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQorICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCisKKyAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCisKKyAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCisKKyAgICBCSEkgZW5kX29mX3N0cmVhbQorCisgICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKKyAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQorICAgIE1PViByMCwgIzAKKyAgICBCWCAgbHIKKworZW5kX29mX3N0cmVhbToKKyAgICBNVk4gcjAsICMwCisgICAgQlggIGxyCisKK2VuZGZ1bmN0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1ZDU2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKQEAgLTAsMCArMSwxNTcgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICByZXF1aXJlOAorICAgIHByZXNlcnZlOAorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworI2RlZmluZSBpbWFnZSAgIHIwCisjZGVmaW5lIGRhdGEgICAgcjEKKyNkZWZpbmUgd2lkdGggICByMgorI2RlZmluZSBsdW1hICAgIHIzCisjZGVmaW5lIGNiICAgICAgcjQKKyNkZWZpbmUgY3IgICAgICByNQorI2RlZmluZSBjd2lkdGggIHI2CisKKy8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCisKKyNkZWZpbmUgcVJvdzAgICAgIFEwLlU4CisjZGVmaW5lIHFSb3cxICAgICBRMS5VOAorI2RlZmluZSBxUm93MiAgICAgUTIuVTgKKyNkZWZpbmUgcVJvdzMgICAgIFEzLlU4CisjZGVmaW5lIHFSb3c0ICAgICBRNC5VOAorI2RlZmluZSBxUm93NSAgICAgUTUuVTgKKyNkZWZpbmUgcVJvdzYgICAgIFE2LlU4CisjZGVmaW5lIHFSb3c3ICAgICBRNy5VOAorI2RlZmluZSBxUm93OCAgICAgUTguVTgKKyNkZWZpbmUgcVJvdzkgICAgIFE5LlU4CisjZGVmaW5lIHFSb3cxMCAgICBRMTAuVTgKKyNkZWZpbmUgcVJvdzExICAgIFExMS5VOAorI2RlZmluZSBxUm93MTIgICAgUTEyLlU4CisjZGVmaW5lIHFSb3cxMyAgICBRMTMuVTgKKyNkZWZpbmUgcVJvdzE0ICAgIFExNC5VOAorI2RlZmluZSBxUm93MTUgICAgUTE1LlU4CisKKyNkZWZpbmUgZFJvdzAgICAgIEQwLlU4CisjZGVmaW5lIGRSb3cxICAgICBEMS5VOAorI2RlZmluZSBkUm93MiAgICAgRDIuVTgKKyNkZWZpbmUgZFJvdzMgICAgIEQzLlU4CisjZGVmaW5lIGRSb3c0ICAgICBENC5VOAorI2RlZmluZSBkUm93NSAgICAgRDUuVTgKKyNkZWZpbmUgZFJvdzYgICAgIEQ2LlU4CisjZGVmaW5lIGRSb3c3ICAgICBENy5VOAorI2RlZmluZSBkUm93OCAgICAgRDguVTgKKyNkZWZpbmUgZFJvdzkgICAgIEQ5LlU4CisjZGVmaW5lIGRSb3cxMCAgICBEMTAuVTgKKyNkZWZpbmUgZFJvdzExICAgIEQxMS5VOAorI2RlZmluZSBkUm93MTIgICAgRDEyLlU4CisjZGVmaW5lIGRSb3cxMyAgICBEMTMuVTgKKyNkZWZpbmUgZFJvdzE0ICAgIEQxNC5VOAorI2RlZmluZSBkUm93MTUgICAgRDE1LlU4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RXcml0ZU1hY3JvYmxvY2ssIGV4cG9ydD0xCisgICAgUFVTSCAgICB7cjQtcjYsbHJ9CisgICAgVlBVU0ggICB7cTQtcTd9CisKKyAgICBMRFIgICAgIHdpZHRoLCBbaW1hZ2UsICM0XQorICAgIExEUiAgICAgbHVtYSwgW2ltYWdlLCAjMHhDXQorICAgIExEUiAgICAgY2IsIFtpbWFnZSwgIzB4MTBdCisgICAgTERSICAgICBjciwgW2ltYWdlLCAjMHgxNF0KKworCitAICAgV3JpdGUgbHVtYQorICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEKKyAgICBMU0wgICAgIHdpZHRoLCB3aWR0aCwgIzQKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hCisgICAgTFNSICAgICBjd2lkdGgsIHdpZHRoLCAjMQorICAgIFZTVDEgICAge3FSb3cwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cxfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzgsIHFSb3c5fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3czfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxNCwgcVJvdzE1fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c2fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisKKyAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDsvL2NiIHJvd3MgMCwxLDIsMworICAgIFZTVDEgICAge3FSb3c3fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Ly9jYiByb3dzIDQsNSw2LDcKKyAgICBWU1QxICAgIHtxUm93OH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgOy8vY3Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzl9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDsvL2NyIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3cxMH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cwfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c4fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cxfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c5fSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxMn0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3cyfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMH0sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93M30sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTF9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzR9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEyfSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxNX0sIFtsdW1hXQorICAgIFZTVDEgICAge2RSb3c1fSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxM30sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93Nn0sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTR9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzd9LCBbY2IsOjY0XQorICAgIFZTVDEgICAge2RSb3cxNX0sIFtjciw6NjRdCisKKyAgICBWUE9QICAgIHtxNC1xN30KKyAgICBQT1AgICAgIHtyNC1yNixwY30KK0AgICAgQlggICAgICBscgorCisgICAgLmVuZGZ1bmMKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI3N2Y4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRXh0cmFjdE5hbFVuaXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQllURV9TVFJFQU1fRVJST1IgIDB4RkZGRkZGRkYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogRXh0cmFjdE5hbFVuaXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRXh0cmFjdHMgb25lIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtIGJ1ZmZlci4gUmVtb3ZlcworICAgICAgICAgICAgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgaWYgcHJlc2VudC4gVGhlIG9yaWdpbmFsIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGlzIHVzZWQgZGlyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBtb2RpZmllZCBpZiBlbXVsYXRpb24gcHJldmVudGlvbgorICAgICAgICAgICAgYnl0ZXMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgU3RyZWFtIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gZWl0aGVyIGV4YWN0bHkgb25lIE5BTCB1bml0CisgICAgICAgICAgICBhbmQgbm90aGluZyBlbHNlLCBvciBvbmUgb3IgbW9yZSBOQUwgdW5pdHMgZW1iZWRkZWQgaW4gYnl0ZQorICAgICAgICAgICAgc3RyZWFtIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEFubmV4IEIgb2YgdGhlIHN0YW5kYXJkLiBGdW5jdGlvbgorICAgICAgICAgICAgZGV0ZWN0cyB3aGljaCBvbmUgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwQnl0ZVN0cmVhbSAgICAgcG9pbnRlciB0byBieXRlIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN0cmVhbSBidWZmZXIgKGluIGJ5dGVzKQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgc3RyZWFtIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGVycm9yIGluIGJ5dGUgc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKyAgICB1MzIgYnl0ZUNvdW50LGluaXRCeXRlQ291bnQ7CisgICAgdTMyIHplcm9Db3VudDsKKyAgICB1OCAgYnl0ZTsKKyAgICB1MzIgaGFzRW11bGF0aW9uID0gSEFOVFJPX0ZBTFNFOworICAgIHUzMiBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX0ZBTFNFOworICAgIHU4ICpyZWFkUHRyLCAqd3JpdGVQdHI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwQnl0ZVN0cmVhbSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKGxlbiA8IEJZVEVfU1RSRUFNX0VSUk9SKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworICAgIC8qIGJ5dGUgc3RyZWFtIGZvcm1hdCBpZiBzdGFydHMgd2l0aCAweDAwMDAwMSBvciAweDAwMDAwMCAqLworICAgIGlmIChsZW4gPiAzICYmIHBCeXRlU3RyZWFtWzBdID09IDB4MDAgJiYgcEJ5dGVTdHJlYW1bMV0gPT0gMHgwMCAmJgorICAgICAgICAocEJ5dGVTdHJlYW1bMl0mMHhGRSkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8qIHNlYXJjaCBmb3IgTkFMIHVuaXQgc3RhcnQgcG9pbnQsIGkuZS4gcG9pbnQgYWZ0ZXIgZmlyc3Qgc3RhcnQgY29kZQorICAgICAgICAgKiBwcmVmaXggaW4gdGhlIHN0cmVhbSAqLworICAgICAgICB6ZXJvQ291bnQgPSBieXRlQ291bnQgPSAyOworICAgICAgICByZWFkUHRyID0gcEJ5dGVTdHJlYW0gKyAyOworICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKKyAgICAgICAgICAgIGJ5dGVDb3VudCsrOworCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBzdGFydCBjb2RlIHByZWZpeCBmb3VuZCAtPiBlcnJvciAqLworICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSBsZW47CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbml0Qnl0ZUNvdW50ID0gYnl0ZUNvdW50OworCisgICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIHRoZSBOQUwgdW5pdC4gU2VhcmNoIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4CisgICAgICAgICAqIG9yIGVuZCBvZiBzdHJlYW0gYW5kIGlnbm9yZSBwb3NzaWJsZSB0cmFpbGluZyB6ZXJvIGJ5dGVzICovCisgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOworICAgICAgICAgICAgYnl0ZUNvdW50Kys7CisgICAgICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMykgJiYgKHplcm9Db3VudCA9PSAyKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudCAtIDE7CisgICAgICAgICAgICAgICAgemVyb0NvdW50IC09IE1JTih6ZXJvQ291bnQsIDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemVyb0NvdW50ID49IDMpCisgICAgICAgICAgICAgICAgICAgIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBzZXBhcmF0ZSBOQUwgdW5pdHMgYXMgaW5wdXQgLT4ganVzdCBzZXQgc3RyZWFtIHBhcmFtcyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluaXRCeXRlQ291bnQgPSAwOworICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGxlbjsKKyAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgfQorCisgICAgcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCAgICA9IHBCeXRlU3RyZWFtICsgaW5pdEJ5dGVDb3VudDsKKyAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAgICAgID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCAgICAgID0gMDsKKyAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgID0gMDsKKworICAgIC8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiAqLworICAgICpyZWFkQnl0ZXMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSArIGluaXRCeXRlQ291bnQgKyB6ZXJvQ291bnQ7CisKKyAgICBpZiAoaW52YWxpZFN0cmVhbSkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiByZW1vdmUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgYmVmb3JlIHJic3AgcHJvY2Vzc2luZyAqLworICAgIGlmIChoYXNFbXVsYXRpb24pCisgICAgeworICAgICAgICB0bXAgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZTsKKyAgICAgICAgcmVhZFB0ciA9IHdyaXRlUHRyID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKKyAgICAgICAgemVyb0NvdW50ID0gMDsKKyAgICAgICAgZm9yIChpID0gdG1wOyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPT0gMHgwMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSBzaGFsbCBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGJ5dGVzOiAweDAwLCAweDAxLCAweDAyLCAweDAzLiBUaGlzIGltcGxpZXMgdGhhdAorICAgICAgICAgICAgICAgICAqIGVtdWxhdGlvbiBwcmV2ZW50aW9uIDB4MDMgYnl0ZSBzaGFsbCBub3QgYmUgdGhlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJlYW0uICovCisgICAgICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoKihyZWFkUHRyKzEpID4gMHgwMykgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3Qgd3JpdGUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSAqLworICAgICAgICAgICAgICAgIHJlYWRQdHIrKzsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5BTCB1bml0IHNoYWxsIG5vdCBjb250YWluIGJ5dGUgc2VxdWVuY2VzIDB4MDAwMDAwLAorICAgICAgICAgICAgICAgICAqIDB4MDAwMDAxIG9yIDB4MDAwMDAyICovCisgICAgICAgICAgICAgICAgaWYgKCAoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA8PSAweDAyKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAgICAgICAgIGlmICgqcmVhZFB0ciA9PSAwKQorICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAqd3JpdGVQdHIrKyA9ICpyZWFkUHRyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAocmVhZFB0ciAtIHdyaXRlUHRyKSBpbmRpY2F0ZXMgbnVtYmVyIG9mICJyZW1vdmVkIiBlbXVsYXRpb24KKyAgICAgICAgICogcHJldmVudGlvbiBieXRlcyAtPiBzdWJ0cmFjdCBmcm9tIHN0cmVhbSBidWZmZXIgc2l6ZSAqLworICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAtPSAodTMyKShyZWFkUHRyIC0gd3JpdGVQdHIpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZhZWM3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorI2RlZmluZSBIMjY0U1dERUNfQllURV9TVFJFQU1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdTMyICpyZWFkQnl0ZXMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTFkNzhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCkBAIC0wLDAgKzEsOTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgRGVjb2RlQ29lZmZUb2tlbgorICAgICAgICAgIERlY29kZUxldmVsUHJlZml4CisgICAgICAgICAgRGVjb2RlVG90YWxaZXJvcworICAgICAgICAgIERlY29kZVJ1bkJlZm9yZQorICAgICAgICAgIERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRm9sbG93aW5nIGRlc2NyaXB0aW9ucyB1c2UgdGVybSAiaW5mb3JtYXRpb24gZmllbGQiIHRvIHJlcHJlc2VudCBjb21iaW5hdGlvbgorICogb2YgY2VydGFpbiBkZWNvZGVkIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZQorICogbGVuZ3RoIGNvZGUgd29yZC4gRm9yIGV4YW1wbGUsIHRvdGFsX3plcm9zIGluZm9ybWF0aW9uIGZpZWxkIGNvbnNpc3RzIG9mCisgKiA0IGJpdHMgc3ltYm9sIHZhbHVlIChiaXRzIFs0LDddKSBhbG9uZyB3aXRoIGZvdXIgYml0cyB0byByZXByZXNlbnQgbGVuZ3RoCisgKiBvZiB0aGUgVkxDIGNvZGUgd29yZCAoYml0cyBbMCwzXSkgKi8KKworLyogbWFjcm8gdG8gb2J0YWluIGxlbmd0aCBvZiB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gZmllbGQsIGJpdHMgWzAsNF0gICovCisjZGVmaW5lIExFTkdUSF9UQyh2bGMpICgodmxjKSAmIDB4MUYpCisvKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzAsM10gKi8KKyNkZWZpbmUgTEVOR1RIKHZsYykgKCh2bGMpICYgMHhGKQorLyogbWFjcm8gdG8gb2J0YWluIGNvZGUgd29yZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzQsN10gKi8KKyNkZWZpbmUgSU5GTyh2bGMpICgoKHZsYykgPj4gNCkgJiAweEYpICAvKiA0IE1TQiBiaXRzIGNvbnRhaW4gaW5mb3JtYXRpb24gKi8KKy8qIG1hY3JvIHRvIG9idGFpbiB0cmFpbGluZyBvbmVzIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFs1LDEwXSAqLworI2RlZmluZSBUUkFJTElOR19PTkVTKGNvZWZmVG9rZW4pICgoY29lZmZUb2tlbj4+NSkgJiAweDNGKQorLyogbWFjcm8gdG8gb2J0YWluIHRvdGFsIGNvZWZmIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCisgKiBiaXRzIFsxMSwxNV0gKi8KKyNkZWZpbmUgVE9UQUxfQ09FRkYoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbikgPj4gMTEpICYgMHgxRikKKworI2RlZmluZSBWTENfTk9UX0ZPVU5EIDB4RkZGRkZGRkVVCisKKy8qIFZMQyB0YWJsZXMgZm9yIGNvZWZmX3Rva2VuLiBCZWNhdXNlIG9mIGxvbmcgY29kZXMgKG1heC4gMTYgYml0cykgc29tZSBvZiB0aGUKKyAqIHRhYmxlcyBoYXZlIGJlZW4gc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBzZXBhcmF0ZSB0YWJsZXMuIEVhY2ggYXJyYXkvdGFibGUKKyAqIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzUgYml0cyBmb3IgdG90LmNvZWZmLl0gWzYgYml0cyBmb3IgdHIub25lc10gWzUgYml0cyBmb3IgVkxDIGxlbmd0aF0KKyAqIElmIHRoZXJlIGlzIGEgMHgwMDAwIHZhbHVlLCBpdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vdCBjb3JyZXNwb25kaW5nIFZMQworICogY29kZXdvcmQgZm9yIHRoYXQgaW5kZXguICovCisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMFszMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyMDY2LDB4MTAyNiwweDA4MDYsMHgxODY1LDB4MTg2NSwKKyAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLAorICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsCisgICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzFbNDhdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQwNmEsMHgzMDRhLDB4MjgyYSwweDIwMGEsCisgICAgMHgzODY5LDB4Mzg2OSwweDI4NDksMHgyODQ5LDB4MjAyOSwweDIwMjksMHgxODA5LDB4MTgwOSwKKyAgICAweDMwNjgsMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LAorICAgIDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTgyOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwweDEwMDgsCisgICAgMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywKKyAgICAweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMls1Nl0gPSB7CisgICAgMHg2MDZlLDB4NTg0ZSwweDUwMmUsMHg1MDBlLDB4NTg2ZSwweDUwNGUsMHg0ODJlLDB4NDgwZSwKKyAgICAweDQwMGQsMHg0MDBkLDB4NDg0ZCwweDQ4NGQsMHg0MDJkLDB4NDAyZCwweDM4MGQsMHgzODBkLAorICAgIDB4NTA2ZCwweDUwNmQsMHg0MDRkLDB4NDA0ZCwweDM4MmQsMHgzODJkLDB4MzAwZCwweDMwMGQsCisgICAgMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwKKyAgICAweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLAorICAgIDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsCisgICAgMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDE2IGJpdHMsIDAgPD0gbkMgPCAyICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzNbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHg2ODJmLDB4NjgyZiwweDgwMTAsMHg4MDUwLDB4ODAzMCwweDc4MTAsCisgICAgMHg4MDcwLDB4Nzg1MCwweDc4MzAsMHg3MDEwLDB4Nzg3MCwweDcwNTAsMHg3MDMwLDB4NjgxMCwKKyAgICAweDcwNmYsMHg3MDZmLDB4Njg0ZiwweDY4NGYsMHg2MDJmLDB4NjAyZiwweDYwMGYsMHg2MDBmLAorICAgIDB4Njg2ZiwweDY4NmYsMHg2MDRmLDB4NjA0ZiwweDU4MmYsMHg1ODJmLDB4NTgwZiwweDU4MGZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzBbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDM4NjYsMHgyMDQ2LDB4MjAyNiwweDEwMDYsCisgICAgMHgzMDY2LDB4MTg0NiwweDE4MjYsMHgwODA2LDB4Mjg2NSwweDI4NjUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LAorICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDN9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzFbMzJdID0geworICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDQ4NjksMHgzODQ5LDB4MzgyOSwweDMwMDksCisgICAgMHgyODA4LDB4MjgwOCwweDMwNDgsMHgzMDQ4LDB4MzAyOCwweDMwMjgsMHgyMDA4LDB4MjAwOCwKKyAgICAweDQwNjcsMHg0MDY3LDB4NDA2NywweDQwNjcsMHgyODQ3LDB4Mjg0NywweDI4NDcsMHgyODQ3LAorICAgIDB4MjgyNywweDI4MjcsMHgyODI3LDB4MjgyNywweDE4MDcsMHgxODA3LDB4MTgwNywweDE4MDd9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAyIDw9IG5DIDwgNCAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8yWzEyOF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDc4NmQsMHg3ODZkLDB4ODA2ZSwweDgwNGUsMHg4MDJlLDB4ODAwZSwKKyAgICAweDc4MmUsMHg3ODBlLDB4Nzg0ZSwweDcwMmUsMHg3MDRkLDB4NzA0ZCwweDcwMGQsMHg3MDBkLAorICAgIDB4NzA2ZCwweDcwNmQsMHg2ODRkLDB4Njg0ZCwweDY4MmQsMHg2ODJkLDB4NjgwZCwweDY4MGQsCisgICAgMHg2ODZkLDB4Njg2ZCwweDYwNGQsMHg2MDRkLDB4NjAyZCwweDYwMmQsMHg2MDBkLDB4NjAwZCwKKyAgICAweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODRjLDB4NTg0YywweDU4NGMsMHg1ODRjLAorICAgIDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTgyYywweDUwMGMsMHg1MDBjLDB4NTAwYywweDUwMGMsCisgICAgMHg2MDZjLDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NTA0YywweDUwNGMsMHg1MDRjLDB4NTA0YywKKyAgICAweDUwMmMsMHg1MDJjLDB4NTAyYywweDUwMmMsMHg0ODBjLDB4NDgwYywweDQ4MGMsMHg0ODBjLAorICAgIDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsCisgICAgMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwKKyAgICAweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLAorICAgIDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsCisgICAgMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwKKyAgICAweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLAorICAgIDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsCisgICAgMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMFs2NF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwKKyAgICAweDE4MDYsMHgzODQ2LDB4MzgyNiwweDEwMDYsMHg0ODY2LDB4MzA0NiwweDMwMjYsMHgwODA2LAorICAgIDB4MjgyNSwweDI4MjUsMHgyODQ1LDB4Mjg0NSwweDIwMjUsMHgyMDI1LDB4MjA0NSwweDIwNDUsCisgICAgMHgxODI1LDB4MTgyNSwweDQwNjUsMHg0MDY1LDB4MTg0NSwweDE4NDUsMHgxMDI1LDB4MTAyNSwKKyAgICAweDM4NjQsMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LAorICAgIDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4Mjg2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsCisgICAgMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwKKyAgICAweDA4MjQsMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0fTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgNCA8PSBuQyA8IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjRfMVsxMjhdID0geworICAgIDB4MDAwMCwweDgwMGEsMHg4MDZhLDB4ODA0YSwweDgwMmEsMHg3ODBhLDB4Nzg2YSwweDc4NGEsCisgICAgMHg3ODJhLDB4NzAwYSwweDcwNmEsMHg3MDRhLDB4NzAyYSwweDY4MGEsMHg2ODI5LDB4NjgyOSwKKyAgICAweDYwMDksMHg2MDA5LDB4Njg0OSwweDY4NDksMHg2MDI5LDB4NjAyOSwweDU4MDksMHg1ODA5LAorICAgIDB4Njg2OSwweDY4NjksMHg2MDQ5LDB4NjA0OSwweDU4MjksMHg1ODI5LDB4NTAwOSwweDUwMDksCisgICAgMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwKKyAgICAweDUwMjgsMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LAorICAgIDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTg2OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsCisgICAgMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDAwOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwKKyAgICAweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LAorICAgIDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsCisgICAgMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywKKyAgICAweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LAorICAgIDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsCisgICAgMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywKKyAgICAweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LAorICAgIDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDd9OworCisvKiBmaXhlZCA2IGJpdCBsZW5ndGggVkxDLCBuQyA8PSA4ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW44WzY0XSA9IHsKKyAgICAweDA4MDYsMHgwODI2LDB4MDAwMCwweDAwMDYsMHgxMDA2LDB4MTAyNiwweDEwNDYsMHgwMDAwLAorICAgIDB4MTgwNiwweDE4MjYsMHgxODQ2LDB4MTg2NiwweDIwMDYsMHgyMDI2LDB4MjA0NiwweDIwNjYsCisgICAgMHgyODA2LDB4MjgyNiwweDI4NDYsMHgyODY2LDB4MzAwNiwweDMwMjYsMHgzMDQ2LDB4MzA2NiwKKyAgICAweDM4MDYsMHgzODI2LDB4Mzg0NiwweDM4NjYsMHg0MDA2LDB4NDAyNiwweDQwNDYsMHg0MDY2LAorICAgIDB4NDgwNiwweDQ4MjYsMHg0ODQ2LDB4NDg2NiwweDUwMDYsMHg1MDI2LDB4NTA0NiwweDUwNjYsCisgICAgMHg1ODA2LDB4NTgyNiwweDU4NDYsMHg1ODY2LDB4NjAwNiwweDYwMjYsMHg2MDQ2LDB4NjA2NiwKKyAgICAweDY4MDYsMHg2ODI2LDB4Njg0NiwweDY4NjYsMHg3MDA2LDB4NzAyNiwweDcwNDYsMHg3MDY2LAorICAgIDB4NzgwNiwweDc4MjYsMHg3ODQ2LDB4Nzg2NiwweDgwMDYsMHg4MDI2LDB4ODA0NiwweDgwNjZ9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAzIGJpdHMsIG5DID09IC0xICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMFs4XSA9IHsKKyAgICAweDAwMDAsMHgxMDQzLDB4MDAwMiwweDAwMDIsMHgwODIxLDB4MDgyMSwweDA4MjEsMHgwODIxfTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gOCBiaXRzLCBuQyA9PSAtMSAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzFbMzJdID0geworICAgIDB4MjA2NywweDIwNjcsMHgyMDQ4LDB4MjAyOCwweDE4NDcsMHgxODQ3LDB4MTgyNywweDE4MjcsCisgICAgMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MTgwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwKKyAgICAweDEwMDYsMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxODY2LDB4MTg2NiwweDE4NjYsMHgxODY2LAorICAgIDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MTAyNiwweDA4MDYsMHgwODA2LDB4MDgwNiwweDA4MDZ9OworCisvKiBWTEMgdGFibGVzIGZvciB0b3RhbF96ZXJvcy4gT25lIHRhYmxlIGNvbnRhaW5pbmcgbG9uZ2VyIGNvZGUsIHRvdGFsWmVyb3NfMSwKKyAqIGhhcyBiZWVuIGJyb2tlbiBpbnRvIHR3byBzZXBhcmF0ZSB0YWJsZXMuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlCisgKiBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzQgYml0cyBmb3IgVkxDIGxlbmd0aF0gKi8KKworLyogVkxDIGxlbmd0aHMgdXAgdG8gNSBiaXRzICovCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzBbMzJdID0geworICAgIDB4MDAsMHgwMCwweDY1LDB4NTUsMHg0NCwweDQ0LDB4MzQsMHgzNCwKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cyAqLworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8xWzMyXSA9IHsKKyAgICAweDAwLDB4ZjksMHhlOSwweGQ5LDB4YzgsMHhjOCwweGI4LDB4YjgsCisgICAgMHhhNywweGE3LDB4YTcsMHhhNywweDk3LDB4OTcsMHg5NywweDk3LAorICAgIDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwKKyAgICAweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzZ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18yWzY0XSA9IHsKKyAgICAweGU2LDB4ZDYsMHhjNiwweGI2LDB4YTUsMHhhNSwweDk1LDB4OTUsCisgICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDc0LDB4NzQsMHg3NCwweDc0LAorICAgIDB4NjQsMHg2NCwweDY0LDB4NjQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsCisgICAgMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfM1s2NF0gPSB7CisgICAgMHhkNiwweGI2LDB4YzUsMHhjNSwweGE1LDB4YTUsMHg5NSwweDk1LAorICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg1NCwweDU0LDB4NTQsMHg1NCwKKyAgICAweDQ0LDB4NDQsMHg0NCwweDQ0LDB4MDQsMHgwNCwweDA0LDB4MDQsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzRbMzJdID0geworICAgIDB4YzUsMHhiNSwweGE1LDB4MDUsMHg5NCwweDk0LDB4NzQsMHg3NCwKKyAgICAweDM0LDB4MzQsMHgyNCwweDI0LDB4ODMsMHg4MywweDgzLDB4ODMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgxMywweDEzLDB4MTMsMHgxM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzVbMzJdID0geworICAgIDB4YjUsMHg5NSwweGE0LDB4YTQsMHg4NCwweDg0LDB4MjQsMHgyNCwKKyAgICAweDE0LDB4MTQsMHgwNCwweDA0LDB4NzMsMHg3MywweDczLDB4NzMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDUzLDB4NTMsMHg1MywweDUzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHgzMywweDMzLDB4MzMsMHgzM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzZbNjRdID0geworICAgIDB4YTYsMHgwNiwweDE1LDB4MTUsMHg4NCwweDg0LDB4ODQsMHg4NCwKKyAgICAweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAorICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjN9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc183WzY0XSA9IHsKKyAgICAweDk2LDB4MDYsMHgxNSwweDE1LDB4NzQsMHg3NCwweDc0LDB4NzQsCisgICAgMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOFs2NF0gPSB7CisgICAgMHg4NiwweDA2LDB4MjUsMHgyNSwweDE0LDB4MTQsMHgxNCwweDE0LAorICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKKyAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0Mn07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzlbNjRdID0geworICAgIDB4MTYsMHgwNiwweDc1LDB4NzUsMHgyNCwweDI0LDB4MjQsMHgyNCwKKyAgICAweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAorICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAorICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwKKyAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMFszMl0gPSB7CisgICAgMHgxNSwweDA1LDB4NjQsMHg2NCwweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTFbMTZdID0geworICAgIDB4MDQsMHgxNCwweDIzLDB4MjMsMHgzMywweDMzLDB4NTMsMHg1MywKKyAgICAweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDF9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMlsxNl0gPSB7CisgICAgMHgwNCwweDE0LDB4NDMsMHg0MywweDIyLDB4MjIsMHgyMiwweDIyLAorICAgIDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEzWzhdID0gezB4MDMsMHgxMywweDMyLDB4MzIsMHgyMSwweDIxLDB4MjEsMHgyMX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzE0WzRdID0gezB4MDIsMHgxMiwweDIxLDB4MjF9OworCisvKiBWTEMgdGFibGVzIGZvciBydW5fYmVmb3JlLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICogWzQgYml0cyBmb3IgaW5mb10gWzRiaXRzIGZvciBWTEMgbGVuZ3RoXQorICovCisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNls4XSA9IHsweDEzLDB4MjMsMHg0MywweDMzLDB4NjMsMHg1MywweDAyLDB4MDJ9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzVbOF0gPSB7MHg1MywweDQzLDB4MzMsMHgyMywweDEyLDB4MTIsMHgwMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV80WzhdID0gezB4NDMsMHgzMywweDIyLDB4MjIsMHgxMiwweDEyLDB4MDIsMHgwMn07CisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfM1s0XSA9IHsweDMyLDB4MjIsMHgxMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8yWzRdID0gezB4MjIsMHgxMiwweDAxLDB4MDF9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzFbMl0gPSB7MHgxMSwweDAxfTsKKworLyogZm9sbG93aW5nIGZvdXIgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBzdHJlYW0gYnVmZmVyICJjYWNoZSIgaW4gdGhlIENBVkxDCisgKiBkZWNvZGluZyBmdW5jdGlvbiAqLworCisvKiBtYWNybyB0byBpbml0aWFsaXplIHN0cmVhbSBidWZmZXIgY2FjaGUsIGZpbGxzIHRoZSBidWZmZXIgKDMyIGJpdHMpICovCisjZGVmaW5lIEJVRkZFUl9JTklUKHZhbHVlLCBiaXRzKSBcCit7IFwKKyAgICBiaXRzID0gMzI7IFwKKyAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKK30KKworLyogbWFjcm8gdG8gcmVhZCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbiB0bworICogb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KKyNkZWZpbmUgQlVGRkVSX1NIT1codmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKK30KKworLyogbWFjcm8gdG8gZmx1c2ggbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBCVUZGRVJfRkxVU0godmFsdWUsIGJpdHMsIG51bUJpdHMpIFwKK3sgXAorICAgIHZhbHVlIDw8PSAobnVtQml0cyk7IFwKKyAgICBiaXRzIC09IChudW1CaXRzKTsgXAorfQorCisvKiBtYWNybyB0byByZWFkIGFuZCBmbHVzaCAgbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgYml0cyB3aWxsIGJlIHdyaXR0ZW4KKyAqIHRvIG91dFZhbC4gUmVmaWxscyB0aGUgYnVmZmVyIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0ICovCisjZGVmaW5lIEJVRkZFUl9HRVQodmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoreyBcCisgICAgaWYgKGJpdHMgPCAobnVtQml0cykpIFwKKyAgICB7IFwKKyAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItYml0cykgPT0gRU5EX09GX1NUUkVBTSkgXAorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCisgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorICAgICAgICBiaXRzID0gMzI7IFwKKyAgICB9IFwKKyAgICAob3V0VmFsKSA9IHZhbHVlID4+ICgzMiAtIChudW1CaXRzKSk7IFwKKyAgICB2YWx1ZSA8PD0gKG51bUJpdHMpOyBcCisgICAgYml0cyAtPSAobnVtQml0cyk7IFwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpOworCitzdGF0aWMgdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLHUzMiB6ZXJvc0xlZnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUNvZWZmVG9rZW4KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBjb2VmZl90b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cworICAgICAgICAgIHUzMiBuYyAgICAgICAgICAgICAgICAgICAgbkMsIHNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoMTEgYml0cyBmb3IgdmFsdWUsIDUgYml0cyBmb3IgbGVuZ3RoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YWx1ZTsKKworLyogQ29kZSAqLworCisgICAgLyogc3RhbmRhcmQgZGVmaW5lcyB0aGF0IG5jIGZvciBkZWNvZGluZyBvZiBjaHJvbWEgZGMgY29lZmZpY2llbnRzIGlzIC0xLAorICAgICAqIHJlcHJlc2VudGVkIGJ5IHUzMiBoZXJlIC0+IC0xIG1hcHMgdG8gMl4zMiAtIDEgKi8KKyAgICBBU1NFUlQobmMgPD0gMTYgfHwgbmMgPT0gKHUzMikoLTEpKTsKKworICAgIGlmIChuYyA8IDIpCisgICAgeworICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMDAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwQzAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8wW2JpdHMgPj4gMTBdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMVtiaXRzID4+IDZdOworICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMlsoYml0cz4+MiktOF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfM1tiaXRzXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA0KQorICAgIHsKKyAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGJpdHMgJiAweDQwMDAgPyAweDAwMDIgOiAweDA4MjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzBbYml0cyA+PiAxMF07CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8xW2JpdHMgPj4gN107CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMltiaXRzPj4yXTsKKyAgICB9CisgICAgZWxzZSBpZiAobmMgPCA4KQorICAgIHsKKyAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8wW2JpdHMgPj4gMTBdOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8xW2JpdHM+PjZdOworICAgIH0KKyAgICBlbHNlIGlmIChuYyA8PSAxNikKKyAgICB7CisgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjhbYml0cz4+MTBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMFtiaXRzID4+IDEzXTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8xW2JpdHM+PjhdOworICAgIH0KKworICAgIHJldHVybih2YWx1ZSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVMZXZlbFByZWZpeAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICB1MzIgIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBvciBWTENfTk9UX0ZPVU5ECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgbnVtWmVyb3M7CisKKy8qIENvZGUgKi8KKworICAgIGlmIChiaXRzID49IDB4ODAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwKQorICAgICAgICBudW1aZXJvcyA9IDE7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDApCisgICAgICAgIG51bVplcm9zID0gMjsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwODAwKQorICAgICAgICBudW1aZXJvcyA9IDQ7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDA0MDApCisgICAgICAgIG51bVplcm9zID0gNTsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKKyAgICAgICAgbnVtWmVyb3MgPSA2OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQorICAgICAgICBudW1aZXJvcyA9IDc7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwODApCisgICAgICAgIG51bVplcm9zID0gODsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDA0MCkKKyAgICAgICAgbnVtWmVyb3MgPSA5OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQorICAgICAgICBudW1aZXJvcyA9IDEwOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDEwKQorICAgICAgICBudW1aZXJvcyA9IDExOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA4KQorICAgICAgICBudW1aZXJvcyA9IDEyOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA0KQorICAgICAgICBudW1aZXJvcyA9IDEzOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAyKQorICAgICAgICBudW1aZXJvcyA9IDE0OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAxKQorICAgICAgICBudW1aZXJvcyA9IDE1OworICAgIGVsc2UgLyogbW9yZSB0aGFuIDE1IHplcm9zIGVuY291bnRlcmVkIHdoaWNoIGlzIGFuIGVycm9yICovCisgICAgICAgIHJldHVybihWTENfTk9UX0ZPVU5EKTsKKworICAgIHJldHVybihudW1aZXJvcyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVUb3RhbFplcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCA5IHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHRvdGFsQ29lZmYgICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlY29kZWQKKyAgICAgICAgICB1MzIgaXNDaHJvbWFEQyAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBjaHJvbWEgREMgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0b3RhbENvZWZmKTsKKworICAgIGlmICghaXNDaHJvbWFEQykKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgMTYpOworICAgICAgICBzd2l0Y2ggKHRvdGFsQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8wW2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMVtiaXRzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18yW2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfM1tiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzRbYml0cyA+PiA0XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc181W2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNltiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzdbYml0cyA+PiAzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc184W2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOVtiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMFtiaXRzID4+IDRdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMVtiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMltiaXRzID4+IDVdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xM1tiaXRzID4+IDZdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xNFtiaXRzID4+IDddOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1ICovCisgICAgICAgICAgICAgICAgdmFsdWUgPSAoYml0cyA+PiA4KSA/IDB4MTEgOiAweDAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgNCk7CisgICAgICAgIGJpdHMgPj49IDY7CisgICAgICAgIGlmIChiaXRzID4gMykKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG90YWxDb2VmZiA9PSAzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsQ29lZmYgPT0gMikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjI7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MzM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odmFsdWUpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUnVuQmVmb3JlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcnVuX2JlZm9yZSBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDExIHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIHplcm9zTGVmdCAgICAgICAgICAgICBudW1iZXIgb2YgemVyb3MgbGVmdCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cywgdTMyIHplcm9zTGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdmFsdWUgPSAweDA7CisKKy8qIENvZGUgKi8KKworICAgIHN3aXRjaCAoemVyb3NMZWZ0KQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMVtiaXRzPj4xMF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8yW2JpdHM+PjldOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfM1tiaXRzPj45XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzRbYml0cz4+OF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV81W2JpdHM+PjhdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNltiaXRzPj44XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoYml0cyA+PSAweDEwMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoNy0oYml0cz4+OCkpPDw0KSsweDM7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4ODApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDc0OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHg4NTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4OTY7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGE3OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGI4OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGM5OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweGRBOworICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZUI7CisgICAgICAgICAgICBpZiAoSU5GTyh2YWx1ZSkgPiB6ZXJvc0xlZnQpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKHZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG9uZSBDQVZMQyBjb2RlZCBibG9jay4gVGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICAgIHN5bnRheCBlbGVtZW50cyByZXNpZHVhbF9ibG9ja19jYXZsYygpIGluIHRoZSBzdGFuZGFyZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgbmMgICAgICAgICAgICAgICAgICAgIG5DIHZhbHVlCisgICAgICAgICAgbWF4TnVtQ29lZmYgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJlc2lkdWFsIGNvZWZmaWNpZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgY29lZmZMZXZlbCAgICAgICAgICAgIHN0b3JlcyBkZWNvZGVkIGNvZWZmaWNpZW50IGxldmVscworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbnVtQ29lZmZzICAgICAgICAgICAgIG9uIGJpdHMgWzQsMTFdIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICBjb2VmZk1hcCAgICAgICAgICAgICAgb24gYml0cyBbMTYsMzFdIGlmIHN1Y2Nlc3NmdWwsIHRoaXMgaXMgYml0IG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgd2FzIHplcm8gKDApIG9yIG5vbi16ZXJvICgxKQorICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBpMzIgKmNvZWZmTGV2ZWwsCisgIGkzMiBuYywKKyAgdTMyIG1heE51bUNvZWZmKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXAsIHRvdGFsQ29lZmYsIHRyYWlsaW5nT25lcywgc3VmZml4TGVuZ3RoLCBsZXZlbFByZWZpeDsKKyAgICB1MzIgbGV2ZWxTdWZmaXgsIHplcm9zTGVmdCwgYml0OworICAgIGkzMiBsZXZlbFsxNl07CisgICAgdTMyIHJ1blsxNl07CisgICAgLyogc3RyZWFtICJjYWNoZSIgKi8KKyAgICB1MzIgYnVmZmVyVmFsdWU7CisgICAgdTMyIGJ1ZmZlckJpdHM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChjb2VmZkxldmVsKTsKKyAgICBBU1NFUlQobmMgPiAtMik7CisgICAgQVNTRVJUKG1heE51bUNvZWZmID09IDQgfHwgbWF4TnVtQ29lZmYgPT0gMTUgfHwgbWF4TnVtQ29lZmYgPT0gMTYpOworICAgIEFTU0VSVChWTENfTk9UX0ZPVU5EICE9IEVORF9PRl9TVFJFQU0pOworCisgICAgLyogYXNzdW1lIHRoYXQgY29lZmZMZXZlbCBhcnJheSBoYXMgYmVlbiAiY2xlYW5lZCIgYnkgY2FsbGVyICovCisKKyAgICBCVUZGRVJfSU5JVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cyk7CisKKyAgICAvKmxpbnQgLWU3NzQgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gYWx3YXlzIGZhbHNlIGNvbXBhcmlzb24gKi8KKyAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7CisgICAgLypsaW50ICtlNzc0ICovCisgICAgdG1wID0gRGVjb2RlQ29lZmZUb2tlbihiaXQsICh1MzIpbmMpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEhfVEModG1wKSk7CisKKyAgICB0b3RhbENvZWZmID0gVE9UQUxfQ09FRkYodG1wKTsKKyAgICBpZiAodG90YWxDb2VmZiA+IG1heE51bUNvZWZmKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgdHJhaWxpbmdPbmVzID0gVFJBSUxJTkdfT05FUyh0bXApOworCisgICAgaWYgKHRvdGFsQ29lZmYgIT0gMCkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICAvKiBub256ZXJvIGNvZWZmaWNpZW50czogKy8tIDEgKi8KKyAgICAgICAgaWYgKHRyYWlsaW5nT25lcykKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCB0cmFpbGluZ09uZXMpOworICAgICAgICAgICAgdG1wID0gMSA8PCAodHJhaWxpbmdPbmVzIC0gMSk7CisgICAgICAgICAgICBmb3IgKDsgdG1wOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSBiaXQgJiB0bXAgPyAtMSA6IDE7CisgICAgICAgICAgICAgICAgdG1wID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogb3RoZXIgbGV2ZWxzICovCisgICAgICAgIGlmICh0b3RhbENvZWZmID4gMTAgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yICg7IGkgPCB0b3RhbENvZWZmOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKKyAgICAgICAgICAgIGxldmVsUHJlZml4ID0gRGVjb2RlTGV2ZWxQcmVmaXgoYml0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA9PSBWTENfTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxQcmVmaXgrMSk7CisKKyAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA8IDE0KQorICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsUHJlZml4ID09IDE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aCA/IHN1ZmZpeExlbmd0aCA6IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2V0dGluZyBzdWZmaXhMZW5ndGggdG8gMSBoZXJlIGNvcnJlc3BvbmRzIHRvIGFkZGluZyAxNQorICAgICAgICAgICAgICAgICAqIHRvIGxldmVsQ29kZSB2YWx1ZSBpZiBsZXZlbFByZWZpeCA9PSAxNSBhbmQKKyAgICAgICAgICAgICAgICAgKiBzdWZmaXhMZW5ndGggPT0gMCAqLworICAgICAgICAgICAgICAgIGlmICghc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOworICAgICAgICAgICAgICAgIHRtcCA9IDEyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoKQorICAgICAgICAgICAgICAgIGxldmVsUHJlZml4IDw8PSBzdWZmaXhMZW5ndGg7CisKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxTdWZmaXgsIHRtcCk7CisgICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggKz0gbGV2ZWxTdWZmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGxldmVsUHJlZml4OworCisgICAgICAgICAgICBpZiAoaSA9PSB0cmFpbGluZ09uZXMgJiYgdHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKworICAgICAgICAgICAgbGV2ZWxbaV0gPSAodG1wKzIpPj4xOworCisgICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKKworICAgICAgICAgICAgaWYgKChsZXZlbFtpXSA+ICgzIDw8IChzdWZmaXhMZW5ndGggLSAxKSkpICYmIHN1ZmZpeExlbmd0aCA8IDYpCisgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoKys7CisKKyAgICAgICAgICAgIGlmICh0bXAgJiAweDEpCisgICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiB6ZXJvIHJ1bnMgKi8KKyAgICAgICAgaWYgKHRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCw5KTsKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IERlY29kZVRvdGFsWmVyb3MoYml0LCB0b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG1heE51bUNvZWZmID09IDQpKTsKKyAgICAgICAgICAgIGlmICghemVyb3NMZWZ0KQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHplcm9zTGVmdCkpOworICAgICAgICAgICAgemVyb3NMZWZ0ID0gSU5GTyh6ZXJvc0xlZnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ29lZmYgLSAxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsMTEpOworICAgICAgICAgICAgICAgIHRtcCA9IERlY29kZVJ1bkJlZm9yZShiaXQsIHplcm9zTGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh0bXApKTsKKyAgICAgICAgICAgICAgICBydW5baV0gPSBJTkZPKHRtcCk7CisgICAgICAgICAgICAgICAgemVyb3NMZWZ0IC09IHJ1bltpXSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bltpXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21iaW5pbmcgbGV2ZWwgYW5kIHJ1biwgbGV2ZWxTdWZmaXggdmFyaWFibGUgdXNlZCB0byBob2xkIGNvZWZmTWFwLAorICAgICAgICAgKiBpLmUuIGJpdCBtYXAgaW5kaWNhdGluZyB3aGljaCBjb2VmZmljaWVudHMgaGFkIG5vbi16ZXJvIHZhbHVlLiAqLworCisgICAgICAgIC8qbGludCAtZXN5bSg3NzEsbGV2ZWwscnVuKSBsZXZlbCBhbmQgcnVuIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgdG1wID0gemVyb3NMZWZ0OworICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFt0b3RhbENvZWZmLTFdOworICAgICAgICBsZXZlbFN1ZmZpeCA9IDEgPDwgdG1wOworICAgICAgICBmb3IgKGkgPSB0b3RhbENvZWZmLTE7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCArPSBydW5baV07CisgICAgICAgICAgICBsZXZlbFN1ZmZpeCB8PSAxIDw8IHRtcDsKKyAgICAgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW2ldOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsZXZlbFN1ZmZpeCA9IDA7CisKKyAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyLWJ1ZmZlckJpdHMpICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuKCh0b3RhbENvZWZmIDw8IDQpIHwgKGxldmVsU3VmZml4IDw8IDE2KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAzNTNkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQ0FWTENfSAorI2RlZmluZSBIMjY0U1dERUNfQ0FWTENfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaTMyICpjb2VmZkxldmVsLAorICBpMzIgbmMsCisgIHUzMiBtYXhOdW1Db2VmZik7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NBVkxDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiYWJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19DRkdfSAorI2RlZmluZSBIMjY0U1dERUNfQ0ZHX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9OVU1fUkVGX1BJQ1MgMTYKKyNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUFMgOAorI2RlZmluZSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTIDMyCisjZGVmaW5lIE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NGR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5M2ZiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCkBAIC0wLDAgKzEsNjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZENvbmNlYWwKKyAgICAgICAgICBDb25jZWFsTWIKKyAgICAgICAgICBUcmFuc2Zvcm0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC1lNzAyIGRpc2FibGUgbGludCB3YXJuaW5nIG9uIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqZGF0YSk7CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbmNlYWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3IgYSBwaWN0dXJlLiBUd28gdHlwZXMgb2YgY29uY2VhbG1lbnQKKyAgICAgICAgICAgIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzbGljZVR5cGU6CisgICAgICAgICAgICAgICAgMSkgY29weSBmcm9tIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtc2xpY2VzLgorICAgICAgICAgICAgICAgIDIpIGNvbmNlYWxtZW50IGZyb20gbmVpZ2hib3VyIHBpeGVscyBmb3IgSS1zbGljZXMKKworICAgICAgICAgICAgSS10eXBlIGNvbmNlYWxtZW50IGlzIGJhc2VkIG9uIGlkZWFzIHByZXNlbnRlZCBieSBKYXJubyBUdWxra2kuCisgICAgICAgICAgICBUaGUgY29uY2VhbG1lbnQgYWxnb3JpdGhtIGRldGVybWluZXMgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgIGZyb20gdGhlIG5laWdoYm91ciBwaXhlbHMsIGFwcGxpZXMgaW50ZWdlciB0cmFuc2Zvcm0gKHRoZSBzYW1lCisgICAgICAgICAgICB0cmFuc2Zvcm0gdXNlZCBpbiB0aGUgcmVzaWR1YWwgcHJvY2Vzc2luZykgYW5kIHVzZXMgdGhlIHJlc3VsdHMgYXMKKyAgICAgICAgICAgIHBpeGVsIHZhbHVlcyBmb3IgY29uY2VhbGVkIG1hY3JvYmxvY2tzLiBUcmFuc2Zvcm0gcHJvZHVjZXMgNHg0CisgICAgICAgICAgICBhcnJheSBhbmQgb25lIHBpeGVsIHZhbHVlIGhhcyB0byBiZSB1c2VkIGZvciA0eDQgbHVtYSBibG9ja3MgYW5kCisgICAgICAgICAgICAyeDIgY2hyb21hIGJsb2Nrcy4KKworICAgICAgICAgICAgU2ltaWxhciBjb25jZWFsbWVudCBpcyBwZXJmb3JtZWQgZm9yIHdob2xlIHBpY3R1cmUgKHRoZSBjaG9pc2UKKyAgICAgICAgICAgIG9mIHRoZSB0eXBlIGlzIGJhc2VkIG9uIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgc2xpY2UgaGVhZGVyIG9mCisgICAgICAgICAgICB0aGUgcGljdHVyZSBidXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbikuIEl0IGlzCisgICAgICAgICAgICBhY2tub3dsZWRnZWQgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gd3JvbmcgdHlwZSBvZiBjb25jZWFsbWVudAorICAgICAgICAgICAgd2hlbiBhIHBpY3R1cmUgY29udGFpbnMgYm90aCB0eXBlcyBvZiBzbGljZXMuIEhvd2V2ZXIsCisgICAgICAgICAgICBkZXRlcm1pbmF0aW9uIG9mIHNsaWNlIHR5cGUgbWFjcm9ibG9jay1ieS1tYWNyb2Jsb2NrIGNhbm5vdAorICAgICAgICAgICAgYmUgZG9uZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cgdG8gd2hpY2gKKyAgICAgICAgICAgIHNsaWNlIGVhY2ggY29ycnVwdGVkIChub3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQpIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIGJlbG9uZ3MuCisKKyAgICAgICAgICAgIFRoZSBlcnJvciBjb25jZWFsbWVudCBpcyBzdGFydGVkIGJ5IHNlYXJjaGluZyB0aGUgZmlyc3QgcHJvcG9lcmx5CisgICAgICAgICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgYW5kIGNvbmNlYWxpbmcgdGhlIHJvdyBjb250YWluaW5nIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICBpbiBxdWVzdGlvbi4gQWZ0ZXIgdGhhdCBhbGwgbWFjcm9ibG9ja3MgYWJvdmUgdGhlIHJvdyBpbiBxdWVzdGlvbgorICAgICAgICAgICAgYXJlIGNvbmNlYWxlZC4gRmluYWxseSBjb25jZWFsbWVudCBvZiByb3dzIGJlbG93IGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICAgIFRoZSBvcmRlciBvZiBjb25jZWFsbWVudCBmb3IgNHg0IHBpY3R1cmUgd2hlcmUgbWFjcm9ibG9jayA5IGlzIHRoZQorICAgICAgICAgICAgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBvbmUgaXMgYXMgZm9sbG93cyAocHJvcGVybHkgZGVjb2RlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgbWFya2VkIHdpdGggJ3gnLCBudW1iZXJzIGluZGljYXRpbmcgdGhlIG9yZGVyIG9mCisgICAgICAgICAgICBjb25jZWFsbWVudCk6CisKKyAgICAgICAgICAgICAgIDQgIDYgIDggMTAKKyAgICAgICAgICAgICAgIDMgIDUgIDcgIDkKKyAgICAgICAgICAgICAgIDEgIHggIHggIDIKKyAgICAgICAgICAgICAgMTEgMTIgMTMgMTQKKworICAgICAgICAgICAgSWYgYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBwaWN0dXJlIGFyZSBsb3N0LCB0aGUgY29uY2VhbG1lbnQgaXMKKyAgICAgICAgICAgIGNvcHkgb2YgcHJldmlvdXMgcGljdHVyZSBmb3IgUC10eXBlIGFuZCBzZXR0aW5nIHRoZSBpbWFnZSB0bworICAgICAgICAgICAgY29uc3RhbnQgZ3JheSAocGl4ZWwgdmFsdWUgMTI4KSBmb3IgSS10eXBlLgorCisgICAgICAgICAgICBDb25jZWFsbWVudCBzZXRzIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGNvbmNlYWxlZAorICAgICAgICAgICAgbWFjcm9ibG9ja3MgdG8gdmFsdWUgNDAgYW5kIG1hY3JvYmxvY2sgdHlwZSB0byBpbnRyYSB0byBlbmFibGUKKyAgICAgICAgICAgIGRlYmxvY2tpbmcgZmlsdGVyIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIGNvbmNlYWxlZCBhcmVhcy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBpbWFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHNsaWNlVHlwZSAgICAgICB0eXBlIG9mIHRoZSBzbGljZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgY29uY2VhbGVkIG1hY3JvYmxvY2tzIHdpbGwgYmUgd3JpdHRlbiBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICB1OCAqcmVmRGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqbWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKGN1cnJJbWFnZSk7CisKKyAgICBERUJVRygoIkNvbmNlYWxpbmcgJXMgc2xpY2VcbiIsIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSA/CisgICAgICAgICAgICAiaW50cmEiIDogImludGVyIikpOworCisgICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworICAgIHJlZkRhdGEgPSBOVUxMOworICAgIC8qIHVzZSByZWZlcmVuY2UgcGljdHVyZSB3aXRoIHNtYWxsZXN0IGF2YWlsYWJsZSBpbmRleCAqLworICAgIGlmIChJU19QX1NMSUNFKHNsaWNlVHlwZSkgfHwgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyAhPSAwKSkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICByZWZEYXRhID0gaDI2NGJzZEdldFJlZlBpY0RhdGEocFN0b3JhZ2UtPmRwYiwgaSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+PSAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSB3aGlsZSAocmVmRGF0YSA9PSBOVUxMKTsKKyAgICB9CisKKyAgICBpID0gcm93ID0gY29sID0gMDsKKyAgICAvKiBmaW5kIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBzdGFydCBwb2ludCBmb3IgY29uY2VhbG1lbnQgKi8KKyAgICB3aGlsZSAoaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMgJiYgIXBTdG9yYWdlLT5tYltpXS5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgaSsrOworICAgICAgICBjb2wrKzsKKyAgICAgICAgaWYgKGNvbCA9PSB3aWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogd2hvbGUgcGljdHVyZSBsb3N0IC0+IGNvcHkgcHJldmlvdXMgb3Igc2V0IGdyZXkgKi8KKyAgICBpZiAoaSA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgIHsKKyAgICAgICAgaWYgKCAoSVNfSV9TTElDRShzbGljZVR5cGUpICYmIChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgPT0gMCkpIHx8CisgICAgICAgICAgICAgcmVmRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGN1cnJJbWFnZS0+ZGF0YSwgMTI4LCB3aWR0aCpoZWlnaHQqMzg0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KGN1cnJJbWFnZS0+ZGF0YSwgcmVmRGF0YSwgd2lkdGgqaGVpZ2h0KjM4NCk7CisKKyAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7CisKKyAgICAgICAgLyogbm8gZmlsdGVyaW5nIGlmIHdob2xlIHBpY3R1cmUgY29uY2VhbGVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCisgICAgICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAxOworCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworICAgIC8qIHN0YXJ0IGZyb20gdGhlIHJvdyBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2ssIGNvbmNlYWwgdGhlCisgICAgICogcm93IGluIHF1ZXN0aW9uLCBhbGwgcm93cyBhYm92ZSB0aGF0IHJvdyBhbmQgdGhlbiBjb250aW51ZSBkb3dud2FyZHMgKi8KKyAgICBtYiA9IHBTdG9yYWdlLT5tYiArIHJvdyAqIHdpZHRoOworICAgIGZvciAoaiA9IGNvbDsgai0tOykKKyAgICB7CisgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7CisgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICB9CisgICAgZm9yIChqID0gY29sICsgMTsgaiA8IHdpZHRoOyBqKyspCisgICAgeworICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIHByZXZpb3VzIHJvdyhzKSBjb3VsZCBub3QgYmUgY29uY2VhbGVkIC0+IGNvbmNlYWwgdGhlbSBub3cgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSByb3cgLSAxOworICAgICAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpKndpZHRoICsgajsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7CisgICAgICAgICAgICAgICAgbWItPmRlY29kZWQgPSAxOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICAgICAgICAgICAgICBtYiAtPSB3aWR0aDsKKyAgICAgICAgICAgIH0gd2hpbGUoaS0tKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2Nlc3Mgcm93cyBiZWxvdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jayAqLworICAgIGZvciAoaSA9IHJvdyArIDE7IGkgPCBoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSAqIHdpZHRoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IENvbmNlYWxNYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBvbmUgbWFjcm9ibG9jaywgbG9jYXRpb24gb2YgdGhlCisgICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBwaWN0dXJlIGluZGljYXRlZCBieSByb3cgYW5kIGNvbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKKyAgICB1MzIgc2xpY2VUeXBlLCB1OCAqcmVmRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgY29tcDsKKyAgICB1MzIgaG9yLCB2ZXI7CisgICAgdTMyIG1iTnVtOworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHU4ICptYlBvczsKKyAgICB1OCBkYXRhWzM4NF07CisgICAgdTggKnBEYXRhOworICAgIGkzMiB0bXA7CisgICAgaTMyIGZpcnN0UGhhc2VbMTZdOworICAgIGkzMiAqcFRtcDsKKyAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBpMzIgYVs0XSwgYls0XSwgbFs0XSwgcls0XTsKKyAgICB1MzIgQSwgQiwgTCwgUjsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisjZW5kaWYKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVCghcE1iLT5kZWNvZGVkKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQoY29sIDwgY3VyckltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKHJvdyA8IGN1cnJJbWFnZS0+aGVpZ2h0KTsKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7CisjZW5kaWYKKyAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7CisgICAgbWJOdW0gPSByb3cgKiB3aWR0aCArIGNvbDsKKworICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOworCisgICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyByb3cgKiAxNiAqIHdpZHRoICogMTYgKyBjb2wgKiAxNjsKKyAgICBBID0gQiA9IEwgPSBSID0gSEFOVFJPX0ZBTFNFOworCisgICAgLyogc2V0IHFwWSB0byA0MCB0byBlbmFibGUgc29tZSBmaWx0ZXJpbmcgaW4gZGVibG9ja2luZyAoc3RldHNvbiB2YWx1ZSkgKi8KKyAgICBwTWItPnFwWSA9IDQwOworICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAwOworICAgIC8qIG1iVHlwZSBzZXQgdG8gaW50cmEgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgZGVzcGl0ZSB0aGUgdmFsdWVzIG9mIG90aGVyCisgICAgICogYm91bmRhcnkgc3RyZW5ndGggZGV0ZXJtaW5hdGlvbiBmaWVsZHMgKi8KKyAgICBwTWItPm1iVHlwZSA9IElfNHg0OworICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IDA7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gMDsKKyAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSAwOworCisgICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXZfdCBtdiA9IHswLDB9OworICAgICAgICBpbWFnZV90IHJlZkltYWdlOworICAgICAgICByZWZJbWFnZS53aWR0aCA9IHdpZHRoOworICAgICAgICByZWZJbWFnZS5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHJlZkltYWdlLmRhdGEgPSByZWZEYXRhOworICAgICAgICBpZiAocmVmSW1hZ2UuZGF0YSkKKyAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX09NWERMCisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsIGNvbCoxNiwgcm93KjE2LAorICAgICAgICAgICAgICAgIDAsIDAsIDE2LCAxNik7CisjZWxzZQorICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAoKHJvdyoxNikgKyAoKGNvbCoxNik8PDE2KSksCisgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTAsIHBGaWxsKTsKKyNlbmRpZgorICAgICAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOworCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKKworICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICBqID0gMDsKKyAgICBob3IgPSB2ZXIgPSAwOworICAgIGlmIChyb3cgJiYgKHBNYi13aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBBID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCoxNjsKKyAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOworICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKKyAgICB9CisgICAgaWYgKChyb3cgIT0gaGVpZ2h0IC0gMSkgJiYgKHBNYit3aWR0aCktPmRlY29kZWQpCisgICAgeworICAgICAgICBCID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNip3aWR0aCoxNjsKKyAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7CisgICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKKyAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICBqKys7CisgICAgICAgIGhvcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKKyAgICB9CisgICAgaWYgKGNvbCAmJiAocE1iLTEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgTCA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKKyAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFswXSArPSBwRGF0YVszMip3aWR0aF07IGxbMF0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsxXSArPSBwRGF0YVszMip3aWR0aF07IGxbMV0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFsyXSArPSBwRGF0YVszMip3aWR0aF07IGxbMl0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgbFszXSArPSBwRGF0YVszMip3aWR0aF07IGxbM10gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBqKys7CisgICAgICAgIHZlcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKKyAgICB9CisgICAgaWYgKChjb2wgIT0gd2lkdGggLSAxKSAmJiAocE1iKzEpLT5kZWNvZGVkKQorICAgIHsKKyAgICAgICAgUiA9IEhBTlRST19UUlVFOworICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTY7CisgICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyByWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7CisgICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVsxNip3aWR0aF07CisgICAgICAgIHJbM10gKz0gcERhdGFbMzIqd2lkdGhdOyByWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKKyAgICAgICAgaisrOworICAgICAgICB2ZXIrKzsKKyAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOworICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgfQorCisgICAgLyogYXQgbGVhc3Qgb25lIHByb3Blcmx5IGRlY29kZWQgbmVpZ2hib3VyIGF2YWlsYWJsZSAqLworICAgIEFTU0VSVChqKTsKKworICAgIC8qbGludCAtZXN5bSg2NDQsbCxyLGEsYikgdmFyaWFibGUgaW5pdGlhbGl6ZWQgYWJvdmUgKi8KKyAgICBpZiAoIWhvciAmJiBMICYmIFIpCisgICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA1OworICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDMraG9yKTsKKworICAgIGlmICghdmVyICYmIEEgJiYgQikKKyAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDU7CisgICAgZWxzZSBpZiAodmVyKQorICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMyt2ZXIpOworCisgICAgc3dpdGNoIChqKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj42ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gMTA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiA0ICovCisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKworICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKKworICAgIGZvciAoaSA9IDAsIHBEYXRhID0gZGF0YSwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCAyNTY7KQorICAgIHsKKyAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Rik+PjJdOworICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KKyAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAvKmxpbnQgK2U3MzQgKi8KKworICAgICAgICBpKys7CisgICAgICAgIGlmICghKGkgJiAweDNGKSkKKyAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgY29tcG9uZW50cyAqLworICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgd2lkdGggKiBoZWlnaHQgKiAyNTYgKworICAgICAgIHJvdyAqIDggKiB3aWR0aCAqIDggKyBjb2wgKiA4OworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAyOyBjb21wKyspCisgICAgeworCisgICAgICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOworCisgICAgICAgIC8qIGNvdW50ZXIgZm9yIG51bWJlciBvZiBuZWlnaGJvdXJzIHVzZWQgKi8KKyAgICAgICAgaiA9IDA7CisgICAgICAgIGhvciA9IHZlciA9IDA7CisgICAgICAgIGlmIChBKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqODsKKyAgICAgICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbMl0gPSAqcERhdGErKzsgYVsyXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGhvcisrOworICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOworICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOworICAgICAgICB9CisgICAgICAgIGlmIChCKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgOCp3aWR0aCo4OworICAgICAgICAgICAgYlswXSA9ICpwRGF0YSsrOyBiWzBdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYlszXSA9ICpwRGF0YSsrOyBiWzNdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaG9yKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGJbMF0gKyBiWzFdICsgYlsyXSArIGJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOworICAgICAgICAgICAgbFswXSA9IHBEYXRhWzBdOyBsWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgbFszXSA9IHBEYXRhWzBdOyBsWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGxbMF0gKyBsWzFdICsgbFsyXSArIGxbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4OworICAgICAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIHJbMl0gPSBwRGF0YVswXTsgclsyXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgdmVyKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdICs9IHJbMF0gKyByWzFdIC0gclsyXSAtIHJbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFob3IgJiYgTCAmJiBSKQorICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKGhvcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgyK2hvcik7CisKKyAgICAgICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQorICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA9IChhWzBdK2FbMV0rYVsyXSthWzNdLWJbMF0tYlsxXS1iWzJdLWJbM10pID4+IDQ7CisgICAgICAgIGVsc2UgaWYgKHZlcikKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgyK3Zlcik7CisKKyAgICAgICAgc3dpdGNoIChqKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSAoZmlyc3RQaGFzZVswXSo0LzMpPj41ICovCisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KKyAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7CisKKyAgICAgICAgcERhdGEgPSBkYXRhICsgMjU2ICsgY29tcCo2NDsKKyAgICAgICAgZm9yIChpID0gMCwgcFRtcCA9IGZpcnN0UGhhc2U7IGkgPCA2NDspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweDcpPj4xXTsKKyAgICAgICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLworICAgICAgICAgICAgKnBEYXRhKysgPSBDTElQMSh0bXApOworICAgICAgICAgICAgLypsaW50ICtlNzM0ICovCisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmICghKGkgJiAweEYpKQorICAgICAgICAgICAgICAgIHBUbXAgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCBwb2ludGVycyBmb3IgY3IgKi8KKyAgICAgICAgbWJQb3MgKz0gd2lkdGggKiBoZWlnaHQgKiA2NDsKKyAgICB9CisKKyAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm0KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2ltcGxpZmllZCB0cmFuc2Zvcm0sIGFzc3VtaW5nIHRoYXQgb25seSBkYyBjb21wb25lbnQgYW5kIGxvd2VzdAorICAgICAgICAgICAgaG9yaXpvbnRhbCBhbmQgbG93ZXN0IHZlcnRpY2FsIGNvbXBvbmVudCBtYXkgYmUgbm9uLXplcm8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBUcmFuc2Zvcm0oaTMyICpkYXRhKQoreworCisgICAgdTMyIGNvbDsKKyAgICBpMzIgdG1wMCwgdG1wMTsKKworICAgIGlmICghZGF0YVsxXSAmJiAhZGF0YVs0XSkKKyAgICB7CisgICAgICAgIGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQorICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KKyAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9IGRhdGFbMF07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogZmlyc3QgaG9yaXpvbnRhbCB0cmFuc2Zvcm0gZm9yIHJvd3MgMCBhbmQgMSAqLworICAgIHRtcDAgPSBkYXRhWzBdOworICAgIHRtcDEgPSBkYXRhWzFdOworICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKKyAgICBkYXRhWzFdID0gdG1wMCArICh0bXAxPj4xKTsKKyAgICBkYXRhWzJdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICBkYXRhWzNdID0gdG1wMCAtIHRtcDE7CisKKyAgICB0bXAwID0gZGF0YVs0XTsKKyAgICBkYXRhWzVdID0gdG1wMDsKKyAgICBkYXRhWzZdID0gdG1wMDsKKyAgICBkYXRhWzddID0gdG1wMDsKKworICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgIHsKKyAgICAgICAgdG1wMCA9IGRhdGFbMF07CisgICAgICAgIHRtcDEgPSBkYXRhWzRdOworICAgICAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7CisgICAgICAgIGRhdGFbNF0gPSB0bXAwICsgKHRtcDE+PjEpOworICAgICAgICBkYXRhWzhdID0gdG1wMCAtICh0bXAxPj4xKTsKKyAgICAgICAgZGF0YVsxMl0gPSB0bXAwIC0gdG1wMTsKKyAgICB9CisKK30KKy8qbGludCArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTM0NjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTkNFQUxfSAorI2RlZmluZSBIMjY0U1dERUNfQ09OQ0VBTF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDb25jZWFsKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHNsaWNlVHlwZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NPTkNFQUxfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTliNzRhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NPTlRBSU5FUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19DT05UQUlORVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN0cmluZyBsZW5ndGggZm9yIHRyYWNpbmcgKi8KKyNkZWZpbmUgSDI2NERFQ19UUkFDRV9TVFJfTEVOIDEwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBORVdfSEVBREVSUworICAgIH0gZGVjU3RhdDsKKworICAgIHUzMiBwaWNOdW1iZXI7CisgICAgc3RvcmFnZV90IHN0b3JhZ2U7CisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIGNoYXIgc3RyW0gyNjRERUNfVFJBQ0VfU1RSX0xFTl07CisjZW5kaWYKK30gZGVjQ29udGFpbmVyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDQ09OVEFJTkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjhjMWY3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKQEAgLTAsMCArMSwyNDE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEZpbHRlclBpY3R1cmUKKyAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZQorICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yTHVtYQorICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UKKyAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yQ2hyb21hCisgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCisgICAgICAgICAgRWRnZUJvdW5kYXJ5U3RyZW5ndGgKKyAgICAgICAgICBHZXRCb3VuZGFyeVN0cmVuZ3RocworICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uTGVmdAorICAgICAgICAgIElzU2xpY2VCb3VuZGFyeU9uVG9wCisgICAgICAgICAgR2V0TWJGaWx0ZXJpbmdGbGFncworICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcworICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisgICAgICAgICAgRmlsdGVyTHVtYQorICAgICAgICAgIEZpbHRlckNocm9tYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIGFycmF5IG9mIGFscGhhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBhbHBoYXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCw0LDUsNiw3LDgsOSwxMCwKKyAgICAxMiwxMywxNSwxNywyMCwyMiwyNSwyOCwzMiwzNiw0MCw0NSw1MCw1Niw2Myw3MSw4MCw5MCwxMDEsMTEzLDEyNywxNDQsMTYyLAorICAgIDE4MiwyMDMsMjI2LDI1NSwyNTV9OworCisvKiBhcnJheSBvZiBiZXRhIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQgKi8KK3N0YXRpYyBjb25zdCB1OCBiZXRhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMiwzLDMsMywzLDQsNCwKKyAgICA0LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNywxNywxOCwxOH07CisKKworCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQorICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiUy0xXSAqLworc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bM10gPSB7CisgICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAorICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKKyAgICB7MCwwLDB9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMSwxfSx7MCwxLDF9LHsxLDEsMX0sCisgICAgezEsMSwxfSx7MSwxLDF9LHsxLDEsMX0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwyLDN9LAorICAgIHsxLDIsM30sezIsMiwzfSx7MiwyLDR9LHsyLDMsNH0sezIsMyw0fSx7MywzLDV9LHszLDQsNn0sezMsNCw2fSwKKyAgICB7NCw1LDd9LHs0LDUsOH0sezQsNiw5fSx7NSw3LDEwfSx7Niw4LDExfSx7Niw4LDEzfSx7NywxMCwxNH0sezgsMTEsMTZ9LAorICAgIHs5LDEyLDE4fSx7MTAsMTMsMjB9LHsxMSwxNSwyM30sezEzLDE3LDI1fQorfTsKKyNlbHNlCisvKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKKyAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlNdICovCitzdGF0aWMgY29uc3QgdTggdGMwWzUyXVs1XSA9IHsKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LAorICAgIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwKKyAgICB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMiwgMH0sCisgICAgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDIsIDMsIDB9LAorICAgIHswLCAxLCAyLCAzLCAwfSwgezAsIDIsIDIsIDMsIDB9LCB7MCwgMiwgMiwgNCwgMH0sIHswLCAyLCAzLCA0LCAwfSwKKyAgICB7MCwgMiwgMywgNCwgMH0sIHswLCAzLCAzLCA1LCAwfSwgezAsIDMsIDQsIDYsIDB9LCB7MCwgMywgNCwgNiwgMH0sCisgICAgezAsIDQsIDUsIDcsIDB9LCB7MCwgNCwgNSwgOCwgMH0sIHswLCA0LCA2LCA5LCAwfSwgezAsIDUsIDcsIDEwLCAwfSwKKyAgICB7MCwgNiwgOCwgMTEsIDB9LCB7MCwgNiwgOCwgMTMsIDB9LCB7MCwgNywgMTAsIDE0LCAwfSwKKyAgICB7MCwgOCwgMTEsIDE2LCAwfSwgezAsIDksIDEyLCAxOCwgMH0sIHswLCAxMCwgMTMsIDIwLCAwfSwKKyAgICB7MCwgMTEsIDE1LCAyMywgMH0sIHswLCAxMywgMTcsIDI1LCAwfQorfTsKKyNlbmRpZgorCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyogbWFwcGluZyBvZiByYXN0ZXIgc2NhbiBibG9jayBpbmRleCB0byA0eDQgYmxvY2sgaW5kZXggKi8KK3N0YXRpYyBjb25zdCB1MzIgbWI0eDRJbmRleFsxNl0gPQorICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHU4ICp0YzA7CisgICAgdTMyIGFscGhhOworICAgIHUzMiBiZXRhOworfSBlZGdlVGhyZXNob2xkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1MzIgdG9wOworICAgIHUzMiBsZWZ0OworfSBiU190OworCitlbnVtIHsgVE9QID0gMCwgTEVGVCA9IDEsIElOTkVSID0gMiB9OworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworI2RlZmluZSBGSUxURVJfTEVGVF9FREdFICAgIDB4MDQKKyNkZWZpbmUgRklMVEVSX1RPUF9FREdFICAgICAweDAyCisjZGVmaW5lIEZJTFRFUl9JTk5FUl9FREdFICAgMHgwMQorCisKKy8qIGNsaXBwaW5nIHRhYmxlIGRlZmluZWQgaW4gaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpMSwgdTMyIGkyKTsKKyNlbHNlCitzdGF0aWMgdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOworc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7CitzdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYik7CisKK3N0YXRpYyB1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKTsKKworc3RhdGljIHUzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYik7CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYnMsIHUzMiBmbGFncyk7CisKK3N0YXRpYyB2b2lkIEZpbHRlckx1bWEodTggKmRhdGEsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgRmlsdGVyQ2hyb21hKHU4ICpjYiwgdTggKmNyLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7CisKK3N0YXRpYyB2b2lkIEZpbHRlclZlckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckx1bWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgaTMyIGltYWdlV2lkdGgpOworCitzdGF0aWMgdm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKTsKK3N0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgaTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIG1iU3RvcmFnZV90ICptYiwKKyAgdTMyIGZpbHRlcmluZ0ZsYWdzKTsKKworc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgbWJTdG9yYWdlX3QgKm1iLAorICB1MzIgZmlsdGVyaW5nRmxhZ3MsCisgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpicylbMTZdLCB1MzIgZmxhZ3MpOworCitzdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCisgICAgbWJTdG9yYWdlX3QgKm1iLAorICAgIHU4ICgqYWxwaGEpWzJdLAorICAgIHU4ICgqYmV0YSlbMl0sCisgICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzICk7CisKK3N0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPbkxlZnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgb24gdGhlIGxlZnQgc2lkZQorICAgICAgICAgICAgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWIgJiYgbWItPm1iQSk7CisKKyAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQS0+c2xpY2VJZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25Ub3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc2xpY2UgYm91bmRhcnkgYWJvdmUgdGhlCisgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgSXNTbGljZUJvdW5kYXJ5T25Ub3AobWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iICYmIG1iLT5tYkIpOworCisgICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkItPnNsaWNlSWQpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldE1iRmlsdGVyaW5nRmxhZ3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBlZGdlcyBvZiBhIG1hY3JvYmxvY2sgaGFzIHRvIGJlCisgICAgICAgICAgZmlsdGVyZWQuIE91dHB1dCBpcyBhIGJpdC13aXNlIE9SIG9mIEZJTFRFUl9MRUZUX0VER0UsCisgICAgICAgICAgRklMVEVSX1RPUF9FREdFIGFuZCBGSUxURVJfSU5ORVJfRURHRSwgZGVwZW5kaW5nIG9uIHdoaWNoIGVkZ2VzCisgICAgICAgICAgc2hhbGwgYmUgZmlsdGVyZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iKTsKKworICAgIC8qIG5vdGhpbmcgd2lsbCBiZSBmaWx0ZXJlZCBpZiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9PSAxICovCisgICAgaWYgKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQorICAgIHsKKyAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0lOTkVSX0VER0U7CisKKyAgICAgICAgLyogZmlsdGVyTGVmdE1iRWRnZUZsYWcsIGxlZnQgbWIgaXMgTUJfQSAqLworICAgICAgICBpZiAobWItPm1iQSAmJgorICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKKyAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfTEVGVF9FREdFOworCisgICAgICAgIC8qIGZpbHRlclRvcE1iRWRnZUZsYWcgKi8KKyAgICAgICAgaWYgKG1iLT5tYkIgJiYKKyAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8CisgICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uVG9wKG1iKSkpCisgICAgICAgICAgICBmbGFncyB8PSBGSUxURVJfVE9QX0VER0U7CisgICAgfQorCisgICAgcmV0dXJuKGZsYWdzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlIGlzIGNoZWNrZWQgYmVmb3JlIHRoaXMgaXMKKyAgICAgICAgICAgIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb24gaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQoreworICAgIGkzMiB0bXAxLCB0bXAyOworICAgIGkzMiBtdjEsIG12MiwgbXYzLCBtdjQ7CisKKyAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmW2luZDFdOworICAgIHRtcDIgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMl07CisgICAgbXYxID0gbWIxLT5tdltpbmQxXS5ob3I7CisgICAgbXYyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgbXYzID0gbWIxLT5tdltpbmQxXS52ZXI7CisgICAgbXY0ID0gbWIxLT5tdltpbmQyXS52ZXI7CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKCAoQUJTKG12MSAtIG12MikgPj0gNCkgfHwgKEFCUyhtdjMgLSBtdjQpID49IDQpIHx8CisgICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGFuIGlubmVyCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gVGhlIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCisgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGggYnV0IHdpdGhvdXQgY2hlY2tpbmcgdG90YWxDb2VmZi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPm12W2luZDFdLmhvcjsKKyAgICB0bXAyID0gbWIxLT5tdltpbmQyXS5ob3I7CisgICAgdG1wMyA9IG1iMS0+bXZbaW5kMV0udmVyOworICAgIHRtcDQgPSBtYjEtPm12W2luZDJdLnZlcjsKKworICAgIGlmICggKEFCUyh0bXAxIC0gdG1wMikgPj0gNCkgfHwgKEFCUyh0bXAzIC0gdG1wNCkgPj0gNCkgfHwKKyAgICAgICAgIChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjEtPnJlZkFkZHJbaW5kMiA+PiAyXSkpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtIG9yCisgICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyLAorICAgIHUzMiBpbmQxLCB1MzIgaW5kMikKK3sKKworICAgIGlmIChtYjEtPnRvdGFsQ29lZmZbaW5kMV0gfHwgbWIyLT50b3RhbENvZWZmW2luZDJdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2UgaWYgKChtYjEtPnJlZkFkZHJbaW5kMSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbaW5kMiA+PiAyXSkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0uaG9yIC0gbWIyLT5tdltpbmQyXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLnZlciAtIG1iMi0+bXZbaW5kMl0udmVyKSA+PSA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvcgorICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKKyAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgdG9wQnMgPSAwOworICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEwXTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzFdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTFdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyA9IDI8PDA7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzEwXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbMTBdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMCA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbNF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxNF07CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDI8PDg7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxXS5ob3IgLSBtYjItPm12WzExXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzFdLnZlciAtIG1iMi0+bXZbMTFdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkclsxMSA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyArPSAxPDw4OworICAgIH0KKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzVdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzRdLmhvciAtIG1iMi0+bXZbMTRdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNF0udmVyIC0gbWIyLT5tdlsxNF0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTQgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MTY7CisgICAgfQorICAgIGlmICh0bXAzIHx8IHRtcDQpCisgICAgeworICAgICAgICB0b3BCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzVdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbNV0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbNSA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMTw8MjQ7CisgICAgfQorCisgICAgcmV0dXJuIHRvcEJzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yIGxlZnQtCisgICAgICAgICAgICBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMikKK3sKKyAgICB1MzIgbGVmdEJzID0gMDsKKyAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZls1XTsKKyAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzJdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbN107CisKKyAgICBpZiAodG1wMSB8fCB0bXAyKQorICAgIHsKKyAgICAgICAgbGVmdEJzID0gMjw8MDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbNV0uaG9yKSA+PSA0KSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzVdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls1ID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyA9IDE8PDA7CisgICAgfQorICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbOF07CisgICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxM107CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDw4OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMl0uaG9yIC0gbWIyLT5tdls3XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzJdLnZlciAtIG1iMi0+bXZbN10udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzcgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDg7CisgICAgfQorICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMTBdOworICAgIHRtcDQgPSBtYjItPnRvdGFsQ29lZmZbMTVdOworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICBsZWZ0QnMgKz0gMjw8MTY7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls4XS5ob3IgLSBtYjItPm12WzEzXS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzhdLnZlciAtIG1iMi0+bXZbMTNdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzggPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzEzID4+IDJdKSkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAxPDwxNjsKKyAgICB9CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDwyNDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzEwXS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzEwXS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkclsxMCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDI0OworICAgIH0KKworICAgIHJldHVybiBsZWZ0QnM7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQorICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5CisgICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcworICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCisgICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgorICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAorICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBmbGFnczsKKyAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7CisgICAgdTMyIHBpY1dpZHRoSW5NYnM7CisgICAgdTggKmRhdGE7CisgICAgbWJTdG9yYWdlX3QgKnBNYjsKKyAgICBiU190IGJTWzE2XTsKKyAgICBlZGdlVGhyZXNob2xkX3QgdGhyZXNob2xkc1szXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWIpOworICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7CisgICAgQVNTRVJUKGltYWdlLT53aWR0aCk7CisgICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOworCisgICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKKyAgICBkYXRhID0gaW1hZ2UtPmRhdGE7CisgICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7CisKKyAgICBwTWIgPSBtYjsKKworICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCisgICAgeworICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKKworICAgICAgICBpZiAoZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCisgICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCisgICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGx1bWEgKi8KKyAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKKworICAgICAgICAgICAgICAgIEZpbHRlckx1bWEoKHU4KilkYXRhLCBiUywgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyoxNik7CisKKyAgICAgICAgICAgICAgICAvKiBjaHJvbWEgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgRmlsdGVyQ2hyb21hKCh1OCopZGF0YSwgZGF0YSArIDY0KnBpY1NpemVJbk1icywgYlMsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjgpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYkNvbCsrOworICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgbWJDb2wgPSAwOworICAgICAgICAgICAgbWJSb3crKzsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlclZlckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgNC1waXhlbCBsdW1hIGVkZ2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlclZlckx1bWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyAmJiBiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworCisgICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICAgICAgdG1wID0gdGM7CisgICAgICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPQorICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLTNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVsyXTsKKworICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy0yXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLTNdID0gKHU4KSgoMiAqIGRhdGFbLTRdICsgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisKKyAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOworICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9ICh1OCkoKDIgKiBkYXRhWzNdICsgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgaW1hZ2VXaWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjLCB0bXA7CisgICAgdTMyIGk7CisgICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKKyAgICB0bXAgPSB0YzsKKyAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGErKykKKyAgICB7CisgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICB7CisgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAorICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2VzLiBUaGlzIGNhbgorICAgICAgICAgICAgYmUgZG9uZSB3aGVuIGJTIGlzIGVxdWFsIHRvIGFsbCBmb3VyIGVkZ2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JMdW1hKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIHUzMiB0bXBGbGFnOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07CisgICAgICAgIHRtcCA9IHRjOworICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkocDEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOworICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOworICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcEZsYWcgPSAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCAoKHRocmVzaG9sZHMtPmFscGhhID4+IDIpICsyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOworICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjNdID0gKHU4KSgoMiAqIGRhdGFbLWltYWdlV2lkdGgqNF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDIpOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOworICAgICAgICAgICAgICAgICAgICBkYXRhWyAwXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGgqMl0gPSAodTgpKCgyICogZGF0YVtpbWFnZVdpZHRoKjNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJDaHJvbWFFZGdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBvbmUgdmVydGljYWwgMi1waXhlbCBjaHJvbWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJWZXJDaHJvbWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIHUzMiB3aWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjOworICAgIHU4IHAwLCBxMCwgcDEsIHExOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICB7CisgICAgICAgIGlmIChiUyA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOworICAgICAgICB9CisgICAgfQorICAgIGRhdGEgKz0gd2lkdGg7CisgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKKyAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKKyAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgeworICAgICAgICBpZiAoYlMgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7CisgICAgICAgICAgICBkYXRhWyAwXSA9IHEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPCA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7CisgICAgZm9yIChpID0gMjsgaTsgaS0tLCBkYXRhKyspCisgICAgeworICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKKyAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICB9CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckNocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDItcGl4ZWwgY2hyb21hIGVkZ2VzLiBUaGlzCisgICAgICAgICAgICBjYW4gYmUgZG9uZSBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGZvdXIgZWRnZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckhvckNocm9tYSgKKyAgdTggKmRhdGEsCisgIHUzMiBiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YzsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYlMgPD0gNCk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgaWYgKGJTIDwgNCkKKyAgICB7CisgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOworICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSBwMDsKKyAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy13aWR0aF0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKKyAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCisgICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpiUywgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgLyogdG9wIGVkZ2VzICovCisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSA0OworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMCwgMTApOworICAgICAgICAgICAgYlNbMV0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDEsIDExKTsKKyAgICAgICAgICAgIGJTWzJdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA0LCAxNCk7CisgICAgICAgICAgICBiU1szXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNSwgMTUpOworICAgICAgICAgICAgaWYgKGJTWzBdLnRvcCB8fCBiU1sxXS50b3AgfHwgYlNbMl0udG9wIHx8IGJTWzNdLnRvcCkKKyAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiU1swXS50b3AgPSBiU1sxXS50b3AgPSBiU1syXS50b3AgPSBiU1szXS50b3AgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKElTX0lOVFJBX01CKCptYikgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDQ7CisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMCwgNSk7CisgICAgICAgICAgICBiU1s0XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDIsIDcpOworICAgICAgICAgICAgYlNbOF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCA4LCAxMyk7CisgICAgICAgICAgICBiU1sxMl0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAxMCwgMTUpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKKyAgICAgICAgICAgICAgICAoYlNbMF0ubGVmdCB8fCBiU1s0XS5sZWZ0IHx8IGJTWzhdLmxlZnQgfHwgYlNbMTJdLmxlZnQpKQorICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gMDsKKyAgICB9CisKKyAgICAvKiBpbm5lciBlZGdlcyAqLworICAgIGlmIChJU19JTlRSQV9NQigqbWIpKQorICAgIHsKKyAgICAgICAgYlNbNF0udG9wICA9IGJTWzVdLnRvcCAgPSBiU1s2XS50b3AgID0gYlNbN10udG9wICA9CisgICAgICAgIGJTWzhdLnRvcCAgPSBiU1s5XS50b3AgID0gYlNbMTBdLnRvcCA9IGJTWzExXS50b3AgPQorICAgICAgICBiU1sxMl0udG9wID0gYlNbMTNdLnRvcCA9IGJTWzE0XS50b3AgPSBiU1sxNV0udG9wID0gMzsKKworICAgICAgICBiU1sxXS5sZWZ0ICA9IGJTWzJdLmxlZnQgID0gYlNbM10ubGVmdCAgPQorICAgICAgICBiU1s1XS5sZWZ0ICA9IGJTWzZdLmxlZnQgID0gYlNbN10ubGVmdCAgPQorICAgICAgICBiU1s5XS5sZWZ0ICA9IGJTWzEwXS5sZWZ0ID0gYlNbMTFdLmxlZnQgPQorICAgICAgICBiU1sxM10ubGVmdCA9IGJTWzE0XS5sZWZ0ID0gYlNbMTVdLmxlZnQgPSAzOworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAorICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCisgICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworCisgICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKKyAgICAgICAgfQorICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKKyAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKKyAgICAgICAgICAgIGJTWzldLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7CisgICAgICAgICAgICBiU1sxMF0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7CisgICAgICAgICAgICBiU1sxMV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOworICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNF0sIG1iNHg0SW5kZXhbMF0pOworICAgICAgICAgICAgYlNbNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbNl0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbMl0pOworICAgICAgICAgICAgYlNbN10udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbM10pOworICAgICAgICAgICAgYlNbOF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOF0sIG1iNHg0SW5kZXhbNF0pOworICAgICAgICAgICAgYlNbOV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs2XSk7CisgICAgICAgICAgICBiU1sxMV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzddKTsKKyAgICAgICAgICAgIGJTWzEyXS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMl0sIG1iNHg0SW5kZXhbOF0pOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxNF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEwXSk7CisgICAgICAgICAgICBiU1sxNV0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzExXSk7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxXSwgbWI0eDRJbmRleFswXSk7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMl0sIG1iNHg0SW5kZXhbMV0pOworICAgICAgICAgICAgYlNbM10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzNdLCBtYjR4NEluZGV4WzJdKTsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFs0XSk7CisgICAgICAgICAgICBiU1s2XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNl0sIG1iNHg0SW5kZXhbNV0pOworICAgICAgICAgICAgYlNbN10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzZdKTsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs4XSk7CisgICAgICAgICAgICBiU1sxMF0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEwXSwgbWI0eDRJbmRleFs5XSk7CisgICAgICAgICAgICBiU1sxMV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFsxMF0pOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbMTJdKTsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTRdLCBtYjR4NEluZGV4WzEzXSk7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxNF0pOworICAgICAgICB9CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmCisgICAgICAgICAgICAoYlNbNF0udG9wIHx8IGJTWzVdLnRvcCB8fCBiU1s2XS50b3AgfHwgYlNbN10udG9wIHx8CisgICAgICAgICAgICAgYlNbOF0udG9wIHx8IGJTWzldLnRvcCB8fCBiU1sxMF0udG9wIHx8IGJTWzExXS50b3AgfHwKKyAgICAgICAgICAgICBiU1sxMl0udG9wIHx8IGJTWzEzXS50b3AgfHwgYlNbMTRdLnRvcCB8fCBiU1sxNV0udG9wIHx8CisgICAgICAgICAgICAgYlNbMV0ubGVmdCB8fCBiU1syXS5sZWZ0IHx8IGJTWzNdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1s1XS5sZWZ0IHx8IGJTWzZdLmxlZnQgfHwgYlNbN10ubGVmdCB8fAorICAgICAgICAgICAgIGJTWzldLmxlZnQgfHwgYlNbMTBdLmxlZnQgfHwgYlNbMTFdLmxlZnQgfHwKKyAgICAgICAgICAgICBiU1sxM10ubGVmdCB8fCBiU1sxNF0ubGVmdCB8fCBiU1sxNV0ubGVmdCkpCisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaW5kZXhBLCBpbmRleEI7CisgICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOworCisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCisgICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncywKKyAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGluZGV4QSwgaW5kZXhCOworICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgcXAgPSBtYi0+cXBZOworICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckx1bWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jaworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJMdW1hKAorICB1OCAqZGF0YSwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHU4ICpwdHI7CisgICAgdTMyIG9mZnNldDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgcHRyID0gZGF0YTsKKyAgICB0bXAgPSBiUzsKKworICAgIG9mZnNldCAgPSBUT1A7CisKKyAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCisgICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCisgICAgZm9yICh2YmxvY2sgPSA0OyB2YmxvY2stLTspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCBvZiB0aGUgZm91cgorICAgICAgICAgKiBGaWx0ZXJWZXJMdW1hRWRnZSBoYW5kbGVzIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssIG90aGVycworICAgICAgICAgKiBmaWx0ZXIgaW5uZXIgZWRnZXMgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsxXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgaWYgKHRtcFszXS5sZWZ0KQorICAgICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7CisKKyAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQorICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JMdW1hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckx1bWFFZGdlIGZvcgorICAgICAgICAgKiBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jayBlZGdlCisgICAgICAgICAqIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgb3RoZXIgcm91bmRzICovCisgICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCisgICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMgKyBvZmZzZXQsIChpMzIpd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsxXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzQsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFsyXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzgsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIGlmKHRtcFszXS50b3ApCisgICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyKzEyLCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmb3VyIHBpeGVsIHJvd3MgYWhlYWQsIGkuZS4gbmV4dCByb3cgb2YgNHg0LWJsb2NrcyAqLworICAgICAgICBwdHIgKz0gd2lkdGgqNDsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgICAgIG9mZnNldCA9IElOTkVSOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaWx0ZXJDaHJvbWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmlsdGVyIGFsbCBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckNocm9tYSgKKyAgdTggKmRhdGFDYiwKKyAgdTggKmRhdGFDciwKKyAgYlNfdCAqYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YmxvY2s7CisgICAgYlNfdCAqdG1wOworICAgIHUzMiBvZmZzZXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhQ2IpOworICAgIEFTU0VSVChkYXRhQ3IpOworICAgIEFTU0VSVChiUyk7CisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworCisgICAgdG1wID0gYlM7CisgICAgb2Zmc2V0ID0gVE9QOworCisgICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jaworICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLworICAgIGZvciAodmJsb2NrID0gMDsgdmJsb2NrIDwgMjsgdmJsb2NrKyspCisgICAgeworICAgICAgICAvKiBvbmx5IHBlcmZvcm0gZmlsdGVyaW5nIGlmIGJTIGlzIG5vbi16ZXJvLCBmaXJzdCB0d28gb2YgdGhlIGZvdXIKKyAgICAgICAgICogRmlsdGVyVmVyQ2hyb21hRWRnZSBjYWxscyBoYW5kbGUgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywKKyAgICAgICAgICogb3RoZXJzIGZpbHRlciB0aGUgaW5uZXIgZWRnZS4gTm90ZSB0aGF0IGFzIGNocm9tYSB1c2VzIGJTIHZhbHVlcworICAgICAgICAgKiBkZXRlcm1pbmVkIGZvciBsdW1hIGVkZ2VzLCBlYWNoIGJTIGlzIHVzZWQgb25seSBmb3IgMiBwaXhlbHMgb2YKKyAgICAgICAgICogYSA0LXBpeGVsIGVkZ2UgKi8KKyAgICAgICAgaWYgKHRtcFswXS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs0XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAorICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wWzJdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKKyAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFs2XS5sZWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAorICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KKyAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yQ2hyb21hLCBvdGhlcndpc2UgdXNlIEZpbHRlckhvckNocm9tYUVkZ2UKKyAgICAgICAgICogZm9yIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrCisgICAgICAgICAqIGVkZ2Ugb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBzZWNvbmQgKi8KKyAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKKyAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtcFswXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcFsxXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXBbMl0udG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG1wWzNdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wICs9IDg7CisgICAgICAgIGRhdGFDYiArPSB3aWR0aCo0OworICAgICAgICBkYXRhQ3IgKz0gd2lkdGgqNDsKKyAgICAgICAgb2Zmc2V0ID0gSU5ORVI7CisgICAgfQorfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKKyAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQorICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKKyAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQorICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKKyAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKKyAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC0tZXs1NTB9IFN5bWJvbCBub3QgYWNjZXNzZWQgKi8KK3ZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCisgIGltYWdlX3QgKmltYWdlLAorICBtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzOworICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKKyAgICB1MzIgcGljV2lkdGhJbk1iczsKKyAgICB1OCAqZGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworICAgIHU4IGJTWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRMdW1hWzJdWzE2XTsKKyAgICB1OCB0aHJlc2hvbGRDaHJvbWFbMl1bOF07CisgICAgdTggYWxwaGFbMl1bMl07CisgICAgdTggYmV0YVsyXVsyXTsKKyAgICBPTVhSZXN1bHQgcmVzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7CisKKyAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOworICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKKyAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKKworICAgIHBNYiA9IG1iOworCisgICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKKyAgICB7CisgICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOworCisgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKKyAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KKyAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvKiBMdW1hICovCisgICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHBNYixhbHBoYSxiZXRhLHRocmVzaG9sZEx1bWEsYlMsZmxhZ3MpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7CisKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSsxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7CisgICAgICAgICAgICAgICAgLyogQ2IgKi8KKyAgICAgICAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcyhwTWIsIGFscGhhLCBiZXRhLCB0aHJlc2hvbGRDaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlMsIGZsYWdzLCBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemVJbk1icyAqIDI1NiArCisgICAgICAgICAgICAgICAgICAgIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDY0ICsgbWJDb2wgKiA4OworCisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOworICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKKyAgICAgICAgICAgICAgICAvKiBDciAqLworICAgICAgICAgICAgICAgIGRhdGEgKz0gKHBpY1NpemVJbk1icyAqIDY0KTsKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7CisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWJDb2wrKzsKKyAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iQ29sID0gMDsKKyAgICAgICAgICAgIG1iUm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQorICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKKyAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYlMpWzE2XSwgdTMyIGZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgSEFOVFJPX1RSVUUgYXMgc29vbiBhcyBhbnkgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgaXMKKyAgICAgKiBub24temVybyAqLworICAgIHUzMiBub25aZXJvQnMgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyICpwVG1wOworICAgIHUzMiB0bXAxLCB0bXAyLCBpc0ludHJhTWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQoZmxhZ3MpOworCisgICAgaXNJbnRyYU1iID0gSVNfSU5UUkFfTUIoKm1iKTsKKworICAgIC8qIHRvcCBlZGdlcyAqLworICAgIHBUbXAgPSAodTMyKikmYlNbMV1bMF07CisgICAgaWYgKGZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYiwgbWItPm1iQik7CisgICAgICAgICAgICBpZiAoKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGxlZnQgZWRnZXMgKi8KKyAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOworICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypiU1swXVswXSA9IGJTWzBdWzFdID0gYlNbMF1bMl0gPSBiU1swXVszXSA9IDQ7Ki8KKyAgICAgICAgICAgICpwVG1wID0gMHgwNDA0MDQwNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQobWIsIG1iLT5tYkEpOworICAgICAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKnBUbXApCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBUbXAgPSAwOworICAgIH0KKworICAgIC8qIGlubmVyIGVkZ2VzICovCisgICAgaWYgKGlzSW50cmFNYikKKyAgICB7CisgICAgICAgIHBUbXArKzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgcFRtcCsrOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wID0gMHgwMzAzMDMwMzsKKworICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFRtcCA9ICh1MzIqKW1iLT50b3RhbENvZWZmOworCisgICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKKyAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLworICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLworICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLworCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OworCisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7CisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107CisgICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KKyAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCisgICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCisKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7CisgICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOworICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOworICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzZdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMF1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICBiU1swXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzE0XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlsxMV07CisgICAgICAgICAgICBiU1swXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIDh4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIHZlcnRpY2FsIGVkZ2UsIGZvciB0aGUgb3RoZXIgbGVmdCBlZGdlcyBpdCBpcworICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCisgICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgdG9wIGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfOHgxNikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLworICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLworICAgICAgICAgICAgdG1wMiA9ICpwVG1wOworICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLworICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KKworICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCisgICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKKworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOworICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMiwgMCk7CisgICAgICAgICAgICBiU1sxXVs1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDEpOworICAgICAgICAgICAgYlNbMF1bNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxLCAwKTsKKyAgICAgICAgICAgIGJTWzBdWzVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMik7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDYsIDQpOworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNSk7CisgICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA1LCA0KTsKKyAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDYpOworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMCwgOCk7CisgICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgOSk7CisgICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA5LCA4KTsKKyAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCAxMCk7CisgICAgICAgICAgICB0bXAxID0gKnBUbXA7CisgICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNCwgMTIpOworICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDEzKTsKKyAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEzLCAxMik7CisgICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTQpOworCisgICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOworICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKKyAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKKworICAgICAgICAgICAgYlNbMF1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA0LCAxKTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1swXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7CisgICAgICAgICAgICBiU1swXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxNCwgMTEpOworICAgICAgICB9CisgICAgICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07CisgICAgICAgIGlmICghbm9uWmVyb0JzICYmIChwVG1wWzFdIHx8IHBUbXBbMl0gfHwgcFRtcFszXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFs1XSB8fCBwVG1wWzZdIHx8IHBUbXBbN10pICkKKyAgICAgICAgeworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4obm9uWmVyb0JzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEx1bWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgICBtYlN0b3JhZ2VfdCAqbWIsCisgICAgdTggKCphbHBoYSlbMl0sCisgICAgdTggKCpiZXRhKVsyXSwKKyAgICB1OCAoKnRocmVzaG9sZClbMTZdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAvKiBJbnRlcm5hbCBlZGdlIHZhbHVlcyAqLworICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07CisKKyAgICAvKiB2ZXJ0aWNhbCBzY2FuIG9yZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs0XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzVdOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bNl07CisgICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVs3XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzhdOworICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bOV07CisgICAgICAgIHRocmVzaG9sZFtpXVs4XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMF07CisgICAgICAgIHRocmVzaG9sZFtpXVs5XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxMV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMl07CisgICAgICAgIHRocmVzaG9sZFtpXVsxMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxM107CisgICAgICAgIHRocmVzaG9sZFtpXVsxMl0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxNF07CisgICAgICAgIHRocmVzaG9sZFtpXVsxM10gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxNV07CisgICAgICAgIHRocmVzaG9sZFtpXVsxNF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdGhyZXNob2xkW2ldWzE1XSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgIH0KKworICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gcXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKKyAgICAgICAgICAgIHQyID0gYnNbMV1bMV07CisgICAgICAgICAgICB0MyA9IGJzWzFdWzJdOworICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSAmJiAodDEgPCA0KSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyICYmICh0MiA8IDQpKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMgJiYgKHQzIDwgNCkpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCAmJiAodDQgPCA0KSkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IHFwKQorICAgICAgICB7CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSAmJiAoYnNbMF1bMF0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdICYmIChic1swXVsxXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0gJiYgKGJzWzBdWzJdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSAmJiAoYnNbMF1bM10gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKKyAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVs4XSwKKyAgICB1OCAoKmJzKVsxNl0sCisgICAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkKTsKKyAgICBBU1NFUlQoYnMpOworICAgIEFTU0VSVChiZXRhKTsKKyAgICBBU1NFUlQoYWxwaGEpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIHFwID0gbWItPnFwWTsKKyAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisKKyAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOworICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICAgIHUzMiB0MSwgdDI7CisKKyAgICAgICAgdDEgPSBic1tpXVswXTsKKyAgICAgICAgdDIgPSBic1tpXVsxXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzBdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzJdOworICAgICAgICB0aHJlc2hvbGRbaV1bMV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bM107CisgICAgICAgIHRocmVzaG9sZFtpXVsyXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs4XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzNdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzldOworICAgICAgICB0aHJlc2hvbGRbaV1bNF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bMTBdOworICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bMTFdOworICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOworCisgICAgICAgICAgICB0MSA9IGJzWzFdWzBdOworICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKKyAgICAgICAgICAgIHQzID0gYnNbMV1bMl07CisgICAgICAgICAgICB0NCA9IGJzWzFdWzNdOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MykgPyB0YzBbaW5kZXhBXVt0M10gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0KSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworCisgICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgICAgICAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVswXSA9IChic1swXVswXSkgPyB0YzBbaW5kZXhBXVtic1swXVswXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzFdID0gKGJzWzBdWzFdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzFdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMl0gPSAoYnNbMF1bMl0pID8gdGMwW2luZGV4QV1bYnNbMF1bMl1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVszXSA9IChic1swXVszXSkgPyB0YzBbaW5kZXhBXVtic1swXVszXV0gOiAwOworICAgICAgICB9CisgICAgfQorCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qbGludCArZTcwMSArZTcwMiAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTcxZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSAorI2RlZmluZSBIMjY0U1dERUNfREVCTE9DS0lOR19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAorICBpbWFnZV90ICppbWFnZSwKKyAgbWJTdG9yYWdlX3QgKm1iKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTY4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCkBAIC0wLDAgKzEsOTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEluaXQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlCisgICAgICAgICAgaDI2NGJzZFNodXRkb3duCisgICAgICAgICAgaDI2NGJzZEN1cnJlbnRJbWFnZQorICAgICAgICAgIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQorICAgICAgICAgIGgyNjRic2RQaWNXaWR0aAorICAgICAgICAgIGgyNjRic2RQaWNIZWlnaHQKKyAgICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIKKyAgICAgICAgICBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cworICAgICAgICAgIGgyNjRic2RWaWRlb1JhbmdlCisgICAgICAgICAgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cworICAgICAgICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGRlY29kZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIHRoZSBkZWNvZGVyIHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBwZXJmb3JtIHJlb3JkZXJpbmcgb2YgZGlzcGxheSBpbWFnZXMuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgc2l6ZTsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBoMjY0YnNkSW5pdFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgLyogYWxsb2NhdGUgbWJMYXllciB0byBiZSBuZXh0IG11bHRpcGxlIG9mIDY0IHRvIGVuYWJsZSB1c2Ugb2YKKyAgICAgKiBzcGVjaWZpYyBORU9OIG9wdGltaXplZCAibWVtc2V0IiBmb3IgY2xlYXJpbmcgdGhlIHN0cnVjdHVyZSAqLworICAgIHNpemUgPSAoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGOworCisgICAgcFN0b3JhZ2UtPm1iTGF5ZXIgPSAobWFjcm9ibG9ja0xheWVyX3QqKUgyNjRTd0RlY01hbGxvYyhzaXplKTsKKyAgICBpZiAoIXBTdG9yYWdlLT5tYkxheWVyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKworICAgIGlmIChub091dHB1dFJlb3JkZXJpbmcpCisgICAgICAgIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgPSBIQU5UUk9fVFJVRTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgYSBOQUwgdW5pdC4gVGhpcyBmdW5jdGlvbiBjYWxscyBvdGhlciBtb2R1bGVzIHRvIHBlcmZvcm0KKyAgICAgICAgICAgIHRhc2tzIGxpa2UKKyAgICAgICAgICAgICAgICAqIGV4dHJhY3QgYW5kIGRlY29kZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbQorICAgICAgICAgICAgICAgICogZGVjb2RlIHBhcmFtZXRlciBzZXRzCisgICAgICAgICAgICAgICAgKiBkZWNvZGUgc2xpY2UgaGVhZGVyIGFuZCBzbGljZSBkYXRhCisgICAgICAgICAgICAgICAgKiBjb25jZWFsIGVycm9ycyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICogcGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZworCisgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIHRvcCBsZXZlbCBjb250cm9sIGxvZ2ljIG9mIHRoZSBkZWNvZGVyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGJ5dGVTdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBidWZmZXIgZ2l2ZW4gYnkgYXBwbGljYXRpb24KKyAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiBieXRlcworICAgICAgICAgICAgcGljSWQgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIGEgcGljdHVyZSwgYXNzaWduZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRCU0RfUkRZICAgICAgICAgICAgIGRlY29kaW5nIGZpbmlzaGVkLCBub3RoaW5nIHNwZWNpYWwKKyAgICAgICAgICAgIEgyNjRCU0RfUElDX1JEWSAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAorICAgICAgICAgICAgSDI2NEJTRF9IRFJTX1JEWSAgICAgICAgcGFyYW0gc2V0cyBhY3RpdmF0ZWQsIGluZm9ybWF0aW9uIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgZGltZW5zaW9ucyBldGMgY2FuIGJlIHJlYWQKKyAgICAgICAgICAgIEgyNjRCU0RfRVJST1IgICAgICAgICAgIGVycm9yIGluIGRlY29kaW5nCisgICAgICAgICAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiBzZXJpdXMgZXJyb3IgaW4gZGVjb2RpbmcsIGZhaWxlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgcGFyYW0gc2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKKyAgICB1MzIgKnJlYWRCeXRlcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBwcHNJZCwgc3BzSWQ7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIG5hbFVuaXRfdCBuYWxVbml0OworICAgIHNlcVBhcmFtU2V0X3Qgc2VxUGFyYW1TZXQ7CisgICAgcGljUGFyYW1TZXRfdCBwaWNQYXJhbVNldDsKKyAgICBzdHJtRGF0YV90IHN0cm07CisgICAgdTMyIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyIHBpY1JlYWR5ID0gSEFOVFJPX0ZBTFNFOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChieXRlU3RybSk7CisgICAgQVNTRVJUKGxlbik7CisgICAgQVNTRVJUKHJlYWRCeXRlcyk7CisKKyAgICAvKiBpZiBwcmV2aW91cyBidWZmZXIgd2FzIG5vdCBmaW5pc2hlZCBhbmQgc2FtZSBwb2ludGVyIGdpdmVuIC0+IHNraXAgTkFMCisgICAgICogdW5pdCBleHRyYWN0aW9uICovCisgICAgaWYgKHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgJiYgYnl0ZVN0cm0gPT0gcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyKQorICAgIHsKKyAgICAgICAgc3RybSA9IHBTdG9yYWdlLT5zdHJtWzBdOworICAgICAgICBzdHJtLnBTdHJtQ3VyclBvcyA9IHN0cm0ucFN0cm1CdWZmU3RhcnQ7CisgICAgICAgIHN0cm0uc3RybUJ1ZmZSZWFkQml0cyA9IHN0cm0uYml0UG9zSW5Xb3JkID0gMDsKKyAgICAgICAgKnJlYWRCeXRlcyA9IHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEV4dHJhY3ROYWxVbml0KGJ5dGVTdHJtLCBsZW4sICZzdHJtLCByZWFkQnl0ZXMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJCWVRFX1NUUkVBTSIpOworICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICB9CisgICAgICAgIC8qIHN0b3JlIHN0cmVhbSAqLworICAgICAgICBwU3RvcmFnZS0+c3RybVswXSA9IHN0cm07CisgICAgICAgIHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZCA9ICpyZWFkQnl0ZXM7CisgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlciA9IGJ5dGVTdHJtOworICAgIH0KKyAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZU5hbFVuaXQoJnN0cm0sICZuYWxVbml0KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiTkFMX1VOSVQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgIH0KKworICAgIC8qIERpc2NhcmQgdW5zcGVjaWZpZWQsIHJlc2VydmVkLCBTUFMgZXh0ZW5zaW9uIGFuZCBhdXhpbGlhcnkgcGljdHVyZSBzbGljZXMgKi8KKyAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IDAgfHwgbmFsVW5pdC5uYWxVbml0VHlwZSA+PSAxMykKKyAgICB7CisgICAgICAgIERFQlVHKCgiRElTQ0FSREVEIE5BTCAoVU5TUEVDSUZJRUQsIFJFR0lTVEVSRUQsIFNQUyBleHQgb3IgQVVYIHNsaWNlKVxuIikpOworICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgICAgICZzdHJtLAorICAgICAgJm5hbFVuaXQsCisgICAgICBwU3RvcmFnZSwKKyAgICAgICZhY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEVQUklOVCgiQUNDRVNTIFVOSVQgQk9VTkRBUlkgQ0hFQ0siKTsKKyAgICAgICAgaWYgKHRtcCA9PSBQQVJBTV9TRVRfRVJST1IpCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgfQorCisgICAgaWYgKCBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICkKKyAgICB7CisgICAgICAgIERFQlVHKCgiQWNjZXNzIHVuaXQgYm91bmRhcnlcbiIpKTsKKyAgICAgICAgLyogY29uY2VhbCBpZiBwaWN0dXJlIHN0YXJ0ZWQgYW5kIHBhcmFtIHNldHMgYWN0aXZhdGVkICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+cGljU3RhcnRlZCAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiQ09OQ0VBTElORy4uLiIpKTsKKworICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgorICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLCBQX1NMSUNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZVR5cGUpOworCisgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworCisgICAgICAgICAgICAvKiBjdXJyZW50IE5BTCB1bml0IHNob3VsZCBiZSBkZWNvZGVkIG9uIG5leHQgYWN0aXZhdGlvbiAtPiBzZXQKKyAgICAgICAgICAgICAqIHJlYWRCeXRlcyB0byAwICovCisgICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIERFQlVHKCgiLi4uRE9ORVxuIikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFwaWNSZWFkeSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobmFsVW5pdC5uYWxVbml0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOQUxfU0VRX1BBUkFNX1NFVDoKKyAgICAgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoJnN0cm0sICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNFUV9QQVJBTV9TRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQudnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQocFN0b3JhZ2UsICZzZXFQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTkFMX1BJQ19QQVJBTV9TRVQ6CisgICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgUEFSQU0gU0VUXG4iKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KCZzdHJtLCAmcGljUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQSUNfUEFSQU1fU0VUIik7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQucnVuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC50b3BMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ib3R0b21SaWdodCk7CisgICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuc2xpY2VHcm91cElkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChwU3RvcmFnZSwgJnBpY1BhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0VfSURSOgorICAgICAgICAgICAgICAgIERFQlVHKCgiSURSICIpKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgSEVBREVSXG4iKSk7CisKKyAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBhbmQgc3RpbGwgZGVjb2Rpbmcgc2FtZSBvbGQKKyAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCAtPiBubyBuZWVkIHRvIGRlY29kZSByZWR1bmRhbnQgc2xpY2VzICovCisgICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOworCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fVFJVRTsKKworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCAgICA9IHBpY0lkOworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKCZzdHJtLCAmcHBzSWQpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQodG1wID09IEhBTlRST19PSyk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIG9sZCBhY3RpdmVTcHNJZCBhbmQgcmV0dXJuIGhlYWRlcnMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGlvbiBpZiBhY3RpdmVTcHMgY2hhbmdlcyAqLworICAgICAgICAgICAgICAgICAgICBzcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHBTdG9yYWdlLCBwcHNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBhcmFtIHNldCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDI2NEJTRF9NRU1BTExPQ19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqb2xkU1BTID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm5ld1NQUyA9IHBTdG9yYWdlLT5hY3RpdmVTcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwU3RvcmFnZS0+b2xkU3BzSWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFNQUyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPm9sZFNwc0lkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZygmbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm0sIG5ld1NQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsVW5pdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IEhBTlRST19OT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0bXAgIT0gSEFOVFJPX09LKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocFN0b3JhZ2UtPmRwYi0+bm9SZW9yZGVyaW5nKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljV2lkdGhJbk1icyAhPSBuZXdTUFMtPnBpY1dpZHRoSW5NYnMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNIZWlnaHRJbk1icyAhPSBuZXdTUFMtPnBpY0hlaWdodEluTWJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+bWF4RHBiU2l6ZSAhPSBuZXdTUFMtPm1heERwYlNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5kcGItPmZsdXNoZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm9sZFNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9IRFJTX1JEWSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCisgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcigmc3RybSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgJm5hbFVuaXQpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9IRUFERVIiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXS5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFJlZklkYyAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJHYXBzIGluIGZyYW1lIG51bSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNsaWNlIGhlYWRlciB0byBzdG9yYWdlIGlmIHN1Y2Nlc3NmdWxseSBkZWNvZGVkICovCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdID0gcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZOYWxVbml0WzBdID0gbmFsVW5pdDsKKworICAgICAgICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOworCisgICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlJlb3JkZXJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgREFUQSwgRklSU1QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKSk7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlRGF0YSgmc3RybSwgcFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc0VuZE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0VJIE1FU1NBR0UsIE5PVCBERUNPREVEIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERFQlVHKCgiTk9UIElNUExFTUVOVEVEIFlFVCAlZFxuIixuYWxVbml0Lm5hbFVuaXRUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGljUmVhZHkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZShwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+bWIpOworCisgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UocFN0b3JhZ2UpOworCisgICAgICAgIHBpY09yZGVyQ250ID0gaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBTdG9yYWdlLT5wb2MsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIsIHBTdG9yYWdlLT5wcmV2TmFsVW5pdCk7CisKKyAgICAgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnByZXZOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwKKyAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBqdXN0IHN0b3JlIGZvciBwb3NzaWJsZSBkaXNwbGF5CisgICAgICAgICAgICAgKiByZW9yZGVyaW5nICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCisgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHJldHVybihIMjY0QlNEX1BJQ19SRFkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2h1dGRvd24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2h1dGRvd24gYSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yaWVzCisgICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIGluc3RhbmNlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ydW5MZW5ndGgpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT50b3BMZWZ0KTsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+Ym90dG9tUmlnaHQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5zbGljZUdyb3VwSWQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZSRUUocFN0b3JhZ2UtPm1iTGF5ZXIpOworICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKKyAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKKworICAgIGgyNjRic2RGcmVlRHBiKHBTdG9yYWdlLT5kcGIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBuZXh0IG91dHB1dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY0lkICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgaXNJZHJQaWMgICAgSURSIGZsYWcgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGRhdGEKKyAgICAgICAgICAgIE5VTEwgaWYgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBkcGJPdXRQaWN0dXJlX3QgKnBPdXQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBwT3V0ID0gaDI2NGJzZERwYk91dHB1dFBpY3R1cmUocFN0b3JhZ2UtPmRwYik7CisKKyAgICBpZiAocE91dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgKnBpY0lkID0gcE91dC0+cGljSWQ7CisgICAgICAgICppc0lkclBpYyA9IHBPdXQtPmlzSWRyOworICAgICAgICAqbnVtRXJyTWJzID0gcE91dC0+bnVtRXJyTWJzOworICAgICAgICByZXR1cm4gKHBPdXQtPmRhdGEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNXaWR0aAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwaWN0dXJlIHdpZHRoCisgICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQaWNIZWlnaHQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGhlaWdodCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKKyAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCdWZmZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmx1c2ggdGhlIGRlY29kZWQgcGljdHVyZSBidWZmZXIsIHNlZSBkcGIuYyBmb3IgZGV0YWlscworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBwYXJhbWV0ZXIgc2V0IGNvbWJpbmF0aW9ucyAoU1BTL1BQUykgZXhpc3RzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgMSAgICAgICBhdCBsZWFzdCBvbmUgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBmb3VuZAorICAgICAgICAgICAgMCAgICAgICBubyB2YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb25zIGZvdW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgcmV0dXJuKGgyNjRic2RWYWxpZFBhcmFtU2V0cyhwU3RvcmFnZSkgPT0gSEFOVFJPX09LID8gMSA6IDApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFZpZGVvUmFuZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAxICAgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGFuZCB2YWx1ZSBpcyAxCisgICAgICAgICAgICAwICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZykKKyAgICAgICAgcmV0dXJuKDEpOworICAgIGVsc2UgLyogZGVmYXVsdCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgaXMgMCAqLworICAgICAgICByZXR1cm4oMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyBpZiByZWNlaXZlZAorICAgICAgICAgICAgMiAgIG90aGVyd2lzZSAodGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQorICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzKTsKKyAgICBlbHNlIC8qIGRlZmF1bHQgdW5zcGVjaWZpZWQgKi8KKyAgICAgICAgcmV0dXJuKDIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaGgyNjRic2RDcm9wcGluZ1BhcmFtcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgY3JvcHBpbmcgcGFyYW1ldGVycyBvZiB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY3JvcHBpbmdGbGFnICAgIGZsYWcgaW5kaWNhdGluZyBpZiBjcm9wcGluZyBwYXJhbXMgcHJlc2VudCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCisgICAgICAgICAgICBsZWZ0T2Zmc2V0ICAgICAgY3JvcHBpbmcgbGVmdCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB3aWR0aCAgICAgICAgICAgd2lkdGggb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisgICAgICAgICAgICB0b3BPZmZzZXQgICAgICAgY3JvcHBpbmcgdG9wIG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIGhlaWdodCAgICAgICAgICBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0T2Zmc2V0LCB1MzIgKndpZHRoLCB1MzIgKnRvcE9mZnNldCwgdTMyICpoZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICAqY3JvcHBpbmdGbGFnID0gMTsKKyAgICAgICAgKmxlZnRPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldDsKKyAgICAgICAgKndpZHRoID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzIC0KKyAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BSaWdodE9mZnNldCk7CisgICAgICAgICp0b3BPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0OworICAgICAgICAqaGVpZ2h0ID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyAtCisgICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjcm9wcGluZ0ZsYWcgPSAwOworICAgICAgICAqbGVmdE9mZnNldCA9IDA7CisgICAgICAgICp3aWR0aCA9IDA7CisgICAgICAgICp0b3BPZmZzZXQgPSAwOworICAgICAgICAqaGVpZ2h0ID0gMDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFzcGVjdCByYXRpbyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHNhcldpZHRoICAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0CisgICAgICAgICAgICBzYXJIZWlnaHQgICBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKyAgICB1MzIgdyA9IDE7CisgICAgdTMyIGggPSAxOworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyApCisgICAgeworICAgICAgICBzd2l0Y2ggKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRDogIHcgPSAgIDA7IGggPSAgMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xXzE6ICAgICAgICAgIHcgPSAgIDE7IGggPSAgMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMl8xMTogICAgICAgIHcgPSAgMTI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMF8xMTogICAgICAgIHcgPSAgMTA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl8xMTogICAgICAgIHcgPSAgMTY7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180MF8zMzogICAgICAgIHcgPSAgNDA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yNF8xMTogICAgICAgIHcgPSAgMjQ7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yMF8xMTogICAgICAgIHcgPSAgMjA7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zMl8xMTogICAgICAgIHcgPSAgMzI7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT184MF8zMzogICAgICAgIHcgPSAgODA7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xOF8xMTogICAgICAgIHcgPSAgMTg7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNV8xMTogICAgICAgIHcgPSAgMTU7IGggPSAxMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT182NF8zMzogICAgICAgIHcgPSAgNjQ7IGggPSAzMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNjBfOTk6ICAgICAgIHcgPSAxNjA7IGggPSA5OTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVI6CisgICAgICAgICAgICAgICAgdyA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoOworICAgICAgICAgICAgICAgIGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKCh3ID09IDApIHx8IChoID09IDApKQorICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHcgPSAwOworICAgICAgICAgICAgICAgIGggPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0IGFzcGVjdCByYXRpbyovCisgICAgKnNhcldpZHRoID0gdzsKKyAgICAqc2FySGVpZ2h0ID0gaDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9maWxlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBwcm9maWxlIGluZm9ybWF0aW9uIGZyb20gYWN0aXZlIFNQUworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcHJvZmlsZSAgIGN1cnJlbnQgcHJvZmlsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCisgICAgICAgIHJldHVybiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5wcm9maWxlSWRjOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfREVDT0RFUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ERUNPREVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGVkIHJldHVybiB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyAqLworZW51bSB7CisgICAgSDI2NEJTRF9SRFksCisgICAgSDI2NEJTRF9QSUNfUkRZLAorICAgIEgyNjRCU0RfSERSU19SRFksCisgICAgSDI2NEJTRF9FUlJPUiwKKyAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiwKKyAgICBIMjY0QlNEX01FTUFMTE9DX0VSUk9SCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpOwordTMyIGgyNjRic2REZWNvZGUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTggKmJ5dGVTdHJtLCB1MzIgbGVuLCB1MzIgcGljSWQsCisgICAgdTMyICpyZWFkQnl0ZXMpOwordm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3U4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKKyAgICB1MzIgKm51bUVyck1icyk7CisKK3UzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZFBpY0hlaWdodChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCisgICAgdTMyICpsZWZ0LCB1MzIgKndpZHRoLCB1MzIgKnRvcCwgdTMyICpoZWlnaHQpOwordm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KTsKK3UzMiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKwordm9pZCBoMjY0YnNkRmx1c2hCdWZmZXIoc3RvcmFnZV90ICpwU3RvcmFnZSk7CisKK3UzMiBoMjY0YnNkUHJvZmlsZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDT0RFUl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTE3ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCkBAIC0wLDAgKzEsMTU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIENvbXBhcmVQaWN0dXJlcworICAgICAgICAgIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorICAgICAgICAgIE1tY29wMQorICAgICAgICAgIE1tY29wMgorICAgICAgICAgIE1tY29wMworICAgICAgICAgIE1tY29wNAorICAgICAgICAgIE1tY29wNQorICAgICAgICAgIE1tY29wNgorICAgICAgICAgIGgyNjRic2RNYXJrRGVjUmVmUGljCisgICAgICAgICAgaDI2NGJzZEdldFJlZlBpY0RhdGEKKyAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZQorICAgICAgICAgIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCisgICAgICAgICAgaDI2NGJzZEluaXREcGIKKyAgICAgICAgICBoMjY0YnNkUmVzZXREcGIKKyAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKyAgICAgICAgICBGaW5kRHBiUGljCisgICAgICAgICAgU2V0UGljTnVtcworICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCisgICAgICAgICAgRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKyAgICAgICAgICBPdXRwdXRQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkRmx1c2hEcGIKKyAgICAgICAgICBoMjY0YnNkRnJlZURwYgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNyb3MgdG8gZGV0ZXJtaW5lIHBpY3R1cmUgc3RhdHVzLiBOb3RlIHRoYXQgSVNfU0hPUlRfVEVSTSBtYWNybyByZXR1cm5zCisgKiB0cnVlIGFsc28gZm9yIG5vbi1leGlzdGluZyBwaWN0dXJlcyBiZWNhdXNlIG5vbi1leGlzdGluZyBwaWN0dXJlcyBhcmUKKyAqIHJlZ2FyZGVkIHNob3J0IHRlcm0gcGljdHVyZXMgYWNjb3JkaW5nIHRvIEguMjY0IHN0YW5kYXJkICovCisjZGVmaW5lIElTX1JFRkVSRU5DRShhKSAoKGEpLnN0YXR1cykKKyNkZWZpbmUgSVNfRVhJU1RJTkcoYSkgKChhKS5zdGF0dXMgPiBOT05fRVhJU1RJTkcpCisjZGVmaW5lIElTX1NIT1JUX1RFUk0oYSkgXAorICAgICgoYSkuc3RhdHVzID09IE5PTl9FWElTVElORyB8fCAoYSkuc3RhdHVzID09IFNIT1JUX1RFUk0pCisjZGVmaW5lIElTX0xPTkdfVEVSTShhKSAoKGEpLnN0YXR1cyA9PSBMT05HX1RFUk0pCisKKy8qIG1hY3JvIHRvIHNldCBhIHBpY3R1cmUgdW51c2VkIGZvciByZWZlcmVuY2UgKi8KKyNkZWZpbmUgU0VUX1VOVVNFRChhKSAoYSkuc3RhdHVzID0gVU5VU0VEOworCisjZGVmaW5lIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgMTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKTsKKworc3RhdGljIHUzMiBNbWNvcDEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcyk7CisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pOworCitzdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAorICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KTsKKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE1tY29wNihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCBpMzIgcGljT3JkZXJDbnQsCisgICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pOworCitzdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKTsKKworc3RhdGljIGRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDb21wYXJlUGljdHVyZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gY29tcGFyZSBkcGIgcGljdHVyZXMsIHVzZWQgYnkgdGhlIFNoZWxsU29ydCgpIGZ1bmN0aW9uLgorICAgICAgICAgICAgT3JkZXIgb2YgdGhlIHBpY3R1cmVzIGFmdGVyIHNvcnRpbmcgc2hhbGwgYmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAxKSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBsYXJnZXN0CisgICAgICAgICAgICAgICAgICAgcGljTnVtCisgICAgICAgICAgICAgICAgMikgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBzbWFsbGVzdAorICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtUGljTnVtCisgICAgICAgICAgICAgICAgMykgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UgYnV0IG5lZWRlZCBmb3IgZGlzcGxheQorICAgICAgICAgICAgICAgIDQpIG90aGVyIHBpY3R1cmVzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIC0xICAgICAgcGljIDEgaXMgZ3JlYXRlciB0aGFuIHBpYyAyCisgICAgICAgICAgICAgMCAgICAgIGVxdWFsIGZyb20gY29tcGFyaXNvbiBwb2ludCBvZiB2aWV3CisgICAgICAgICAgICAgMSAgICAgIHBpYyAyIGlzIGdyZWF0ZXIgdGhlbiBwaWMgMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGRwYlBpY3R1cmVfdCAqcGljMSwgKnBpYzI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwdHIxKTsKKyAgICBBU1NFUlQocHRyMik7CisKKyAgICBwaWMxID0gKGRwYlBpY3R1cmVfdCopcHRyMTsKKyAgICBwaWMyID0gKGRwYlBpY3R1cmVfdCopcHRyMjsKKworICAgIC8qIGJvdGggYXJlIG5vbi1yZWZlcmVuY2UgcGljdHVyZXMsIGNoZWNrIGlmIG5lZWRlZCBmb3IgZGlzcGxheSAqLworICAgIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSAmJiAhSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICB7CisgICAgICAgIGlmIChwaWMxLT50b0JlRGlzcGxheWVkICYmICFwaWMyLT50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZSBpZiAoIXBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgcGljMi0+dG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMyKSkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAvKiBvbmx5IHBpYyAyIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSkKKyAgICAgICAgcmV0dXJuKDEpOworICAgIC8qIGJvdGggYXJlIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpICYmIElTX1NIT1JUX1RFUk0oKnBpYzIpKQorICAgIHsKKyAgICAgICAgaWYgKHBpYzEtPnBpY051bSA+IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICAvKiBvbmx5IHBpYyAxIGlzIHNob3J0IHRlcm0gLT4gZ3JlYXRlciAqLworICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpKQorICAgICAgICByZXR1cm4oLTEpOworICAgIC8qIG9ubHkgcGljIDIgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCisgICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMikpCisgICAgICAgIHJldHVybigxKTsKKyAgICAvKiBib3RoIGFyZSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAoY29udGFpbnMgdGhlCisgICAgICogbG9uZ1Rlcm1QaWNOdW0gKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlIGlmIChwaWMxLT5waWNOdW0gPCBwaWMyLT5waWNOdW0pCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBiYXNlZCBvbgorICAgICAgICAgICAgcmVvcmRlcmluZyBjb21tYW5kcyByZWNlaXZlZCBpbiB0aGUgc2xpY2UgaGVhZGVyLiBTZWUgZGV0YWlscworICAgICAgICAgICAgb2YgdGhlIHByb2Nlc3MgaW4gdGhlIEguMjY0IHN0YW5kYXJkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgICAgICBwb2ludGVyIHRvIGRwYiBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgb3JkZXIgICAgICAgICAgIHBvaW50ZXIgdG8gcmVvcmRlcmluZyBjb21tYW5kcworICAgICAgICAgICAgY3VyckZyYW1lTnVtICAgIGN1cnJlbnQgZnJhbWUgbnVtYmVyCisgICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgICdsaXN0JyBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHJlb3JkZXJlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpZiBub24tZXhpc3RpbmcgcGljdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKKyAgdTMyIGN1cnJGcmFtZU51bSwKKyAgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgaywgcGljTnVtUHJlZCwgcmVmSWR4OworICAgIGkzMiBwaWNOdW0sIHBpY051bU5vV3JhcCwgaW5kZXg7CisgICAgdTMyIGlzU2hvcnRUZXJtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQob3JkZXIpOworICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPD0gZHBiLT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSA8PSBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFKTsKKworICAgIC8qIHNldCBkcGIgcGljdHVyZSBudW1iZXJzIGZvciBzb3J0aW5nICovCisgICAgU2V0UGljTnVtcyhkcGIsIGN1cnJGcmFtZU51bSk7CisKKyAgICBpZiAoIW9yZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisKKyAgICByZWZJZHggICAgID0gMDsKKyAgICBwaWNOdW1QcmVkID0gY3VyckZyYW1lTnVtOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPCAzKQorICAgIHsKKyAgICAgICAgLyogc2hvcnQgdGVybSAqLworICAgICAgICBpZiAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNOdW1QcmVkIC0gKGkzMilvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtOworICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPCAwKQorICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgKz0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCA9CisgICAgICAgICAgICAgICAgICAgIChpMzIpKHBpY051bVByZWQgKyBvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtKTsKKyAgICAgICAgICAgICAgICBpZiAocGljTnVtTm9XcmFwID49IChpMzIpZHBiLT5tYXhGcmFtZU51bSkKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwIC09IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpY051bVByZWQgPSAodTMyKXBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIHBpY051bSA9IHBpY051bU5vV3JhcDsKKyAgICAgICAgICAgIGlmICgodTMyKXBpY051bU5vV3JhcCA+IGN1cnJGcmFtZU51bSkKKyAgICAgICAgICAgICAgICBwaWNOdW0gLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICAvKiBsb25nIHRlcm0gKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwaWNOdW0gPSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtOworICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICAvKiBmaW5kIGNvcnJlc3BvbmRpbmcgcGljdHVyZSBmcm9tIGRwYiAqLworICAgICAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIGlzU2hvcnRUZXJtKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCAhSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAvKiBzaGlmdCBwaWN0dXJlcyAqLworICAgICAgICBmb3IgKGogPSBudW1SZWZJZHhBY3RpdmU7IGogPiByZWZJZHg7IGotLSkKKyAgICAgICAgICAgIGRwYi0+bGlzdFtqXSA9IGRwYi0+bGlzdFtqLTFdOworICAgICAgICAvKiBwdXQgcGljdHVyZSBpbnRvIHRoZSBsaXN0ICovCisgICAgICAgIGRwYi0+bGlzdFtyZWZJZHgrK10gPSAmZHBiLT5idWZmZXJbaW5kZXhdOworICAgICAgICAvKiByZW1vdmUgbGF0ZXIgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaiA9IGsgPSByZWZJZHg7IGogPD0gbnVtUmVmSWR4QWN0aXZlOyBqKyspCisgICAgICAgICAgICBpZihkcGItPmxpc3Rbal0gIT0gJmRwYi0+YnVmZmVyW2luZGV4XSkKKyAgICAgICAgICAgICAgICBkcGItPmxpc3RbaysrXSA9IGRwYi0+bGlzdFtqXTsKKworICAgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgdW51c2VkIGZvcgorICAgICAgICAgICAgcmVmZXJlbmNlLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAxCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGJ1ZmZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOworCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOworICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCisgICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDIKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGluZGV4OworCisvKiBDb2RlICovCisKKyAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCAoaTMyKWxvbmdUZXJtUGljTnVtLCBIQU5UUk9fRkFMU0UpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICBkcGItPm51bVJlZkZyYW1lcy0tOworICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3AzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2luZyBhIGxvbmdUZXJtRnJhbWVJZHggdG8gYSBzaG9ydC10ZXJtIHJlZmVyZW5jZQorICAgICAgICAgICAgZnJhbWUgKGkuZS4gdG8gY2hhbmdlIGl0IHRvIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlKSwKKyAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDMKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgc2hvcnQtdGVybSBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG9yIGlzIGEgbm9uLWV4aXN0aW5nIHBpY3R1cmUsIG9yIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtRnJhbWVJZHggZ2l2ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgaW5kZXgsIHBpY051bTsKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisgICAgQVNTRVJUKGN1cnJQaWNOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKKyAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKKyAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQorICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOworCisgICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICghSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZHBiLT5idWZmZXJbaW5kZXhdLnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICBkcGItPmJ1ZmZlcltpbmRleF0ucGljTnVtID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IG1heExvbmdUZXJtRnJhbWVJZHgsCisgICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA0CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBtYXhMb25nVGVybUZyYW1lSWR4OworCisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCisgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgKCAoKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPiBtYXhMb25nVGVybUZyYW1lSWR4KSB8fAorICAgICAgICAgICAgKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3A1CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYWxsIHJlZmVyZW5jZSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBhbmQKKyAgICAgICAgICAgIHNldCBtYXhMb25nVGVybUZyYW1lSWR4IHRvIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNS4gRnVuY3Rpb24gZmx1c2hlcworICAgICAgICAgICAgdGhlIGJ1ZmZlciBhbmQgcGxhY2VzIGFsbCBwaWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGRpc3BsYXkgaW50bworICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKElTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltpXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG91dHB1dCBhbGwgcGljdHVyZXMgKi8KKyAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgOworICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMDsKKyAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9IDA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wNgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBhc3NpZ24gbG9uZ1Rlcm1GcmFtZUlkeCB0byB0aGUgY3VycmVudCBwaWN0dXJlLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGxvbmdUZXJtRnJhbWVJZHggb3Igbm8gcm9vbSBmb3IgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpIHx8CisgICAgICAgICAobG9uZ1Rlcm1GcmFtZUlkeCA+IGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCkgKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBjaGVjayBpZiBhIGxvbmcgdGVybSBwaWN0dXJlIHdpdGggdGhlIHNhbWUgbG9uZ1Rlcm1GcmFtZUlkeCBhbHJlYWR5CisgICAgICogZXhpc3QgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKKyAgICAgICAgICAodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBsb25nVGVybUZyYW1lSWR4KQorICAgICAgICB7CisgICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQorICAgIHsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilsb25nVGVybUZyYW1lSWR4OworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBMT05HX1RFUk07CisgICAgICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20sIHJldHVybiBhbiBlcnJvciAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE1hcmtEZWNSZWZQaWMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuIFRoaXMKKyAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYm90aCBmb3IgcmVmZXJlbmNlIGFuZCBub24tcmVmZXJlbmNlCisgICAgICAgICAgICBwaWN0dXJlcy4gIE5vbi1yZWZlcmVuY2UgcGljdHVyZXMgc2hhbGwgaGF2ZSBtYXJrIHBvaW50ZXIgc2V0IHRvCisgICAgICAgICAgICBOVUxMLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIERQQiBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbWFyayAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGNvbW1hbmRzCisgICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcGljdHVyZSB0byBiZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgZnJhbWVOdW0gICAgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIHBpY09yZGVyQ250IHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUKKyAgICAgICAgICAgIGlzSWRyICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgcGljdHVyZSBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUKKyAgICAgICAgICAgIGN1cnJlbnRQaWNJZCAgICBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBwaWN0dXJlLCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorICAgICAgICAgICAgbnVtRXJyTWJzICAgICAgIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBtb2RpZmllZCwgcG9zc2libGUgb3V0cHV0IGZyYW1lcyBwbGFjZWQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgJ291dEJ1ZicKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgZmFpbHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCisgIGltYWdlX3QgKmltYWdlLAorICB1MzIgZnJhbWVOdW0sCisgIGkzMiBwaWNPcmRlckNudCwKKyAgdTMyIGlzSWRyLAorICB1MzIgY3VycmVudFBpY0lkLAorICB1MzIgbnVtRXJyTWJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBzdGF0dXM7CisgICAgdTMyIG1hcmtlZEFzTG9uZ1Rlcm07CisgICAgdTMyIHRvQmVEaXNwbGF5ZWQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChtYXJrIHx8ICFpc0lkcik7CisgICAgQVNTRVJUKCFpc0lkciB8fCAoZnJhbWVOdW0gPT0gMCAmJiBwaWNPcmRlckNudCA9PSAwKSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBpZiAoaW1hZ2UtPmRhdGEgIT0gZHBiLT5jdXJyZW50T3V0LT5kYXRhKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJUUllJTkcgVE8gTUFSSyBOT04tQUxMT0NBVEVEIElNQUdFIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIHN0YXR1cyA9IEhBTlRST19PSzsKKworICAgIHRvQmVEaXNwbGF5ZWQgPSBkcGItPm5vUmVvcmRlcmluZyA/IEhBTlRST19GQUxTRSA6IEhBTlRST19UUlVFOworCisgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBzdG9yZWQgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3NlcyAqLworICAgIGlmIChtYXJrID09IE5VTEwpCisgICAgeworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFVOVVNFRDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSA9IChpMzIpZnJhbWVOdW07CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKKyAgICAgICAgaWYgKCFkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKKyAgICB9CisgICAgLyogSURSIHBpY3R1cmUgKi8KKyAgICBlbHNlIGlmIChpc0lkcikKKyAgICB7CisKKyAgICAgICAgLyogaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gbm90IGNhbGxlZCBmb3IgSURSIHBpY3R1cmVzIC0+IGhhdmUgdG8KKyAgICAgICAgICogcmVzZXQgbnVtT3V0IGFuZCBvdXRJbmRleCBoZXJlICovCisgICAgICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciAqLworICAgICAgICBNbWNvcDUoZHBiKTsKKyAgICAgICAgLyogaWYgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgd2FzIHNldCAtPiB0aGUgcGljdHVyZXMgcHJlY2VkaW5nIHRoZQorICAgICAgICAgKiBJRFIgcGljdHVyZSBzaGFsbCBub3QgYmUgb3V0cHV0IC0+IHNldCBvdXRwdXQgYnVmZmVyIGVtcHR5ICovCisgICAgICAgIGlmIChtYXJrLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyB8fCBkcGItPm5vUmVvcmRlcmluZykKKyAgICAgICAgeworICAgICAgICAgICAgZHBiLT5udW1PdXQgPSAwOworICAgICAgICAgICAgZHBiLT5vdXRJbmRleCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFyay0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IExPTkdfVEVSTTsKKyAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFNIT1JUX1RFUk07CisgICAgICAgICAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKKyAgICAgICAgfQorICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtICA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgID0gMDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IDA7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgIGRwYi0+ZnVsbG5lc3MgPSAxOworICAgICAgICBkcGItPm51bVJlZkZyYW1lcyA9IDE7CisgICAgfQorICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgaWYgKG1hcmstPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDEoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMihkcGIsIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAgTW1jb3AzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5tYXhMb25nVGVybUZyYW1lSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNShkcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5sYXN0Q29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A2KAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogaW52YWxpZCBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGIpOworICAgICAgICB9CisgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSB3YXMgbm90IG1hcmtlZCBhcyBsb25nLXRlcm0gcmVmZXJlbmNlIGJ5CisgICAgICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uIDYgLT4gbWFyayBjdXJyZW50IGFzIHNob3J0CisgICAgICAgICAqIHRlcm0gYW5kIGluc2VydCBpdCBpbnRvIGRwYiAoaWYgdGhlcmUgaXMgcm9vbSkgKi8KKyAgICAgICAgaWYgKCFtYXJrZWRBc0xvbmdUZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICA9IChpMzIpZnJhbWVOdW07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBTSE9SVF9URVJNOworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7CisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBubyByb29tICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRwYi0+Y3VycmVudE91dC0+aXNJZHIgPSBpc0lkcjsKKyAgICBkcGItPmN1cnJlbnRPdXQtPnBpY0lkID0gY3VycmVudFBpY0lkOworICAgIGRwYi0+Y3VycmVudE91dC0+bnVtRXJyTWJzID0gbnVtRXJyTWJzOworCisgICAgLyogZHBiIHdhcyBpbml0aWFsaXplZCB0byBub3QgdG8gcmVvcmRlciB0aGUgcGljdHVyZXMgLT4gb3V0cHV0IGN1cnJlbnQKKyAgICAgKiBwaWN0dXJlIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGRwYi0+bnVtT3V0ID09IDApOworICAgICAgICBBU1NFUlQoZHBiLT5vdXRJbmRleCA9PSAwKTsKKyAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmRhdGEgID0gZHBiLT5jdXJyZW50T3V0LT5kYXRhOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSBkcGItPmN1cnJlbnRPdXQtPmlzSWRyOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSBkcGItPmN1cnJlbnRPdXQtPnBpY0lkOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ubnVtRXJyTWJzID0gZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnM7CisgICAgICAgIGRwYi0+bnVtT3V0Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG91dHB1dCBwaWN0dXJlcyBpZiBidWZmZXIgZnVsbCAqLworICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+IGRwYi0+ZHBiU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IE91dHB1dFBpY3R1cmUoZHBiKTsKKyAgICAgICAgICAgIEFTU0VSVChpID09IEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzb3J0IGRwYiAqLworICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOworCisgICAgcmV0dXJuKHN0YXR1cyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0UmVmUGljRGF0YQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YSBmcm9tIHRoZSByZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgbGlzdAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIGRlc2lyZWQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YQorICAgICAgICAgICAgTlVMTCBpZiBpbnZhbGlkIGluZGV4IG9yIG5vbi1leGlzdGluZyBwaWN0dXJlIHJlZmVycmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgaWYoaW5kZXggPiAxNiB8fCBkcGItPmxpc3RbaW5kZXhdID09IE5VTEwpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlIGlmKCFJU19FWElTVElORygqZHBiLT5saXN0W2luZGV4XSkpCisgICAgICAgIHJldHVybihOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihkcGItPmxpc3RbaW5kZXhdLT5kYXRhKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBpbWFnZS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgcmVhbGx5IGFsbG9jYXRlIGFueSBtZW1vcnkgYnV0IHJlc2VydmVzIG9uZSBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICBwb3NpdGlvbnMgZm9yIGRlY29kaW5nIG9mIGN1cnJlbnQgcGljdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG1lbW9yeSBhcmVhIGZvciB0aGUgaW1hZ2UKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICFJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXSkgKTsKKyAgICBBU1NFUlQoZHBiLT5mdWxsbmVzcyA8PSAgZHBiLT5kcGJTaXplKTsKKworICAgIGRwYi0+Y3VycmVudE91dCA9IGRwYi0+YnVmZmVyICsgZHBiLT5kcGJTaXplOworCisgICAgcmV0dXJuKGRwYi0+Y3VycmVudE91dC0+ZGF0YSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHNsaWRpbmcgd2luZG93IHJlZmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIG5vIHNob3J0LXRlcm0gcmVmZXJlbmNlIGZyYW1lIGZvdW5kIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIG1hcmtlZCB1bnVzZWQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9IC0xOworICAgICAgICBwaWNOdW0gPSAwOworICAgICAgICAvKiBmaW5kIHRoZSBvbGRlc3Qgc2hvcnQgdGVybSBwaWN0dXJlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQorICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5waWNOdW0gPCBwaWNOdW0gfHwgaW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChpMzIpaTsKKyAgICAgICAgICAgICAgICAgICAgcGljTnVtID0gZHBiLT5idWZmZXJbaV0ucGljTnVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKKyAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIERQQi4gUmVzZXJ2ZXMgbWVtb3JpZXMgZm9yIHRoZSBidWZmZXIsCisgICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSBsaXN0IGFuZCBvdXRwdXQgYnVmZmVyLiBkcGJTaXplIGluZGljYXRlcworICAgICAgICAgICAgdGhlIG1heGltdW0gRFBCIHNpemUgaW5kaWNhdGVkIGJ5IHRoZSBsZXZlbElkYyBpbiB0aGUgc3RyZWFtLgorICAgICAgICAgICAgSWYgbm9SZW9yZGVyaW5nIGZsYWcgaXMgRkFMU0UgdGhlIERQQiBzdG9yZXMgZHBiU2l6ZSBwaWN0dXJlcworICAgICAgICAgICAgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3Nlcy4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAgICAgICAgZmxhZyBpcyBUUlVFIHRoZSBEUEIgb25seSBzdG9yZXMgbWF4UmVmRnJhbWVzIHJlZmVyZW5jZSBwaWN0dXJlcworICAgICAgICAgICAgYW5kIG91dHB1dHMgYWxsIHRoZSBwaWN0dXJlcyBpbW1lZGlhdGVseS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBkcGJTaXplICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIChudW1iZXIgb2YgcGljdHVyZXMpCisgICAgICAgICAgICBtYXhSZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzCisgICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlcgorICAgICAgICAgICAgbm9SZW9yZGVyaW5nICAgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBEUEIgZG9lcyBub3QgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmUgdG8gcmVvcmRlciBmcmFtZXMgZm9yIGRpc3BsYXkKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RvcmFnZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbWF4UmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gTUFYX05VTV9SRUZfUElDUyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBkcGJTaXplKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChkcGJTaXplKTsKKworICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgIGRwYi0+bWF4UmVmRnJhbWVzICAgICAgICA9IE1BWChtYXhSZWZGcmFtZXMsIDEpOworICAgIGlmIChub1Jlb3JkZXJpbmcpCisgICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiLT5tYXhSZWZGcmFtZXM7CisgICAgZWxzZQorICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYlNpemU7CisgICAgZHBiLT5tYXhGcmFtZU51bSAgICAgICAgID0gbWF4RnJhbWVOdW07CisgICAgZHBiLT5ub1Jlb3JkZXJpbmcgICAgICAgID0gbm9SZW9yZGVyaW5nOworICAgIGRwYi0+ZnVsbG5lc3MgICAgICAgICAgICA9IDA7CisgICAgZHBiLT5udW1SZWZGcmFtZXMgICAgICAgID0gMDsKKyAgICBkcGItPnByZXZSZWZGcmFtZU51bSAgICAgPSAwOworCisgICAgQUxMT0NBVEUoZHBiLT5idWZmZXIsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QpOworICAgIGlmIChkcGItPmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIEgyNjRTd0RlY01lbXNldChkcGItPmJ1ZmZlciwgMCwKKyAgICAgICAgICAgIChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkqc2l6ZW9mKGRwYlBpY3R1cmVfdCkpOworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUgKyAxOyBpKyspCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgYW1vdW50IG9mIG1lbW9yeSwgd2hpY2ggaXM6CisgICAgICAgICAqIGltYWdlIHNpemUgKyAzMiArIDE1LCB3aGVyZSAzMiBjYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaW4gQVJNIE9wZW5NYXgKKyAgICAgICAgICogREwgaW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIG1heSByZWFkIGJleW9uZCB0aGUgZW5kIG9mIGFuIGFycmF5LAorICAgICAgICAgKiBieSBhIG1heGltdW0gb2YgMzIgYnl0ZXMuIEFuZCArMTUgY2FtZXMgZm9yIHRoZSBuZWVkIHRvIGFsaWduIG1lbW9yeQorICAgICAgICAgKiB0byAxNi1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAocGljU2l6ZUluTWJzKjM4NCArIDMyKzE1KSwgdTgpOworICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9IEFMSUdOKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAxNik7CisgICAgfQorCisgICAgQUxMT0NBVEUoZHBiLT5saXN0LCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90Kik7CisgICAgQUxMT0NBVEUoZHBiLT5vdXRCdWYsIGRwYi0+ZHBiU2l6ZSsxLCBkcGJPdXRQaWN0dXJlX3QpOworCisgICAgaWYgKGRwYi0+bGlzdCA9PSBOVUxMIHx8IGRwYi0+b3V0QnVmID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5saXN0LCAwLAorICAgICAgICAgICAgKChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkgKiBzaXplb2YoZHBiUGljdHVyZV90KikpICk7CisKKyAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXREcGIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcmVzZXQgRFBCLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBJRFIKKyAgICAgICAgICAgIHNsaWNlIChvdGhlciB0aGFuIHRoZSBmaXJzdCkgYWN0aXZhdGVzIG5ldyBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0LgorICAgICAgICAgICAgRnVuY3Rpb24gY2FsbHMgaDI2NGJzZEZyZWVEcGIgdG8gZnJlZSBvbGQgYWxsb2NhdGVkIG1lbW9yaWVzIGFuZAorICAgICAgICAgICAgaDI2NGJzZEluaXREcGIgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgRFBCLiBTYW1lIGlucHV0cywgb3V0cHV0cyBhbmQKKyAgICAgICAgICAgIHJldHVybnMgYXMgZm9yIGgyNjRic2RJbml0RHBiLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFJlc2V0RHBiKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgdTMyIHBpY1NpemVJbk1icywKKyAgdTMyIGRwYlNpemUsCisgIHUzMiBtYXhSZWZGcmFtZXMsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyIG5vUmVvcmRlcmluZykKK3sKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKKyAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGRwYlNpemUpOworCisgICAgaDI2NGJzZEZyZWVEcGIoZHBiKTsKKworICAgIHJldHVybiBoMjY0YnNkSW5pdERwYihkcGIsIHBpY1NpemVJbk1icywgZHBiU2l6ZSwgbWF4UmVmRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGcmFtZU51bSwgbm9SZW9yZGVyaW5nKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0LiBGdW5jdGlvbiBqdXN0CisgICAgICAgICAgICBzZXRzIHBvaW50ZXJzIGluIHRoZSBsaXN0IGFjY29yZGluZyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gcGljdHVyZXMgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICAgICAgd2hhdCB0aGUgSC4yNjQgc3RhbmRhcmQgc2F5cyBhYm91dCBpbml0aWFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICdsaXN0JyBmaWVsZCBpbml0aWFsaXplZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgZHBiLT5saXN0W2ldID0gJmRwYi0+YnVmZmVyW2ldOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZERwYlBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIGEgcmVmZXJlbmNlIHBpY3R1cmUgZnJvbSB0aGUgYnVmZmVyLiBUaGUgcGljdHVyZQorICAgICAgICAgICAgdG8gYmUgZm91bmQgaXMgaWRlbnRpZmllZCBieSBwaWNOdW0gYW5kIGlzU2hvcnRUZXJtIGZsYWcuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwaWN0dXJlIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgIC0xIGlmIHRoZSBzcGVjaWZpZWQgcGljdHVyZSB3YXMgbm90IGZvdW5kIGluIHRoZSBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGkgPSAwOworICAgIHUzMiBmb3VuZCA9IEhBTlRST19GQUxTRTsKKworLyogQ29kZSAqLworCisgICAgaWYgKGlzU2hvcnRUZXJtKQorICAgIHsKKyAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFTU0VSVChwaWNOdW0gPj0gMCk7CisgICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQorICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKQorICAgICAgICByZXR1cm4oKGkzMilpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigtMSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTZXRQaWNOdW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBwaWNOdW0gdmFsdWVzIGZvciBzaG9ydC10ZXJtIHBpY3R1cmVzIGluIHRoZQorICAgICAgICAgICAgYnVmZmVyLiBOdW1iZXJpbmcgb2YgcGljdHVyZXMgaXMgYmFzZWQgb24gZnJhbWUgbnVtYmVycyBhbmQgYXMKKyAgICAgICAgICAgIGZyYW1lIG51bWJlcnMgYXJlIG1vZHVsbyBtYXhGcmFtZU51bSAtPiBmcmFtZSBudW1iZXJzIG9mIG9sZGVyCisgICAgICAgICAgICBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgY3VyckZyYW1lTnVtLgorICAgICAgICAgICAgcGljTnVtcyB3aWxsIGJlIHNldCBzbyB0aGF0IGN1cnJlbnQgZnJhbWUgaGFzIHRoZSBsYXJnZXN0IHBpY051bQorICAgICAgICAgICAgYW5kIGFsbCB0aGUgc2hvcnQtdGVybSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldCBzbWFsbGVyIHBpY051bQorICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZWlyICJkaXN0YW5jZSIgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24ga2luZCBvZiBtYXBzIHRoZSBtb2R1bG8gYXJpdGhtZXRpYyBiYWNrIHRvIG5vcm1hbC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgZnJhbWVOdW1XcmFwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKyAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gPiBjdXJyRnJhbWVOdW0pCisgICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSAtIChpMzIpZHBiLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPSAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtOworICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID0gZnJhbWVOdW1XcmFwOworICAgICAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjaGVjayBnYXBzIGluIGZyYW1lX251bSBhbmQgZ2VuZXJhdGUgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAoc2hvcnQgdGVybSkgcmVmZXJlbmNlIHBpY3R1cmVzIGlmIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAgICAgICAgICAgIGJlIGNhbGxlZCBvbmx5IGZvciBub24tSURSIHBpY3R1cmVzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQorICAgICAgICAgICAgaXNSZWZQaWMgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IHBpY3R1cmUgaXMgYSByZWZlcmVuY2Ugb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWZlcmVuY2UgcGljdHVyZQorICAgICAgICAgICAgZ2Fwc0FsbG93ZWQgRmxhZyB3aGljaCBpbmRpY2F0ZXMgYWN0aXZlIFNQUyBzdGFuY2Ugb24gd2hldGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgZ2FwcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBwb3NzaWJseSBtb2RpZmllZCBieSBpbnNlcnRpbmcgbm9uLWV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlcyB3aXRoIHNsaWRpbmcgd2luZG93IG1hcmtpbmcgcHJvY2VzcworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICBlcnJvciBpbiBzbGlkaW5nIHdpbmRvdyByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSBlcXVhbCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOworICAgIHU4ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9IGRwYi0+ZHBiU2l6ZSk7CisgICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBkcGItPm51bU91dCA9IDA7CisgICAgZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICBpZighZ2Fwc0FsbG93ZWQpCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworCisgICAgaWYgKCAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pICYmCisgICAgICAgICAoZnJhbWVOdW0gIT0gKChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bSkpKQorICAgIHsKKworICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICAvKiBzdG9yZSBkYXRhIHBvaW50ZXIgb2YgbGFzdCBidWZmZXIgcG9zaXRpb24gdG8gYmUgdXNlZCBhcyBuZXh0CisgICAgICAgICAqICJhbGxvY2F0ZWQiIGRhdGEgcG9pbnRlciBpZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiBhZnRlciB0aGlzIHByb2Nlc3MKKyAgICAgICAgICogY29udGFpbnMgZGF0YSBwb2ludGVyIGxvY2F0ZWQgaW4gb3V0QnVmIChidWZmZXIgcGxhY2VkIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICogc2hhbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjdXJyZW50IHBpY3R1cmUpICovCisgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgU2V0UGljTnVtcyhkcGIsIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtKTsKKworICAgICAgICAgICAgaWYgKFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCisgICAgICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+PSBkcGItPmRwYlNpemUpCisgICAgICAgICAgICB7CisjaWZkZWYgX0FTU0VSVF9VU0VECisgICAgICAgICAgICAgICAgQVNTRVJUKCFkcGItPm5vUmVvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgQVNTRVJUKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spOworI2Vsc2UKKyAgICAgICAgICAgICAgICBPdXRwdXRQaWN0dXJlKGRwYik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYWRkIHRvIGVuZCBvZiBsaXN0ICovCisgICAgICAgICAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5zdGF0dXMgPSBOT05fRVhJU1RJTkc7CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmZyYW1lTnVtID0gdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY051bSAgID0gKGkzMil1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKyAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKKworICAgICAgICAgICAgLyogc29ydCB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKKworICAgICAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKyAxKSAlCisgICAgICAgICAgICAgICAgZHBiLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAhPSBmcmFtZU51bSk7CisKKyAgICAgICAgLyogcGljdHVyZXMgcGxhY2VkIGluIG91dHB1dCBidWZmZXIgLT4gY2hlY2sgdGhhdCAnZGF0YScgaW4KKyAgICAgICAgICogYnVmZmVyIHBvc2l0aW9uIGRwYlNpemUgaXMgbm90IGluIHRoZSBvdXRwdXQgYnVmZmVyICh0aGlzIHdpbGwgYmUKKyAgICAgICAgICogImFsbG9jYXRlZCIgYnkgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UpLiBJZiBpdCBpcyAtPiBleGNoYW5nZSBkYXRhCisgICAgICAgICAqIHBvaW50ZXIgd2l0aCB0aGUgb25lIHN0b3JlZCBpbiB0aGUgYmVnaW5uaW5nICovCisgICAgICAgIGlmIChkcGItPm51bU91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bU91dDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkcGItPm91dEJ1ZltpXS5kYXRhID09IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgYnVmZmVyIHBvc2l0aW9uIGNvbnRhaW5pbmcgZGF0YSBwb2ludGVyIHN0b3JlZCBpbgorICAgICAgICAgICAgICAgICAgICAgKiB0bXAgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZGF0YSA9PSB0bXApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGkgPCBkcGItPmRwYlNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZnJhbWVOdW0gZm9yIHJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBub3QgYmUgdGhlIHNhbWUgYXMgZm9yIHByZXZpb3VzCisgICAgICogcmVmZXJlbmNlIHBpY3R1cmUsIG90aGVyd2lzZSBhY2Nlc3NlcyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGNhbm5vdAorICAgICAqIGJlIHNvbHZlZCB1bmFtYmlndW91c2x5ICovCisgICAgZWxzZSBpZiAoaXNSZWZQaWMgJiYgZnJhbWVOdW0gPT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogc2F2ZSBjdXJyZW50IGZyYW1lX251bSBpbiBwcmV2UmVmRnJhbWVOdW0uIEZvciBub24tcmVmZXJlbmNlIGZyYW1lCisgICAgICogcHJldkZyYW1lTnVtIGlzIHNldCB0byBmcmFtZSBudW1iZXIgb2YgbGFzdCBub24tZXhpc3RpbmcgZnJhbWUgYWJvdmUgKi8KKyAgICBpZiAoaXNSZWZQaWMpCisgICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgZWxzZSBpZiAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCisgICAgeworICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9CisgICAgICAgICAgICAoZnJhbWVOdW0gKyBkcGItPm1heEZyYW1lTnVtIC0gMSkgJSBkcGItPm1heEZyYW1lTnVtOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBwaWN0dXJlIHdpdGggc21hbGxlc3QgcGljdHVyZSBvcmRlciBjb3VudC4gVGhpcworICAgICAgICAgICAgd2lsbCBiZSB0aGUgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2RwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIGRwYlBpY3R1cmVfdCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIHBpY09yZGVyQ250ID0gMHg3RkZGRkZGRjsKKyAgICB0bXAgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8PSBkcGItPmRwYlNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkICYmCisgICAgICAgICAgICAoZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQgPCBwaWNPcmRlckNudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyICsgaTsKKyAgICAgICAgICAgIHBpY09yZGVyQ250ID0gZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4odG1wKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gcHV0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG5vIHBpY3R1cmVzIHRvIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgZHBiUGljdHVyZV90ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGIpOworCisgICAgLyogbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkICovCisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSB0bXAtPmRhdGE7CisgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gdG1wLT5pc0lkcjsKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSB0bXAtPnBpY0lkOworICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSB0bXAtPm51bUVyck1iczsKKyAgICBkcGItPm51bU91dCsrOworCisgICAgdG1wLT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgIGlmICghSVNfUkVGRVJFTkNFKCp0bXApKQorICAgIHsKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGZyb20gdGhlIG91dHB1dCBidWZmZXIuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgcGljdHVyZSBzdHJ1Y3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8KKyAgICAgICAgICAgIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+b3V0SW5kZXggPCBkcGItPm51bU91dCkKKyAgICAgICAgcmV0dXJuKGRwYi0+b3V0QnVmICsgZHBiLT5vdXRJbmRleCsrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmbHVzaCB0aGUgRFBCLiBGdW5jdGlvbiBwdXRzIGFsbCBwaWN0dXJlcyBuZWVkZWQgZm9yCisgICAgICAgICAgICBkaXNwbGF5IGludG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgY2FsbGVkIGluCisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdG8gb2J0YWluIHBpY3R1cmVzIGJ1ZmZlcmVkIGZvciBkaXNwbGF5CisgICAgICAgICAgICByZS1vcmRlcmluZyBwdXJwb3Nlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKyAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBidWZmZXIgbm90IHJlc2VydmVkICovCisgICAgaWYgKGRwYi0+YnVmZmVyKQorICAgIHsKKyAgICAgICAgZHBiLT5mbHVzaGVkID0gMTsKKyAgICAgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLworICAgICAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKKyAgICAgICAgICAgIDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRnJlZURwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmcmVlIG1lbW9yaWVzIHJlc2VydmVkIGZvciB0aGUgRFBCLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKworICAgIGlmIChkcGItPmJ1ZmZlcikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUrMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGUkVFKGRwYi0+YnVmZmVyKTsKKyAgICBGUkVFKGRwYi0+bGlzdCk7CisgICAgRlJFRShkcGItPm91dEJ1Zik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBTaGVsbFNvcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU29ydCBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLiBGdW5jdGlvbiBpbXBsZW1lbnRzIFNoZWxsJ3MgbWV0aG9kLAorICAgICAgICAgICAgaS5lLiBkaW1pbmlzaGluZyBpbmNyZW1lbnQgc29ydC4gU2VlIGUuZy4gIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiCisgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSkKK3sKKworICAgIHUzMiBpLCBqOworICAgIHUzMiBzdGVwOworICAgIGRwYlBpY3R1cmVfdCB0bXBQaWM7CisKKyAgICBzdGVwID0gNzsKKworICAgIHdoaWxlIChzdGVwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IG51bTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXBQaWMgPSBwUGljW2ldOworICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICB3aGlsZSAoaiA+PSBzdGVwICYmIENvbXBhcmVQaWN0dXJlcyhwUGljICsgaiAtIHN0ZXAsICZ0bXBQaWMpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUGljW2pdID0gcFBpY1tqLXN0ZXBdOworICAgICAgICAgICAgICAgIGogLT0gc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBQaWNbal0gPSB0bXBQaWM7CisgICAgICAgIH0KKyAgICAgICAgc3RlcCA+Pj0gMTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlMjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfRFBCX0gKKyNkZWZpbmUgSDI2NFNXREVDX0RQQl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgc3RhdHVzIG9mIGJ1ZmZlcmVkIGltYWdlICovCit0eXBlZGVmIGVudW0geworICAgIFVOVVNFRCA9IDAsCisgICAgTk9OX0VYSVNUSU5HLAorICAgIFNIT1JUX1RFUk0sCisgICAgTE9OR19URVJNCit9IGRwYlBpY3R1cmVTdGF0dXNfZTsKKworLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGJ1ZmZlcmVkIHBpY3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1OCAqZGF0YTsgICAgICAgICAgIC8qIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyIG9mIHBBbGxvY2F0ZWREYXRhICovCisgICAgdTggKnBBbGxvY2F0ZWREYXRhOyAvKiBhbGxvY2F0ZWQgcGljdHVyZSBwb2ludGVyOyAoc2l6ZSArIDE1KSBieXRlcyAqLworICAgIGkzMiBwaWNOdW07CisgICAgdTMyIGZyYW1lTnVtOworICAgIGkzMiBwaWNPcmRlckNudDsKKyAgICBkcGJQaWN0dXJlU3RhdHVzX2Ugc3RhdHVzOworICAgIHUzMiB0b0JlRGlzcGxheWVkOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiUGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGRpc3BsYXkgaW1hZ2Ugb3V0cHV0IGZyb20gdGhlIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4ICpkYXRhOworICAgIHUzMiBwaWNJZDsKKyAgICB1MzIgbnVtRXJyTWJzOworICAgIHUzMiBpc0lkcjsKK30gZHBiT3V0UGljdHVyZV90OworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IERQQiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRwYlBpY3R1cmVfdCAqYnVmZmVyOworICAgIGRwYlBpY3R1cmVfdCAqKmxpc3Q7CisgICAgZHBiUGljdHVyZV90ICpjdXJyZW50T3V0OworICAgIGRwYk91dFBpY3R1cmVfdCAqb3V0QnVmOworICAgIHUzMiBudW1PdXQ7CisgICAgdTMyIG91dEluZGV4OworICAgIHUzMiBtYXhSZWZGcmFtZXM7CisgICAgdTMyIGRwYlNpemU7CisgICAgdTMyIG1heEZyYW1lTnVtOworICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OworICAgIHUzMiBudW1SZWZGcmFtZXM7CisgICAgdTMyIGZ1bGxuZXNzOworICAgIHUzMiBwcmV2UmVmRnJhbWVOdW07CisgICAgdTMyIGxhc3RDb250YWluc01tY281OworICAgIHUzMiBub1Jlb3JkZXJpbmc7CisgICAgdTMyIGZsdXNoZWQ7Cit9IGRwYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEluaXREcGIoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICB1MzIgcGljU2l6ZUluTWJzLAorICB1MzIgZHBiU2l6ZSwKKyAgdTMyIG51bVJlZkZyYW1lcywKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgbm9SZW9yZGVyaW5nKTsKKwordTMyIGgyNjRic2RSZXNldERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbnVtUmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpOworCit2b2lkIGgyNjRic2RJbml0UmVmUGljTGlzdChkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYik7CisKK3U4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KTsKKwordTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAorICB1MzIgY3VyckZyYW1lTnVtLAorICB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKKwordTMyIGgyNjRic2RNYXJrRGVjUmVmUGljKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgZGVjUmVmUGljTWFya2luZ190ICptYXJrLAorICBpbWFnZV90ICppbWFnZSwKKyAgdTMyIGZyYW1lTnVtLAorICBpMzIgcGljT3JkZXJDbnQsCisgIHUzMiBpc0lkciwKKyAgdTMyIHBpY0lkLAorICB1MzIgbnVtRXJyTWJzKTsKKwordTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpOworCitkcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKwordm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpOworCit2b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfRFBCX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjkyODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisgICAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbXTsKK2V4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVtdOworCisvKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLworZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKKyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordm9pZCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgd2lkdGg7CisgICAgdTMyICpsdW0sICpjYiwgKmNyOworICAgIHUzMiAqcHRyOworICAgIHUzMiB0bXAxLCB0bXAyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoISgodTMyKWRhdGEmMHgzKSk7CisKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKKworICAgIC8qbGludCAtc2F2ZSAtZTgyNiBsdW0sIGNiIGFuZCBjciB1c2VkIHRvIGNvcHkgNCBieXRlcyBhdCB0aGUgdGltZSwgZGlzYWJsZQorICAgICAqICJhcmVhIHRvbyBzbWFsbCIgaW5mbyBtZXNzYWdlICovCisgICAgbHVtID0gKHUzMiopaW1hZ2UtPmx1bWE7CisgICAgY2IgPSAodTMyKilpbWFnZS0+Y2I7CisgICAgY3IgPSAodTMyKilpbWFnZS0+Y3I7CisgICAgQVNTRVJUKCEoKHUzMilsdW0mMHgzKSk7CisgICAgQVNTRVJUKCEoKHUzMiljYiYweDMpKTsKKyAgICBBU1NFUlQoISgodTMyKWNyJjB4MykpOworCisgICAgcHRyID0gKHUzMiopZGF0YTsKKworICAgIHdpZHRoICo9IDQ7CisgICAgZm9yIChpID0gMTY7IGkgOyBpLS0pCisgICAgeworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqbHVtKysgPSB0bXAxOworICAgICAgICAqbHVtKysgPSB0bXAyOworICAgICAgICBsdW0gKz0gd2lkdGgtNDsKKyAgICB9CisKKyAgICB3aWR0aCA+Pj0gMTsKKyAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwdHIrKzsKKyAgICAgICAgdG1wMiA9ICpwdHIrKzsKKyAgICAgICAgKmNiKysgPSB0bXAxOworICAgICAgICAqY2IrKyA9IHRtcDI7CisgICAgICAgIGNiICs9IHdpZHRoLTI7CisgICAgfQorCisgICAgZm9yIChpID0gODsgaSA7IGktLSkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHRyKys7CisgICAgICAgIHRtcDIgPSAqcHRyKys7CisgICAgICAgICpjcisrID0gdG1wMTsKKyAgICAgICAgKmNyKysgPSB0bXAyOworICAgICAgICBjciArPSB3aWR0aC0yOworICAgIH0KKworfQorI2VuZGlmCisjaWZuZGVmIEgyNjRERUNfT01YREwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBQcmVkaWN0aW9uIGZvciB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgYW5kIHRoZSByZXNpZHVhbCBhcmUgZ2l2ZW4gc2VwYXJhdGVseSBhbmQgd2lsbCBiZSBjb21iaW5lZCB3aGlsZQorICAgICAgICAgICAgd3JpdGluZyB0aGUgZGF0YSB0byB0aGUgaW1hZ2UKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBkYXRhLCAyNTYgdmFsdWVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKKyAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgcmVzaWR1YWwgICAgcG9pbnRlciB0byByZXNpZHVhbCBkYXRhLCAxNiAxNi1lbGVtZW50IGFycmF5cyBmb3IgbHVtYQorICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgNCAxNi1lbGVtZW50IGFycmF5cyBmb3IgYm90aCBjaHJvbWEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgaW1hZ2UgICAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTggKmRhdGEsCisgICAgICAgIGkzMiByZXNpZHVhbFtdWzE2XSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgcGljV2lkdGgsIHBpY1NpemU7CisgICAgdTggKmx1bSwgKmNiLCAqY3I7CisgICAgdTggKmltYWdlQmxvY2s7CisgICAgdTggKnRtcDsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgdTMyIGJsb2NrOworICAgIHUzMiB4LCB5OworICAgIGkzMiAqcFJlczsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKKworICAgIC8qIEltYWdlIHNpemUgaW4gbWFjcm9ibG9ja3MgKi8KKyAgICBwaWNXaWR0aCA9IGltYWdlLT53aWR0aDsKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBpbWFnZS0+aGVpZ2h0OworICAgIHJvdyA9IG1iTnVtIC8gcGljV2lkdGg7CisgICAgY29sID0gbWJOdW0gJSBwaWNXaWR0aDsKKworICAgIC8qIE91dHB1dCBtYWNyb2Jsb2NrIHBvc2l0aW9uIGluIG91dHB1dCBwaWN0dXJlICovCisgICAgbHVtID0gKGltYWdlLT5kYXRhICsgcm93ICogcGljV2lkdGggKiAyNTYgKyBjb2wgKiAxNik7CisgICAgY2IgPSAoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogcGljV2lkdGggKiA2NCArIGNvbCAqIDgpOworICAgIGNyID0gKGNiICsgcGljU2l6ZSAqIDY0KTsKKworICAgIHBpY1dpZHRoICo9IDE2OworCisgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspCisgICAgeworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKKworICAgICAgICBwUmVzID0gcmVzaWR1YWxbYmxvY2tdOworCisgICAgICAgIEFTU0VSVChwUmVzKTsKKworICAgICAgICB0bXAgPSBkYXRhICsgeSoxNiArIHg7CisgICAgICAgIGltYWdlQmxvY2sgPSBsdW0gKyB5KnBpY1dpZHRoICsgeDsKKworICAgICAgICBBU1NFUlQoISgodTMyKXRtcCYweDMpKTsKKyAgICAgICAgQVNTRVJUKCEoKHUzMilpbWFnZUJsb2NrJjB4MykpOworCisgICAgICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShwUmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLypsaW50IC1lODI2ICovCisgICAgICAgICAgICBpMzIgKmluMzIgPSAoaTMyKil0bXA7CisgICAgICAgICAgICBpMzIgKm91dDMyID0gKGkzMiopaW1hZ2VCbG9jazsKKworICAgICAgICAgICAgLyogUmVzaWR1YWwgaXMgemVybyA9PiBjb3B5IHByZWRpY3Rpb24gYmxvY2sgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICB0bXAyID0gKmluMzI7ICBpbjMyICs9IDQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgKm91dDMyID0gdG1wMjsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBSQU5HRV9DSEVDS19BUlJBWShwUmVzLCAtNTEyLCA1MTEsIDE2KTsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGltYWdlID0gcHJlZGljdGlvbiArIHJlc2lkdWFsCisgICAgICAgICAgICAgKiBQcm9jZXNzIGZvdXIgcGl4ZWxzIGluIGEgbG9vcCAqLworICAgICAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFsxXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzBdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFsyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzFdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgICAgICAgICAgdG1wMyA9IHRtcFszXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzJdID0gKHU4KXRtcDE7CisgICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgICAgICAgICAgdG1wICs9IDE2OworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwaWNXaWR0aCAvPSAyOworCisgICAgZm9yIChibG9jayA9IDE2OyBibG9jayA8PSAyMzsgYmxvY2srKykKKyAgICB7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrICYgMHgzXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2sgJiAweDNdOworCisgICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107CisKKyAgICAgICAgQVNTRVJUKHBSZXMpOworCisgICAgICAgIHRtcCA9IGRhdGEgKyAyNTY7CisgICAgICAgIGltYWdlQmxvY2sgPSBjYjsKKworICAgICAgICBpZiAoYmxvY2sgPj0gMjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGltYWdlQmxvY2sgPSBjcjsKKyAgICAgICAgICAgIHRtcCArPSA2NDsKKyAgICAgICAgfQorCisgICAgICAgIHRtcCArPSB5KjggKyB4OworICAgICAgICBpbWFnZUJsb2NrICs9IHkqcGljV2lkdGggKyB4OworCisgICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOworICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7CisKKyAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KKyAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKKyAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOworCisgICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gMjsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOworICAgICAgICAgICAgdG1wMiA9ICppbjMyOworICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOworCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOworICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzNdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9jayArPSBwaWNXaWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZDdjMThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTUFHRV9ICisjZGVmaW5lIEgyNjRTV0RFQ19JTUFHRV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHU4ICpkYXRhOworICAgIHUzMiB3aWR0aDsKKyAgICB1MzIgaGVpZ2h0OworICAgIC8qIGN1cnJlbnQgTUIncyBjb21wb25lbnRzICovCisgICAgdTggKmx1bWE7CisgICAgdTggKmNiOworICAgIHU4ICpjcjsKK30gaW1hZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKKyAgICBpMzIgcmVzaWR1YWxbXVsxNl0pOworI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lNQUdFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE4MWM0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEludGVyUHJlZGljdGlvbgorICAgICAgICAgIE12UHJlZGljdGlvbjE2eDE2CisgICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4OAorICAgICAgICAgIE12UHJlZGljdGlvbjh4MTYKKyAgICAgICAgICBNdlByZWRpY3Rpb244eDgKKyAgICAgICAgICBNdlByZWRpY3Rpb24KKyAgICAgICAgICBNZWRpYW5GaWx0ZXIKKyAgICAgICAgICBHZXRJbnRlck5laWdoYm91cgorICAgICAgICAgIEdldFByZWRpY3Rpb25NdgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGF2YWlsYWJsZTsKKyAgICB1MzIgcmVmSW5kZXg7CisgICAgbXZfdCBtdjsKK30gaW50ZXJOZWlnaGJvdXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsCisgICAgZHBiU3RvcmFnZV90ICpkcGIpOworc3RhdGljIHUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAorICAgIHUzMiBtYlBhcnRJZHgsIHUzMiBzdWJNYlBhcnRJZHgpOworc3RhdGljIGkzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYyk7CisKK3N0YXRpYyB2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCk7CitzdGF0aWMgdm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCk7CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDV9LCB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9IH0gfSwKKworICAgIHsgeyB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsMTN9LCB7TUJfQSwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDEzfSwge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwge01CX0NVUlIsMTB9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxMX0sIHtNQl9DVVJSLDE0fSB9IH0gfTsKKworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKKyAgICB7IHsge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9IH0gfSwKKworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfQ1VSUiw0fSwge01CX0NVUlIsNX0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTN9IH0gfSB9OworCitzdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9DX1NVQl9QQVJUWzRdWzRdWzRdID0geworICAgIHsgeyB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfTkEsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9OQSw0fSB9IH0sCisKKyAgICB7IHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9DVVJSLDV9LCB7TUJfTkEsMH0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0gfSB9LAorCisgICAgeyB7IHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfTkEsMn0sIHtNQl9OQSw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsN30sIHtNQl9OQSwyfSwge01CX0NVUlIsMTN9LCB7TUJfTkEsOH0gfSB9IH07CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9ELDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9BLDV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSB9IH0sCisKKyAgICB7IHsge01CX0IsMTF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0NVUlIsMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9IH0gfSwKKworICAgIHsgeyB7TUJfQSw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSB9IH0gfTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisgICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB4LCB5OworICAgIHUzMiBjb2xBbmRSb3c7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKKyAgICB1OCAqcEZpbGw7CisgICAgdTMyIHRtcDsKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIC8qIDE2LWJ5dGUgYWxpZ25tZW50ICovCisgICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOworCisgICAgLyogc2V0IHJvdyBiaXRzIDE1OjAgKi8KKyAgICBjb2xBbmRSb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgLypzZXQgY29sIHRvIGJpdHMgMzE6MTYgKi8KKyAgICBjb2xBbmRSb3cgKz0gKG1iTnVtIC0gY29sQW5kUm93ICogY3VyckltYWdlLT53aWR0aCkgPDwgMTY7CisgICAgY29sQW5kUm93IDw8PSA0OworCisgICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworCisgICAgc3dpdGNoIChwTWItPm1iVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgUF9Ta2lwOgorICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6CisgICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDE2OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworCisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICg4PDwxNikgKyAoMTY8PDgpICsgODsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKKyAgICAgICAgICAgIHRtcCA9ICg4PDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLworICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOworICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7CisgICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoODw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg4PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKKyAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcworICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgcm93LCBjb2w7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1YlBhcnRNb2RlOworICAgIGltYWdlX3QgcmVmSW1hZ2U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworICAgIHJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKKyAgICBjb2wgPSBtYk51bSAtIHJvdyAqIGN1cnJJbWFnZS0+d2lkdGg7CisgICAgcm93ICo9IDE2OworICAgIGNvbCAqPSAxNjsKKworICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKKyAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKKworICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICAxNiwgMTYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6CisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCA4LAorICAgICAgICAgICAgICAgIDE2LCA4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgorICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLCBjb2wsIHJvdywgOCwgMCwKKyAgICAgICAgICAgICAgICA4LCAxNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07CisgICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7CisgICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKKyAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgOCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHkrNCwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICBpZiAocE1iLT5tYlR5cGUgIT0gUF9Ta2lwKQorICAgIHsKKyAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGN1cnJJbWFnZSwgbWJOdW0sIGRhdGEsCisgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4MTYgcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIG12X3QgbXY7CisgICAgbXZfdCBtdlByZWQ7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisgICAgdTMyIHJlZkluZGV4OworICAgIHU4ICp0bXA7CisgICAgdTMyICp0bXBNdjEsICp0bXBNdjI7CisKKy8qIENvZGUgKi8KKworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworICAgIC8qbGludCAtLWUoNzQwKSAgVW51c3VhbCBwb2ludGVyIGNhc3QgKGluY29tcGF0aWJsZSBpbmRpcmVjdCB0eXBlcykgKi8KKyAgICB0bXBNdjEgPSAodTMyKikoJmFbMF0ubXYpOyAvKiB3ZSB0ZXN0IGp1c3QgdGhhdCBib3RoIE1WcyBhcmUgemVybyAqLworICAgIC8qbGludCAtLWUoNzQwKSAqLworICAgIHRtcE12MiA9ICh1MzIqKSgmYVsxXS5tdik7IC8qIGkuZS4gYVswXS5tdi5ob3IgPT0gMCAmJiBhWzBdLm12LnZlciA9PSAwICovCisgICAgaWYgKHBNYi0+bWJUeXBlID09IFBfU2tpcCAmJgorICAgICAgICAoIWFbMF0uYXZhaWxhYmxlIHx8ICFhWzFdLmF2YWlsYWJsZSB8fAorICAgICAgICAgKCBhWzBdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjEpID09IDApICkgfHwKKyAgICAgICAgICggYVsxXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYyKSA9PSAwKSApKSkKKyAgICB7CisgICAgICAgICAgICBtdi5ob3IgPSBtdi52ZXIgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICAgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgICAgIG12LnZlciArPSBtdlByZWQudmVyOworCisgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0KKyAgICAgICAgICogKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQorICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7CisKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4OAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgbXZfdCBtdjsKKyAgICBtdl90IG12UHJlZDsKKyAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KKyAgICB1MzIgcmVmSW5kZXg7CisgICAgdTggKnRtcDsKKworLyogQ29kZSAqLworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworCisgICAgaWYgKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCisgICAgICAgIG12UHJlZCA9IGFbMV0ubXY7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKKyAgICAgICAgfQorCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9CisgICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9IG12OworICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDEzKTsKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhWzFdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICBhWzFdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07CisgICAgICAgIGFbMV0ubXYgPSBwTWItPm12WzBdOworCisgICAgICAgIC8qIGMgaXMgbm90IGF2YWlsYWJsZSAqLworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhKzIsIDcpOworCisgICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICB9CisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLworICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHgxNiBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12OworICAgIG12X3QgbXZQcmVkOworICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLworICAgIHUzMiByZWZJbmRleDsKKyAgICB1OCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisKKyAgICBpZiAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVswXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxNCk7CisgICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPSBtdjsKKyAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKKworICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKKyAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07CisKKyAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKKyAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsyLCAxMSk7CisgICAgfQorICAgIGlmIChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KQorICAgICAgICBtdlByZWQgPSBhWzJdLm12OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFbMF0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGFbMF0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKKyAgICAgICAgYVswXS5tdiA9IHBNYi0+bXZbMF07CisKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxNCk7CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0KKyAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OworICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb244eDgKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDggcGFydGl0aW9uIG1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgbnVtU3ViTWJQYXJ0OworCisvKiBDb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbnVtU3ViTWJQYXJ0ID0gaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7CisgICAgICAgIHBNYi0+cmVmUGljW2ldID0gc3ViTWJQcmVkLT5yZWZJZHhMMFtpXTsKKyAgICAgICAgcE1iLT5yZWZBZGRyW2ldID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCBzdWJNYlByZWQtPnJlZklkeEwwW2ldKTsKKyAgICAgICAgaWYgKHBNYi0+cmVmQWRkcltpXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtU3ViTWJQYXJ0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24ocE1iLCBzdWJNYlByZWQsIGksIGopICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3Igc3ViLXBhcnRpdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIHUzMiBtYlBhcnRJZHgsCisgICAgdTMyIHN1Yk1iUGFydElkeCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12LCBtdlByZWQ7CisgICAgdTMyIHJlZkluZGV4OworICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJNYlBhcnRNb2RlOworICAgIGNvbnN0IG5laWdoYm91cl90ICpuOworICAgIG1iU3RvcmFnZV90ICpuTWI7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisKKy8qIENvZGUgKi8KKworICAgIG12ID0gc3ViTWJQcmVkLT5tdmRMMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF07CisgICAgc3ViTWJQYXJ0TW9kZSA9IGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iUHJlZC0+c3ViTWJUeXBlW21iUGFydElkeF0pOworICAgIHJlZkluZGV4ID0gc3ViTWJQcmVkLT5yZWZJZHhMMFttYlBhcnRJZHhdOworCisgICAgbiA9IE5fQV9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0JfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzEsIG4tPmluZGV4KTsKKworICAgIG4gPSBOX0NfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKworICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgeworICAgICAgICBuID0gTl9EX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhKzIsIG4tPmluZGV4KTsKKyAgICB9CisKKyAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOworCisgICAgbXYuaG9yICs9IG12UHJlZC5ob3I7CisgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLworICAgIGlmICgoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBzd2l0Y2ggKHN1Yk1iUGFydE1vZGUpCisgICAgeworICAgICAgICBjYXNlIE1CX1NQXzh4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMV0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyXSA9IG12OworICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDNdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzh4NDoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAyKnN1Yk1iUGFydElkeCArIDFdID0gbXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1CX1NQXzR4ODoKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4ICsgMl0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUJfU1BfNHg0OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTWVkaWFuRmlsdGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1lZGlhbiBmaWx0ZXJpbmcgZm9yIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIG1heCxtaW4sbWVkOworCisvKiBDb2RlICovCisKKyAgICBtYXggPSBtaW4gPSBtZWQgPSBhOworICAgIGlmIChiID4gbWF4KQorICAgIHsKKyAgICAgICAgbWF4ID0gYjsKKyAgICB9CisgICAgZWxzZSBpZiAoYiA8IG1pbikKKyAgICB7CisgICAgICAgIG1pbiA9IGI7CisgICAgfQorICAgIGlmIChjID4gbWF4KQorICAgIHsKKyAgICAgICAgbWVkID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChjIDwgbWluKQorICAgIHsKKyAgICAgICAgbWVkID0gbWluOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZWQgPSBjOworICAgIH0KKworICAgIHJldHVybihtZWQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEludGVyTmVpZ2hib3VyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhdmFpbGFiaWxpdHksIHJlZmVyZW5jZSBpbmRleCBhbmQgbW90aW9uIHZlY3RvciBvZiBhIG5laWdoYm91cgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEdldEludGVyTmVpZ2hib3VyKHUzMiBzbGljZUlkLCBtYlN0b3JhZ2VfdCAqbk1iLAorICAgIGludGVyTmVpZ2hib3VyX3QgKm4sIHUzMiBpbmRleCkKK3sKKworICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19GQUxTRTsKKyAgICBuLT5yZWZJbmRleCA9IDB4RkZGRkZGRkY7CisgICAgbi0+bXYuaG9yID0gbi0+bXYudmVyID0gMDsKKworICAgIGlmIChuTWIgJiYgKHNsaWNlSWQgPT0gbk1iLT5zbGljZUlkKSkKKyAgICB7CisgICAgICAgIHUzMiB0bXA7CisgICAgICAgIG12X3QgdG1wTXY7CisKKyAgICAgICAgdG1wID0gbk1iLT5tYlR5cGU7CisgICAgICAgIG4tPmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOworICAgICAgICAvKiBNYlBhcnRQcmVkTW9kZSAiaW5saW5lZCIgKi8KKyAgICAgICAgaWYgKHRtcCA8PSBQXzh4OHJlZjApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcE12ID0gbk1iLT5tdltpbmRleF07CisgICAgICAgICAgICB0bXAgPSBuTWItPnJlZlBpY1tpbmRleD4+Ml07CisgICAgICAgICAgICBuLT5yZWZJbmRleCA9IHRtcDsKKyAgICAgICAgICAgIG4tPm12ID0gdG1wTXY7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRQcmVkaWN0aW9uTXYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBiYXNlZCBvbiBuZWlnaGJvdXJzIEEsIEIgYW5kIEMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBHZXRQcmVkaWN0aW9uTXYobXZfdCAqbXYsIGludGVyTmVpZ2hib3VyX3QgKmEsIHUzMiByZWZJbmRleCkKK3sKKworICAgIGlmICggYVsxXS5hdmFpbGFibGUgfHwgYVsyXS5hdmFpbGFibGUgfHwgIWFbMF0uYXZhaWxhYmxlKQorICAgIHsKKyAgICAgICAgdTMyIGlzQSwgaXNCLCBpc0M7CisgICAgICAgIGlzQSA9IChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICBpc0IgPSAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgaXNDID0gKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgaWYgKCgodTMyKWlzQSsodTMyKWlzQisodTMyKWlzQykgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbXYtPmhvciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYuaG9yLCBhWzFdLm12LmhvciwgYVsyXS5tdi5ob3IpOworICAgICAgICAgICAgbXYtPnZlciA9IChpMTYpTWVkaWFuRmlsdGVyKGFbMF0ubXYudmVyLCBhWzFdLm12LnZlciwgYVsyXS5tdi52ZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzQSkKKyAgICAgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgICAgIGVsc2UgaWYgKGlzQikKKyAgICAgICAgICAgICptdiA9IGFbMV0ubXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICptdiA9IGFbMl0ubXY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICptdiA9IGFbMF0ubXY7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTRkZWUyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0gKKyNkZWZpbmUgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1ZWFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCkBAIC0wLDAgKzEsMTkzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscworICAgICAgICAgIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorICAgICAgICAgIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCisgICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsCisgICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgorICAgICAgICAgIEdldDR4NE5laWdoYm91clBlbHMKKyAgICAgICAgICBXcml0ZTR4NFRvMTZ4MTYKKyAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgorICAgICAgICAgIERldGVybWluZUludHJhNHg0UHJlZE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDIgKi8KKworCisvKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jayAqLworY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbMTZdID0KKyAgICB7IDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiwgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyIH07Citjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVsxNl0gPQorICAgIHsgMCwgMCwgNCwgNCwgMCwgMCwgNCwgNCwgOCwgOCwgMTIsIDEyLCA4LCA4LCAxMiwgMTIgfTsKKworY29uc3QgdTggaDI2NGJzZENsaXBbMTI4MF0gPQoreworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LAorICAgIDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLAorICAgIDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LAorICAgIDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLAorICAgIDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LAorICAgIDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LAorICAgIDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLAorICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKKyAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCisgICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAorICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwKKyAgICAxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsCisgICAgMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LAorICAgIDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywKKyAgICAyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksCisgICAgMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUKK307CisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOworc3RhdGljIHZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBBLCB1MzIgQik7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKKworc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIEEsIHUzMiBCKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7CitzdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSk7CisKK3N0YXRpYyB2b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSk7CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCitzdGF0aWMgdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAorICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCisgICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKTsKKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKKyAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCisgICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoIChwdHItMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsgKGF2YWlsYWJsZUE8PDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7CisgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKKyAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgorICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAorICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnB0ciwgdTMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiBtb2RlOworICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKKyAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKKworICAgIE9NWFJlc3VsdCBvbXhSZXM7CisgICAgdTMyIHgsIHk7CisgICAgdTggKmwsICphLCAqYWw7CisvKiBDb2RlICovCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYkxheWVyKTsKKyAgICBBU1NFUlQocHRyKTsKKyAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOworCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7CisgICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOworICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCisgICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKKyAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgeworICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107CisKKyAgICBpZiAoeSA9PSAwKQorICAgICAgICBhID0gcHRyIC0gd2lkdGggKyB4OworICAgIGVsc2UKKyAgICAgICAgYSA9IGRhdGEtMTY7CisKKyAgICBpZiAoeCA9PSAwKQorICAgICAgICBsID0gcHRyICsgeSAqIHdpZHRoIC0xOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGwgPSBkYXRhLTE7CisgICAgICAgIHdpZHRoID0gMTY7CisgICAgfQorCisgICAgaWYgKHggPT0gMCkKKyAgICAgICAgYWwgPSBsLXdpZHRoOworICAgIGVsc2UKKyAgICAgICAgYWwgPSBhLTE7CisKKyAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKW1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUM8PDYpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCisgICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICB1OCAqcHRyOworICAgIHUzMiB3aWR0aDsKKworLyogQ29kZSAqLworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBwdHIgPSBpbWFnZS0+Y2I7CisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGgqODsKKworICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKKyAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHJldHVybiBIQU5UUk9fTk9LOworCisgICAgLyogYWR2YW5jZSBwb2ludGVycyAqLworICAgIGRhdGEgKz0gNjQ7CisgICAgcHRyID0gaW1hZ2UtPmNyOworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50cmEgbWFjcm9ibG9jay4gUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiB1c2luZworICAgICAgICAgIHNwZWNpZmllZCBwcmVkaWN0aW9uIG1vZGUuIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoaW1hZ2UpCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCisgICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgb3V0cHV0IG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBpbWFnZSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKKyAgICAgICAgICBkYXRhICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBpbnRyYSBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIC8qIHBlbEFib3ZlIGFuZCBwZWxMZWZ0IGNvbnRhaW4gc2FtcGxlcyBhYm92ZSBhbmQgbGVmdCB0byB0aGUgY3VycmVudAorICAgICAqIG1hY3JvYmxvY2suIEFib3ZlIGFycmF5IGNvbnRhaW5zIGFsc28gc2FtcGxlIGFib3ZlLWxlZnQgdG8gdGhlIGN1cnJlbnQKKyAgICAgKiBtYiBhcyB3ZWxsIGFzIDQgc2FtcGxlcyBhYm92ZS1yaWdodCB0byB0aGUgY3VycmVudCBtYiAobGF0dGVyIG9ubHkgZm9yCisgICAgICogbHVtYSkgKi8KKyAgICAvKiBsdW1EICsgbHVtQiArIGx1bUMgKyBjYkQgKyBjYkIgKyBjckQgKyBjckIgKi8KKyAgICB1OCBwZWxBYm92ZVsxICsgMTYgKyA0ICsgMSArIDggKyAxICsgOF07CisgICAgLyogbHVtQSArIGNiQSArIGNyQSAqLworICAgIHU4IHBlbExlZnRbMTYgKyA4ICsgOF07CisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpOworCisgICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2UsIHBlbEFib3ZlLCBwZWxMZWZ0LCBtYk51bSk7CisKKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXIsCisgICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAorICAgICAgICAgICAgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwrMTYsIHBlbEFib3ZlICsgMjEsIHBlbExlZnQgKyAxNiwKKyAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdHJhaW5lZEludHJhUHJlZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZSwgZGF0YSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBHZXQgcGl4ZWwgdmFsdWVzIGZyb20gbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGludG8gJ2Fib3ZlJworICAgICAgICAgIGFuZCAnbGVmdCcgYXJyYXlzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHdpZHRoLCBwaWNTaXplOworICAgIHU4ICpwdHIsICp0bXA7CisgICAgdTMyIHJvdywgY29sOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworCisgICAgaWYgKCFtYk51bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgcGljU2l6ZSA9IHdpZHRoICogaW1hZ2UtPmhlaWdodDsKKyAgICByb3cgPSBtYk51bSAvIHdpZHRoOworICAgIGNvbCA9IG1iTnVtIC0gcm93ICogd2lkdGg7CisKKyAgICB3aWR0aCAqPSAxNjsKKyAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggICsgY29sICogMTY7CisKKyAgICAvKiBub3RlIHRoYXQgbHVtYSBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkbyBub3QgbWFrZQorICAgICAqIHNlbnNlIHdoZW4gY3VycmVudCBtYiBpcyB0aGUgcmlnaHQtbW9zdCBtYiBpbiBhIHJvdy4gU2FtZSBhcHBsaWVzIHRvCisgICAgICogc2FtcGxlIGFib3ZlLWxlZnQgaWYgY29sIGlzIHplcm8uIEhvd2V2ZXIsIHVzYWdlIG9mIHBlbHMgaW4gcHJlZGljdGlvbgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkgbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpbiBhY3R1YWwgcHJlZGljdGlvbgorICAgICAqIHByb2Nlc3MgKi8KKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDIxOyBpLS07KQorICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7CisgICAgfQorCisgICAgaWYgKGNvbCkKKyAgICB7CisgICAgICAgIHB0ci0tOworICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorCisgICAgd2lkdGggPj49IDE7CisgICAgcHRyID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogOCAqIHdpZHRoICArIGNvbCAqIDg7CisKKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7CisgICAgICAgIGZvciAoaSA9IDk7IGktLTspCisgICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKKyAgICAgICAgdG1wICs9IChwaWNTaXplICogNjQpIC0gOTsKKyAgICAgICAgZm9yIChpID0gOTsgaS0tOykKKyAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOworICAgIH0KKworICAgIGlmIChjb2wpCisgICAgeworICAgICAgICBwdHItLTsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgICAgIHB0ciArPSAocGljU2l6ZSAqIDY0KSAtIDggKiB3aWR0aDsKKyAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQorICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAorICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKKyAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKHJlc2lkdWFsKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKyAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKKworICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7CisgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKKyAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOworICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworCisgICAgc3dpdGNoKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6IC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6IC8qIEludHJhXzE2eDE2X0RDICovCisgICAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV8xNngxNl9QbGFuZSAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogYWRkIHJlc2lkdWFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgaSk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCisgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCisgICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgdTggKmFib3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYmxvY2s7CisgICAgdTMyIG1vZGU7CisgICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOworICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOworICAgIHU4IGFbMSArIDQgKyA0XSwgbFsxICsgNF07CisgICAgdTMyIGRhdGE0eDRbNF07CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobWJMYXllcik7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKKyAgICB7CisKKyAgICAgICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKKworICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgICAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOworICAgICAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7CisgICAgICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCisgICAgICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAorICAgICAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOworICAgICAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOworICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgICAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscyhhLCBsLCBkYXRhLCBhYm92ZSwgbGVmdCwgYmxvY2spOworCisgICAgICAgIHN3aXRjaChtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhXzR4NF9EQyAqLworICAgICAgICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgOCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFdyaXRlNHg0VG8xNngxNihkYXRhLCAodTgqKWRhdGE0eDQsIGJsb2NrKTsKKyAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsW2Jsb2NrXSwgYmxvY2spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAorICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgY29tcCwgYmxvY2s7CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGNvbXAgPSAwLCBibG9jayA9IDE2OyBjb21wIDwgMjsgY29tcCsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHByZWRNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhX0Nocm9tYV9EQyAqLworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKyspCisgICAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGJsb2NrKTsKKworICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCisgICAgICAgIGRhdGEgKz0gNjQ7CisgICAgICAgIGFib3ZlICs9IDk7CisgICAgICAgIGxlZnQgKz0gODsKKyAgICAgICAgcmVzaWR1YWwgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBZGRSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgQWRkIHJlc2lkdWFsIG9mIGEgYmxvY2sgaW50byBwcmVkaWN0aW9uIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgorICAgICAgICAgIFRoZSByZXN1bHQgKHJlc2lkdWFsICsgcHJlZGljdGlvbikgaXMgc3RvcmVkIGluICdkYXRhJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAordm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgeCwgeTsKKyAgICB1MzIgd2lkdGg7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgICAgdTggKnRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2ICsgNCArIDQpOworCisgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocmVzaWR1YWwsIC01MTIsIDUxMSwgMTYpOworCisgICAgaWYgKGJsb2NrTnVtIDwgMTYpCisgICAgeworICAgICAgICB3aWR0aCA9IDE2OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2lkdGggPSA4OworICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bSAmIDB4M107CisgICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtICYgMHgzXTsKKyAgICB9CisKKyAgICB0bXAgPSBkYXRhICsgeSp3aWR0aCArIHg7CisgICAgZm9yIChpID0gNDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOworICAgICAgICB0bXAyID0gdG1wWzBdOworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbMV07CisKKyAgICAgICAgdG1wWzBdID0gY2xwW3RtcDEgKyB0bXAyXTsKKworICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDIgPSB0bXBbMl07CisKKyAgICAgICAgdG1wWzFdID0gY2xwW3RtcDMgKyB0bXA0XTsKKworICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDQgPSB0bXBbM107CisKKyAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOworICAgICAgICB0bXBbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgdG1wWzNdID0gKHU4KXRtcDM7CisKKyAgICAgICAgdG1wICs9IHdpZHRoOworICAgIH0KKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAqZGF0YSsrID0gYWJvdmVbal07CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgajsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpkYXRhKysgPSBsZWZ0W2ldOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmExNngxNkRjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBEQyBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldICsgbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDE2KSA+PiA1OworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB0bXAgKz0gbGVmdFtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXTsKKyAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSAxMjg7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgZGF0YVtpXSA9ICh1OCl0bXA7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIGkzMiBhLCBiLCBjOworICAgIGkzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7CisKKyAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgYiArPSAoKGkzMilpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOworICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOworICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IChhICsgYiAqICgoaTMyKWogLSA3KSArIGMgKiAoKGkzMilpIC0gNykgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIERDIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYURjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCisgICAgdTMyIGF2YWlsYWJsZUIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHRtcDEsIHRtcDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIC8qIHkgPSAwLi4zICovCisgICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSBhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArCisgICAgICAgICAgICAgIGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM107CisgICAgICAgIHRtcDEgPSAodG1wMSArIDQpID4+IDM7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICAgICAgdG1wMiA9IHRtcDE7CisgICAgfQorICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgfQorCisgICAgLyogeSA9IDQuLi43ICovCisgICAgaWYgKGF2YWlsYWJsZUEpCisgICAgeworICAgICAgICB0bXAxID0gKGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN10gKyAyKSA+PiAyOworICAgICAgICBpZiAoYXZhaWxhYmxlQikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMiA9IGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsKKyAgICAgICAgICAgICAgICAgICBsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKyBsZWZ0WzddOworICAgICAgICAgICAgdG1wMiA9ICh0bXAyICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAyID0gdG1wMTsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHRtcDEgPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wMSA9IHRtcDIgPSAxMjg7CisgICAgfQorCisgICAgQVNTRVJUKHRtcDEgPCAyNTYgJiYgdG1wMiA8IDI1Nik7CisgICAgZm9yIChpID0gNDsgaS0tOykKKyAgICB7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoaSA9IDg7IGktLTspCisgICAgeworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdCsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBmb3IgKGkgPSA4OyBpLS07ZGF0YSsrLyphYm92ZS09OCovKQorICAgIHsKKyAgICAgICAgZGF0YVswXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs4XSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVsxNl0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbMjRdID0gKmFib3ZlOworICAgICAgICBkYXRhWzMyXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs0MF0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbNDhdID0gKmFib3ZlOworICAgICAgICBkYXRhWzU2XSA9ICphYm92ZSsrOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBwbGFuZSBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgaTMyIGEsIGIsIGM7CisgICAgaTMyIHRtcDsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGEgPSAxNiAqIChhYm92ZVs3XSArIGxlZnRbN10pOworCisgICAgYiA9IChhYm92ZVs0XSAtIGFib3ZlWzJdKSArIDIgKiAoYWJvdmVbNV0gLSBhYm92ZVsxXSkKKyAgICAgICAgKyAzICogKGFib3ZlWzZdIC0gYWJvdmVbMF0pICsgNCAqIChhYm92ZVs3XSAtIGFib3ZlWy0xXSk7CisgICAgYiA9ICgxNyAqIGIgKyAxNikgPj4gNTsKKworICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KKyAgICBjID0gKGxlZnRbNF0gLSBsZWZ0WzJdKSArIDIgKiAobGVmdFs1XSAtIGxlZnRbMV0pCisgICAgICAgICsgMyAqIChsZWZ0WzZdIC0gbGVmdFswXSkgKyA0ICogKGxlZnRbN10gLSBhYm92ZVstMV0pOworICAgIGMgPSAoMTcgKiBjICsgMTYpID4+IDU7CisKKyAgICAvKmEgKz0gMTY7Ki8KKyAgICBhID0gYSAtIDMgKiBjICsgMTY7CisgICAgZm9yIChpID0gODsgaS0tOyBhICs9IGMpCisgICAgeworICAgICAgICB0bXAgPSAoYSAtIDMgKiBiKTsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgICAgICB0bXAgKz0gYjsKKyAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldDR4NE5laWdoYm91clBlbHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEdldCBuZWlnaGJvdXJpbmcgcGl4ZWxzIG9mIGEgNHg0IGJsb2NrIGludG8gJ2EnIGFuZCAnbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAorICAgIHUzMiBibG9ja051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeCwgeTsKKyAgICB1OCB0MSwgdDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChhKTsKKyAgICBBU1NFUlQobCk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICAvKiBBIGFuZCBEICovCisgICAgaWYgKHggPT0gMCkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFt5ICAgIF07CisgICAgICAgIHQyID0gbGVmdFt5ICsgMV07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGxlZnRbeSArIDJdOworICAgICAgICB0MiA9IGxlZnRbeSArIDNdOworICAgICAgICBsWzNdID0gdDE7CisgICAgICAgIGxbNF0gPSB0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdDEgPSBkYXRhW3kgKiAxNiArIHggLSAxICAgICBdOworICAgICAgICB0MiA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAxNl07CisgICAgICAgIGxbMV0gPSB0MTsKKyAgICAgICAgbFsyXSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAzMl07CisgICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDQ4XTsKKyAgICAgICAgbFszXSA9IHQxOworICAgICAgICBsWzRdID0gdDI7CisgICAgfQorCisgICAgLyogQiwgQyBhbmQgRCAqLworICAgIGlmICh5ID09IDApCisgICAgeworICAgICAgICB0MSA9IGFib3ZlW3ggICAgXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICAgIF07CisgICAgICAgIGxbMF0gPSB0MTsKKyAgICAgICAgYVswXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAxXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgMl07CisgICAgICAgIGFbMV0gPSB0MTsKKyAgICAgICAgYVsyXSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyAzXTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNF07CisgICAgICAgIGFbM10gPSB0MTsKKyAgICAgICAgYVs0XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA1XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgNl07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGFib3ZlW3ggKyA3XTsKKyAgICAgICAgdDIgPSBhYm92ZVt4ICsgOF07CisgICAgICAgIGFbN10gPSB0MTsKKyAgICAgICAgYVs4XSA9IHQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCAgICBdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDFdOworICAgICAgICBhWzFdID0gdDE7CisgICAgICAgIGFbMl0gPSB0MjsKKyAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAyXTsKKyAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAzXTsKKyAgICAgICAgYVszXSA9IHQxOworICAgICAgICBhWzRdID0gdDI7CisgICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNF07CisgICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNV07CisgICAgICAgIGFbNV0gPSB0MTsKKyAgICAgICAgYVs2XSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDZdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDddOworICAgICAgICBhWzddID0gdDE7CisgICAgICAgIGFbOF0gPSB0MjsKKworICAgICAgICBpZiAoeCA9PSAwKQorICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBsZWZ0W3ktMV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxbMF0gPSBhWzBdID0gZGF0YVsoeSAtIDEpICogMTYgKyB4IC0gMV07CisgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICB0MSA9IGFib3ZlWzBdOworICAgIHQyID0gYWJvdmVbMV07CisgICAgZGF0YVswXSA9IGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSB0MTsKKyAgICBkYXRhWzFdID0gZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IHQyOworICAgIHQxID0gYWJvdmVbMl07CisgICAgdDIgPSBhYm92ZVszXTsKKyAgICBkYXRhWzJdID0gZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSB0MTsKKyAgICBkYXRhWzNdID0gZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSB0MjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIHQxID0gbGVmdFswXTsKKyAgICB0MiA9IGxlZnRbMV07CisgICAgZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9IHQxOworICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSB0MjsKKyAgICB0MSA9IGxlZnRbMl07CisgICAgdDIgPSBsZWZ0WzNdOworICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IHQxOworICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gdDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgREMgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKKyAgICB1MzIgYXZhaWxhYmxlQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIHU4IHQxLCB0MiwgdDMsIHQ0OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKKyAgICAgICAgdG1wID0gdDEgKyB0MiArIHQzICsgdDQ7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wICs9IHQxICsgdDIgKyB0MyArIHQ0OworICAgICAgICB0bXAgPSAodG1wICsgNCkgPj4gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKKyAgICB7CisgICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKKyAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIHQxID0gYWJvdmVbMF07IHQyID0gYWJvdmVbMV07IHQzID0gYWJvdmVbMl07IHQ0ID0gYWJvdmVbM107CisgICAgICAgIHRtcCA9ICh0MSArIHQyICsgdDMgKyB0NCArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wIDwgMjU2KTsKKyAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0KKyAgICBkYXRhWzRdID0gZGF0YVs1XSA9IGRhdGFbNl0gPSBkYXRhWzddID0KKyAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPQorICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gKHU4KXRtcDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGRpYWdvbmFsIGRvd24tbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKKyAgICBkYXRhWzExXSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE0XSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVs2XSArIDMgKiBhYm92ZVs3XSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1yaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgNl0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgOV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCByaWdodCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChhYm92ZVstMV0gKyBhYm92ZVswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWzEzXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzExXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyAzXSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0Wy0xXSArIDIpID4+IDI7CisgICAgZGF0YVsxMl0gPSAobGVmdFsyXSArIDIgKiBsZWZ0WzFdICsgbGVmdFswXSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBkb3duIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbLTFdICsgbGVmdFswXSArIDEpID4+IDE7CisgICAgZGF0YVsgNl0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA1XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxMV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEwXSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7CisgICAgZGF0YVsgOV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsxNV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7CisgICAgZGF0YVsgOF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbMTRdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWzEzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7CisgICAgZGF0YVsgMV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgN10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7CisgICAgZGF0YVsgMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVstMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMF0gKyAyKSA+PiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgbGVmdCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDVdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDddID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDldID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOworICAgIGRhdGFbMTFdID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyAxKSA+PiAxOworICAgIGRhdGFbMTJdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIHVwIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyAxXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgM10gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsgNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDVdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA3XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTBdID0gbGVmdFszXTsKKyAgICBkYXRhWzExXSA9IGxlZnRbM107CisgICAgZGF0YVsxMl0gPSBsZWZ0WzNdOworICAgIGRhdGFbMTNdID0gbGVmdFszXTsKKyAgICBkYXRhWzE0XSA9IGxlZnRbM107CisgICAgZGF0YVsxNV0gPSBsZWZ0WzNdOworCit9CisKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogV3JpdGU0eDRUbzE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBXcml0ZSBhIDR4NCBibG9jayAoZGF0YTR4NCkgaW50byBjb3JyZWN0IHBvc2l0aW9uCisgICAgICAgICAgaW4gMTZ4MTYgbWFjcm9ibG9jayAoZGF0YSkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5OworICAgIHUzMiAqaW4zMiwgKm91dDMyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGRhdGE0eDQpOworICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKKworICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07CisKKyAgICBkYXRhICs9IHkqMTYreDsKKworICAgIEFTU0VSVCgoKHUzMilkYXRhJjB4MykgPT0gMCk7CisKKyAgICAvKmxpbnQgLS1lKDgyNikgKi8KKyAgICBvdXQzMiA9ICh1MzIgKilkYXRhOworICAgIC8qbGludCAtLWUoODI2KSAqLworICAgIGluMzIgPSAodTMyICopZGF0YTR4NDsKKworICAgIG91dDMyWzBdID0gKmluMzIrKzsKKyAgICBvdXQzMls0XSA9ICppbjMyKys7CisgICAgb3V0MzJbOF0gPSAqaW4zMisrOworICAgIG91dDMyWzEyXSA9ICppbjMyKys7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBvZiBhIGJsb2NrIGJhc2VkIG9uIHRoZQorICAgICAgICAgIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcyBhbmQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gc3RyZWFtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKKyAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIG1vZGUxLCBtb2RlMjsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisgICAgLyogZGMgb25seSBwcmVkaWN0aW9uPyAqLworICAgIGlmICghYXZhaWxhYmxlKQorICAgICAgICBtb2RlMSA9IDI7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcE1iID0gbk1iQTsKKyAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYi0+aW50cmE0eDRQcmVkTW9kZVtuQS0+aW5kZXhdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1vZGUxID0gMjsKKworICAgICAgICBwTWIgPSBuTWJCOworICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUyID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25CLT5pbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9kZTIgPSAyOworCisgICAgICAgIG1vZGUxID0gTUlOKG1vZGUxLCBtb2RlMik7CisgICAgfQorCisgICAgaWYgKCFwTWJMYXllci0+bWJQcmVkLnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpbmRleF0pCisgICAgeworICAgICAgICBpZiAocE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSA8IG1vZGUxKQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF0gKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKG1vZGUxKTsKK30KKworCisvKmxpbnQgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjUyYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAorI2RlZmluZSBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit1MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKTsKKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Cit1MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCisgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKwordTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7CisKK3ZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSk7CisKKyNlbHNlCisKK3UzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcEltYWdlLCB1MzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jayk7CisKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCisjZW5kaWYKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiM2U3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKKyAgICAgICAgICBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKKyAgICAgICAgICBoMjY0YnNkTnVtTWJQYXJ0CisgICAgICAgICAgaDI2NGJzZE51bVN1Yk1iUGFydAorICAgICAgICAgIERlY29kZU1iUHJlZAorICAgICAgICAgIERlY29kZVN1Yk1iUHJlZAorICAgICAgICAgIERlY29kZVJlc2lkdWFsCisgICAgICAgICAgRGV0ZXJtaW5lTmMKKyAgICAgICAgICBDYnBJbnRyYTE2eDE2CisgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgorICAgICAgICAgIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisgICAgICAgICAgUHJvY2Vzc1Jlc2lkdWFsCisgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyBjb25zdCB1MzIgY2hyb21hSW5kZXhbOF0gPSB7IDI1NiwgMjYwLCAyODgsIDI5MiwgMzIwLCAzMjQsIDM1MiwgMzU2IH07CitzdGF0aWMgY29uc3QgdTMyIGx1bWFJbmRleFsxNl0gPSB7ICAgMCwgICA0LCAgNjQsICA2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgMTIsICA3MiwgIDc2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDEzMiwgMTkyLCAxOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNiwgMTQwLCAyMDAsIDIwNCB9OworI2VuZGlmCisvKiBtYXBwaW5nIG9mIGRjIGNvZWZmaWNpZW50cyBhcnJheSB0byBsdW1hIGJsb2NrcyAqLworc3RhdGljIGNvbnN0IHUzMiBkY0NvZWZmSW5kZXhbMTZdID0KKyAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKKyAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpOworc3RhdGljIHUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybik7CisKKyNpZmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpOworI2Vsc2UKK3N0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpOworI2VuZGlmCisKK3N0YXRpYyB1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpOworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyB1MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOworc3RhdGljIHUzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApOworc3RhdGljIHUzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKKworCisjZWxzZQorc3RhdGljIHUzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgcE1iICAgICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgc2xpY2VUeXBlICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBzbGljZQorICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSAgIG1heGltdW0gcmVmZXJlbmNlIGluZGV4CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwTWJMYXllciAgICAgICAgICBzdG9yZXMgdGhlIG1hY3JvYmxvY2sgZGF0YSBwYXJzZWQgZnJvbSBzdHJlYW0KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisgICAgbWJQYXJ0UHJlZE1vZGVfZSBwYXJ0TW9kZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKworI2lmZGVmIEgyNjRERUNfTkVPTgorICAgIGgyNjRic2RDbGVhck1iTGF5ZXIocE1iTGF5ZXIsICgoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGKSk7CisjZWxzZQorICAgIEgyNjRTd0RlY01lbXNldChwTWJMYXllciwgMCwgc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSk7CisjZW5kaWYKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisKKyAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDYpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyA2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCh2YWx1ZSArIDEpID4gMzEgfHwgdG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSA9IChtYlR5cGVfZSkodmFsdWUgKyAxKTsKKyAgICB9CisKKyAgICBpZiAocE1iTGF5ZXItPm1iVHlwZSA9PSBJX1BDTSkKKyAgICB7CisgICAgICAgIGkzMiAqbGV2ZWw7CisgICAgICAgIHdoaWxlKCAhaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBjbV9hbGlnbm1lbnRfemVyb19iaXQgKi8KKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldmVsID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzg0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICpsZXZlbCsrID0gKGkzMil2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJ0TW9kZSA9IGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgaWYgKCAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVEVSKSAmJgorICAgICAgICAgICAgIChoMjY0YnNkTnVtTWJQYXJ0KHBNYkxheWVyLT5tYlR5cGUpID09IDQpICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gRGVjb2RlU3ViTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5zdWJNYlByZWQsCisgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IERlY29kZU1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+bWJQcmVkLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICBpZiAocGFydE1vZGUgIT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQocFN0cm1EYXRhLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgKHUzMikocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gQ2JwSW50cmExNngxNihwTWJMYXllci0+bWJUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuIHx8CisgICAgICAgICAgICAgKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCAoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkgKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBNYkxheWVyLT5tYlFwRGVsdGEgPSBpdG1wOworCisgICAgICAgICAgICB0bXAgPSBEZWNvZGVSZXNpZHVhbChwU3RybURhdGEsICZwTWJMYXllci0+cmVzaWR1YWwsIHBNYiwKKyAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4pOworCisgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPQorICAgICAgICAgICAgICAgICh1MzIpKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zIC0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCkgKiA4ICsKKyAgICAgICAgICAgICAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RNYlBhcnRQcmVkTW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIG9mIGEgbWFjcm9ibG9jayB0eXBlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iVHlwZSA8PSAzMSk7CisKKyAgICBpZiAoKG1iVHlwZSA8PSBQXzh4OHJlZjApKQorICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVEVSKTsKKyAgICBlbHNlIGlmIChtYlR5cGUgPT0gSV80eDQpCisgICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkE0eDQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTE2eDE2KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROdW1NYlBhcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBtYWNyb2Jsb2NrIHBhcnRpdGlvbnMgaW4gYSBtYWNyb2Jsb2NrIHR5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2ROdW1NYlBhcnQobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKKworICAgIHN3aXRjaCAobWJUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgorICAgICAgICBjYXNlIFBfU2tpcDoKKyAgICAgICAgICAgIHJldHVybigxKTsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF84eDggb3IgUF84eDhyZWYwICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oNCk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE51bVN1Yk1iUGFydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIHN1Yi1wYXJ0aXRpb25zIGluIGEgc3ViLW1hY3JvYmxvY2sgdHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChzdWJNYlR5cGUgPD0gUF9MMF80eDQpOworCisgICAgc3dpdGNoIChzdWJNYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfTDBfOHg4OgorICAgICAgICAgICAgcmV0dXJuKDEpOworCisgICAgICAgIGNhc2UgUF9MMF84eDQ6CisgICAgICAgIGNhc2UgUF9MMF80eDg6CisgICAgICAgICAgICByZXR1cm4oMik7CisKKyAgICAgICAgLyogUF9MMF80eDQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybig0KTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlCisgICAgICAgICAgaW4gJ3BNYlByZWQnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsIG1iVHlwZV9lIG1iVHlwZSwKKyAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocE1iUHJlZCk7CisKKyAgICBzd2l0Y2ggKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpKQorICAgIHsKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5URVI6IC8qIFBSRURfTU9ERV9JTlRFUiAqLworICAgICAgICAgICAgaWYgKG51bVJlZklkeEFjdGl2ZSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlZklkeEwwW2pdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcE1iUHJlZC0+bXZkTDBbal0udmVyID0gKGkxNilpdG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkE0eDQ6CisgICAgICAgICAgICBmb3IgKGl0bXAgPSAwLCBpID0gMDsgaXRtcCA8IDI7IGl0bXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgICAgICAgICAgdG1wID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA4OyBqLS07IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAmIDB4ODAwMDAwMDAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICghcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZW1JbnRyYTR4NFByZWRNb2RlW2ldID0gdmFsdWU+PjI5OworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKyAzKnRtcCkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBQUkVEX01PREVfSU5UUkExNngxNjoKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcE1iUHJlZC0+aW50cmFDaHJvbWFQcmVkTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJNYlByZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHN1Yi1tYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZAorICAgICAgICAgIHN0b3JlIGluICdwTWJQcmVkJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAorICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdWJNYlByZWQpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldID0gKHN1Yk1iVHlwZV9lKXZhbHVlOworICAgIH0KKworICAgIGlmICggKG51bVJlZklkeEFjdGl2ZSA+IDEpICYmIChtYlR5cGUgIT0gUF84eDhyZWYwKSApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICh1MzIpKG51bVJlZklkeEFjdGl2ZSA+IDIpKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5yZWZJZHhMMFtpXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICBmb3IgKHZhbHVlID0gaDI2NGJzZE51bVN1Yk1iUGFydChwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOworICAgICAgICAgICAgIHZhbHVlLS07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0uaG9yID0gKGkxNilpdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS52ZXIgPSAoaTE2KWl0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisjaWZkZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAorICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiBibG9ja0NvZGVkOworICAgIHUzMiBibG9ja0luZGV4OworICAgIHUzMiBpczE2eDE2OworICAgIE9NWF9JTlQgbmM7CisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICBPTVhfVTggKnBQb3NDb2VmQnVmOworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzaWR1YWwpOworCisgICAgcFBvc0NvZWZCdWYgPSBwUmVzaWR1YWwtPnBvc0NvZWZCdWY7CisKKyAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCisgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAxNik7CisjZW5kaWYKKyAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKKworICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQorICAgIHsKKyAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KKyAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOworICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKKyAgICAgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLGJsb2NrSW5kZXgscFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKKyAgICAgICAgICAgICAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworI2lmbmRlZiBIMjY0REVDX05FT04KKyAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7CisgICAgfQorCisgICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKKyAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYpOworI2Vsc2UKKyAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICA0KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogY2hyb21hIEFDICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAxNSk7CisjZWxzZQorICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKKyAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICBuYywKKyAgICAgICAgICAgICAgICAgICAgMTUpOworI2VuZGlmCisgICAgICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKKyAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaiwgdG1wOworICAgIGkzMiBuYzsKKyAgICB1MzIgYmxvY2tDb2RlZDsKKyAgICB1MzIgYmxvY2tJbmRleDsKKyAgICB1MzIgaXMxNngxNjsKKyAgICBpMzIgKCpsZXZlbClbMTZdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlc2lkdWFsKTsKKworICAgIGxldmVsID0gcFJlc2lkdWFsLT5sZXZlbDsKKworICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgeworICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjRdLCBuYywgMTYpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKKyAgICB7CisgICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCisgICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKKyAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7CisgICAgICAgIGlmIChibG9ja0NvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0sIG5jLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSB0bXAgPj4gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSwgLTEsIDQpOworICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI1XSs0LCAtMSwgNCk7CisgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgIH0KKworICAgIC8qIGNocm9tYSBBQyAqLworICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKKyAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSArIDEsIG5jLCAxNSk7CisgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7CisgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiAxNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGV0ZXJtaW5lTmMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIG5DIG9mIGEgYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgSDI2NERFQ19PTVhETAordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCB1OCAqcFRvdGFsQ29lZmYpCisjZWxzZQordTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKQorI2VuZGlmCit7CisvKmxpbnQgLWU3MDIgKi8KKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICBpMzIgbjsKKyAgICBjb25zdCBuZWlnaGJvdXJfdCAqbmVpZ2hib3VyQSwgKm5laWdoYm91ckI7CisgICAgdTggbmVpZ2hib3VyQWluZGV4LCBuZWlnaGJvdXJCaW5kZXg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOworCisgICAgLyogaWYgbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgdG8gY3VycmVudCBtYWNyb2Jsb2NrIHRvdGFsQ29lZmYgYXJyYXkKKyAgICAgKiBtYlN0b3JhZ2UgaGFzIG5vdCBiZWVuIHNldC91cGRhdGVkIHlldCAtPiB1c2UgcFRvdGFsQ29lZmYgKi8KKyAgICBuZWlnaGJvdXJBID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJCID0gaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9ja0luZGV4KTsKKyAgICBuZWlnaGJvdXJBaW5kZXggPSBuZWlnaGJvdXJBLT5pbmRleDsKKyAgICBuZWlnaGJvdXJCaW5kZXggPSBuZWlnaGJvdXJCLT5pbmRleDsKKyAgICBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUiAmJiBuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQorICAgIHsKKyAgICAgICAgbiA9IChwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsKKyAgICAgICAgICAgICBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSk+PjE7CisgICAgfQorICAgIGVsc2UgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIpCisgICAgeworICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKKyAgICB7CisgICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOworICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdICsgMSkgPj4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuID0gdG1wID0gMDsKKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF07CisgICAgICAgICAgICB0bXAgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpID4+IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCh1MzIpbik7CisvKmxpbnQgK2U3MDIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDYnBJbnRyYTE2eDE2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBjb2RlZCBibG9jayBwYXR0ZXJuIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgQ2JwSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGNicDsKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOworCisgICAgaWYgKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8xKQorICAgICAgICBjYnAgPSAxNTsKKyAgICBlbHNlCisgICAgICAgIGNicCA9IDA7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCkgPj4gMjsKKyAgICBpZiAodG1wID4gMikKKyAgICAgICAgdG1wIC09IDM7CisKKyAgICBjYnAgKz0gdG1wIDw8IDQ7CisKKyAgICByZXR1cm4oY2JwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7CisKKyAgICAvKiB0bXAgaXMgMCBmb3IgSV8xNngxNl8wXzBfMCBtYiB0eXBlICovCisgICAgLyogaWdub3JlIGxpbnQgd2FybmluZyBvbiBhcml0aG1ldGljIG9uIGVudW0ncyAqLworICAgIHRtcCA9IC8qbGludCAtZSg2NTYpKi8obWJUeXBlIC0gSV8xNngxNl8wXzBfMCk7CisKKyAgICByZXR1cm4odG1wICYgMHgzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBEZWNvZGUgb25lIG1hY3JvYmxvY2sgYW5kIHdyaXRlIGludG8gb3V0cHV0IGltYWdlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIG1iTGF5ZXIgICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKKyAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgorICAgICAgICAgIHFwWSAgICAgICAgICAgcG9pbnRlciB0byBzbGljZSBRUAorICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgorICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIGRlY29kZWQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gb3V0cHV0IGltYWdlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1hY3JvYmxvY2sgZGVjb2RpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAorICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisgICAgbWJUeXBlX2UgbWJUeXBlOworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICBjb25zdCB1OCAqcFNyYzsKKyNlbmRpZgorLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKHBNYkxheWVyKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKyAgICBBU1NFUlQocXBZICYmICpxcFkgPCA1Mik7CisgICAgQVNTRVJUKG1iTnVtIDwgY3VyckltYWdlLT53aWR0aCpjdXJySW1hZ2UtPmhlaWdodCk7CisKKyAgICBtYlR5cGUgPSBwTWJMYXllci0+bWJUeXBlOworICAgIHBNYi0+bWJUeXBlID0gbWJUeXBlOworCisgICAgcE1iLT5kZWNvZGVkKys7CisKKyAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKKworICAgIGlmIChtYlR5cGUgPT0gSV9QQ00pCisgICAgeworICAgICAgICB1OCAqcERhdGEgPSAodTgqKWRhdGE7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICB1OCAqdG90ID0gcE1iLT50b3RhbENvZWZmOworI2Vsc2UKKyAgICAgICAgaTE2ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7CisjZW5kaWYKKyAgICAgICAgaTMyICpsZXYgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07CisKKyAgICAgICAgcE1iLT5xcFkgPSAwOworCisgICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKKyAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgICAgICAgICAqdG90KysgPSAxNjsKKyAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAyNDsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgKnRvdCsrID0gMTY7CisgICAgICAgICAgICBmb3IgKHRtcCA9IDE2OyB0bXAtLTspCisgICAgICAgICAgICAgICAgKnBEYXRhKysgPSAodTgpKCpsZXYrKyk7CisgICAgICAgIH0KKyAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsICh1OCopZGF0YSk7CisKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCisgICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChtYlR5cGUgIT0gUF9Ta2lwKQorICAgICAgICB7CisgICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkocE1iLT50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC50b3RhbENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBxcFkgKi8KKyAgICAgICAgICAgIGlmIChwTWJMYXllci0+bWJRcERlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpxcFkgPSAqcXBZICsgcE1iTGF5ZXItPm1iUXBEZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoKnFwWSA8IDApICpxcFkgKz0gNTI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKnFwWSA+PSA1MikgKnFwWSAtPSA1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOworCisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICAgICAgcFNyYyA9IHBNYkxheWVyLT5yZXNpZHVhbC5wb3NDb2VmQnVmOworCisgICAgICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9NWFJlc3VsdCByZXM7CisgICAgICAgICAgICAgICAgdTggKnA7CisgICAgICAgICAgICAgICAgdTggKnRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsIHAsIDAsIHAsIDE2LCAxNiwgKnFwWSwgKnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKHBNYiwgZGF0YSwgJnBTcmMpOworCisjZWxzZQorICAgICAgICAgICAgdG1wID0gUHJvY2Vzc1Jlc2lkdWFsKHBNYiwgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5jb2VmZk1hcCk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChwTWItPnRvdGFsQ29lZmYsIDAsIDI3KnNpemVvZigqcE1iLT50b3RhbENvZWZmKSk7CisgICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKKyAgICAgICAgfQorI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KKyAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOworCisgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKKyNlbHNlCisgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYVByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgY3VyckltYWdlLCBtYk51bSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsICh1OCopZGF0YSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAorICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKworI2lmZGVmIEgyNjRERUNfT01YREwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgY2hyb21hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKQoreworICAgIHUzMiBpOworICAgIHUzMiBjaHJvbWFRcDsKKyAgICBpMTYgKnBEYzsKKyAgICBpMTYgZGNbNCArIDRdID0gezAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLworICAgIGNocm9tYVFwID0KKyAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOworCisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKKyAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNl0pCisgICAgeworICAgICAgICBwRGMgPSBkYys0OworICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOworICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgIH0KKworICAgIHBEYyA9IGRjOworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmYgKyAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwRGMrKywgdG90YWxDb2VmZisrKQorICAgIHsKKyAgICAgICAgLyogY2hyb21hIHByZWRpY3Rpb24gKi8KKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBkYXRhICsgY2hyb21hSW5kZXhbaV07CisgICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICBwRGMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXAsCisgICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4KiogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQoreworICAgIHUzMiBpOworICAgIGkxNiAqcERjOworICAgIGkxNiBkY1sxNl0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTggKnRvdGFsQ29lZmY7CisgICAgT01YUmVzdWx0IHJlc3VsdDsKKyAgICB1OCAqcDsKKworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisKKyAgICBpZiAodG90YWxDb2VmZlsyNF0pCisgICAgeworICAgICAgICBwRGMgPSBkYzsKKyAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgfQorICAgIC8qIEludHJhIDE2eDE2IHByZWQgKi8KKyAgICBpZiAoaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgaW1hZ2UtPmx1bWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKKyAgICB7CisgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOworICAgICAgICBwRGMgPSAmZGNbZGNDb2VmZkluZGV4W2ldXTsKKyAgICAgICAgaWYgKCp0b3RhbENvZWZmIHx8ICpwRGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBpbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCisgICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICoqcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKK3sKKyAgICB1MzIgaTsKKyAgICB1OCAqdG90YWxDb2VmZjsKKyAgICBPTVhSZXN1bHQgcmVzdWx0OworICAgIHU4ICpwOworCisgICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCisgICAgeworICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKKyAgICAgICAgaWYgKGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24ocE1iLCBwLCBtYkxheWVyLCBpbWFnZS0+bHVtYSwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPndpZHRoKjE2LCBjb25zdHJhaW5lZEludHJhUHJlZCwgaSkgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmICgqdG90YWxDb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZLAorICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKKyAgICAgICAgICAgICAgICBpbWFnZSwKKyAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKKyAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4gSEFOVFJPX09LOworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJvY2Vzc1Jlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIG9uZSBtYWNyb2Jsb2NrIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBQcm9jZXNzUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgaTMyIHJlc2lkdWFsTGV2ZWxbXVsxNl0sIHUzMiAqY29lZmZNYXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIGNocm9tYVFwOworICAgIGkzMiAoKmJsb2NrRGF0YSlbMTZdOworICAgIGkzMiAoKmJsb2NrRGMpWzE2XTsKKyAgICBpMTYgKnRvdGFsQ29lZmY7CisgICAgaTMyICpjaHJvbWFEYzsKKyAgICBjb25zdCB1MzIgKmRjQ29lZmZJZHg7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWIpOworICAgIEFTU0VSVChyZXNpZHVhbExldmVsKTsKKworICAgIC8qIHNldCBwb2ludGVycyB0byBEQyBjb2VmZmljaWVudCBibG9ja3MgKi8KKyAgICBibG9ja0RjID0gcmVzaWR1YWxMZXZlbCArIDI0OworCisgICAgYmxvY2tEYXRhID0gcmVzaWR1YWxMZXZlbDsKKyAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOworICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgaWYgKHRvdGFsQ29lZmZbMjRdKQorICAgICAgICB7CisgICAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYygqYmxvY2tEYywgcE1iLT5xcFkpOworICAgICAgICB9CisgICAgICAgIGRjQ29lZmZJZHggPSBkY0NvZWZmSW5kZXg7CisKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGx1bWEgYmxvY2sgKi8KKyAgICAgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICgqYmxvY2tEYylbKmRjQ29lZmZJZHgrK107CisgICAgICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAxLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIHBNYi0+cXBZLCAwLCAqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KKyAgICBjaHJvbWFRcCA9CisgICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSB8fCBwTWItPnRvdGFsQ29lZmZbMjZdKQorICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKHJlc2lkdWFsTGV2ZWxbMjVdLCBjaHJvbWFRcCk7CisgICAgY2hyb21hRGMgPSByZXNpZHVhbExldmVsWzI1XTsKKyAgICBmb3IgKGkgPSA4OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCisgICAgeworICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgY2hyb21hIGJsb2NrICovCisgICAgICAgICgqYmxvY2tEYXRhKVswXSA9ICpjaHJvbWFEYysrOworICAgICAgICBpZiAoKCpibG9ja0RhdGEpWzBdIHx8ICp0b3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBjaHJvbWFRcCwgMSwqY29lZmZNYXApICE9CisgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3ViTWJQYXJ0TW9kZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgbWFjcm9ibG9jaydzIHN1Yi1wYXJ0aXRpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN1Yk1iVHlwZSA8IDQpOworCisgICAgcmV0dXJuKChzdWJNYlBhcnRNb2RlX2Upc3ViTWJUeXBlKTsKKworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyYmMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSAorI2RlZmluZSBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgYSBtYiBpcyBhbiBpbnRyYSBtYiAqLworI2RlZmluZSBJU19JTlRSQV9NQihhKSAoKGEpLm1iVHlwZSA+IDUpCisKKy8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIElfUENNIG1iICovCisjZGVmaW5lIElTX0lfUENNX01CKGEpICgoYSkubWJUeXBlID09IDMxKQorCit0eXBlZGVmIGVudW0geworICAgIFBfU2tpcCAgICAgICAgICA9IDAsCisgICAgUF9MMF8xNngxNiAgICAgID0gMSwKKyAgICBQX0wwX0wwXzE2eDggICAgPSAyLAorICAgIFBfTDBfTDBfOHgxNiAgICA9IDMsCisgICAgUF84eDggICAgICAgICAgID0gNCwKKyAgICBQXzh4OHJlZjAgICAgICAgPSA1LAorICAgIElfNHg0ICAgICAgICAgICA9IDYsCisgICAgSV8xNngxNl8wXzBfMCAgID0gNywKKyAgICBJXzE2eDE2XzFfMF8wICAgPSA4LAorICAgIElfMTZ4MTZfMl8wXzAgICA9IDksCisgICAgSV8xNngxNl8zXzBfMCAgID0gMTAsCisgICAgSV8xNngxNl8wXzFfMCAgID0gMTEsCisgICAgSV8xNngxNl8xXzFfMCAgID0gMTIsCisgICAgSV8xNngxNl8yXzFfMCAgID0gMTMsCisgICAgSV8xNngxNl8zXzFfMCAgID0gMTQsCisgICAgSV8xNngxNl8wXzJfMCAgID0gMTUsCisgICAgSV8xNngxNl8xXzJfMCAgID0gMTYsCisgICAgSV8xNngxNl8yXzJfMCAgID0gMTcsCisgICAgSV8xNngxNl8zXzJfMCAgID0gMTgsCisgICAgSV8xNngxNl8wXzBfMSAgID0gMTksCisgICAgSV8xNngxNl8xXzBfMSAgID0gMjAsCisgICAgSV8xNngxNl8yXzBfMSAgID0gMjEsCisgICAgSV8xNngxNl8zXzBfMSAgID0gMjIsCisgICAgSV8xNngxNl8wXzFfMSAgID0gMjMsCisgICAgSV8xNngxNl8xXzFfMSAgID0gMjQsCisgICAgSV8xNngxNl8yXzFfMSAgID0gMjUsCisgICAgSV8xNngxNl8zXzFfMSAgID0gMjYsCisgICAgSV8xNngxNl8wXzJfMSAgID0gMjcsCisgICAgSV8xNngxNl8xXzJfMSAgID0gMjgsCisgICAgSV8xNngxNl8yXzJfMSAgID0gMjksCisgICAgSV8xNngxNl8zXzJfMSAgID0gMzAsCisgICAgSV9QQ00gICAgICAgICAgID0gMzEKK30gbWJUeXBlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUF9MMF84eDggPSAwLAorICAgIFBfTDBfOHg0ID0gMSwKKyAgICBQX0wwXzR4OCA9IDIsCisgICAgUF9MMF80eDQgPSAzCit9IHN1Yk1iVHlwZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1BfMTZ4MTYgPSAwLAorICAgIE1CX1BfMTZ4OCwKKyAgICBNQl9QXzh4MTYsCisgICAgTUJfUF84eDgKK30gbWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIE1CX1NQXzh4OCA9IDAsCisgICAgTUJfU1BfOHg0LAorICAgIE1CX1NQXzR4OCwKKyAgICBNQl9TUF80eDQKK30gc3ViTWJQYXJ0TW9kZV9lOworCit0eXBlZGVmIGVudW0geworICAgIFBSRURfTU9ERV9JTlRSQTR4NCA9IDAsCisgICAgUFJFRF9NT0RFX0lOVFJBMTZ4MTYgICwKKyAgICBQUkVEX01PREVfSU5URVIKK30gbWJQYXJ0UHJlZE1vZGVfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE12UHJlZGljdGlvbjE2eDE2IGFzc3VtZXMgdGhhdCBNVnMgYXJlIDE2Yml0cyAqLworICAgIGkxNiBob3I7CisgICAgaTE2IHZlcjsKK30gbXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJldkludHJhNHg0UHJlZE1vZGVGbGFnWzE2XTsKKyAgICB1MzIgcmVtSW50cmE0eDRQcmVkTW9kZVsxNl07CisgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGU7CisgICAgdTMyIHJlZklkeEwwWzRdOworICAgIG12X3QgbXZkTDBbNF07Cit9IG1iUHJlZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZVs0XTsKKyAgICB1MzIgcmVmSWR4TDBbNF07CisgICAgbXZfdCBtdmRMMFs0XVs0XTsKK30gc3ViTWJQcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgIHU4IHBvc0NvZWZCdWZbMjcqMTYqM107CisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIGkzMiBsZXZlbFsyNl1bMTZdOworICAgIHUzMiBjb2VmZk1hcFsyNF07Cit9IHJlc2lkdWFsX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWJUeXBlX2UgbWJUeXBlOworICAgIHUzMiBjb2RlZEJsb2NrUGF0dGVybjsKKyAgICBpMzIgbWJRcERlbHRhOworICAgIG1iUHJlZF90IG1iUHJlZDsKKyAgICBzdWJNYlByZWRfdCBzdWJNYlByZWQ7CisgICAgcmVzaWR1YWxfdCByZXNpZHVhbDsKK30gbWFjcm9ibG9ja0xheWVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1iU3RvcmFnZQoreworICAgIG1iVHlwZV9lIG1iVHlwZTsKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgaTMyIGZpbHRlck9mZnNldEE7CisgICAgaTMyIGZpbHRlck9mZnNldEI7CisgICAgdTMyIHFwWTsKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggdG90YWxDb2VmZlsyN107CisjZWxzZQorICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKKyNlbmRpZgorICAgIHU4IGludHJhNHg0UHJlZE1vZGVbMTZdOworICAgIHUzMiByZWZQaWNbNF07CisgICAgdTgqIHJlZkFkZHJbNF07CisgICAgbXZfdCBtdlsxNl07CisgICAgdTMyIGRlY29kZWQ7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJBOworICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQjsKKyAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkM7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJEOworfSBtYlN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpOworCit1MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpOwordTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKKworc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKKyAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSk7CisKK3UzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7CisKK21iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSk7CisjaWZkZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENsZWFyTWJMYXllcihtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIHUzMiBzaXplKTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NGM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVOYWxVbml0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTmFsVW5pdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwTmFsVW5pdCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOworCisgICAgLyogZm9yYmlkZGVuX3plcm9fYml0IChub3QgY2hlY2tlZCB0byBiZSB6ZXJvLCBlcnJvcnMgaWdub3JlZCkgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIEFzc3VtaW5nIHRoYXQgTkFMIHVuaXQgc3RhcnRzIGZyb20gYnl0ZSBib3VuZGFyeSCtPiBkb24ndCBoYXZlIHRvIGNoZWNrCisgICAgICogZm9sbG93aW5nIDcgYml0cyBmb3IgRU5EX09GX1NUUkVBTSAqLworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICBwTmFsVW5pdC0+bmFsUmVmSWRjID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPSAobmFsVW5pdFR5cGVfZSl0bXA7CisKKyAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLworICAgIGlmICggKHRtcCA9PSAyKSB8fCAodG1wID09IDMpIHx8ICh0bXAgPT0gNCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGlmICggKCAodG1wID09IE5BTF9TRVFfUEFSQU1fU0VUKSB8fCAodG1wID09IE5BTF9QSUNfUEFSQU1fU0VUKSB8fAorICAgICAgICAgICAodG1wID09IE5BTF9DT0RFRF9TTElDRV9JRFIpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLworICAgIGVsc2UgaWYgKCAoICh0bXAgPT0gTkFMX1NFSSkgfHwgKHRtcCA9PSBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSKSB8fAorICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0VORF9PRl9TRVFVRU5DRSkgfHwgKHRtcCA9PSBOQUxfRU5EX09GX1NUUkVBTSkgfHwKKyAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODk1N2JmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19OQUxfVU5JVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgTkFMIHVuaXQgcG9pbnRlZCBieSBwTmFsVW5pdCBjb250YWlucyBhbiBJRFIgc2xpY2UgKi8KKyNkZWZpbmUgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSBcCisgICAgKChwTmFsVW5pdCktPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBOQUxfQ09ERURfU0xJQ0UgPSAxLAorICAgIE5BTF9DT0RFRF9TTElDRV9JRFIgPSA1LAorICAgIE5BTF9TRUkgPSA2LAorICAgIE5BTF9TRVFfUEFSQU1fU0VUID0gNywKKyAgICBOQUxfUElDX1BBUkFNX1NFVCA9IDgsCisgICAgTkFMX0FDQ0VTU19VTklUX0RFTElNSVRFUiA9IDksCisgICAgTkFMX0VORF9PRl9TRVFVRU5DRSA9IDEwLAorICAgIE5BTF9FTkRfT0ZfU1RSRUFNID0gMTEsCisgICAgTkFMX0ZJTExFUl9EQVRBID0gMTIsCisgICAgTkFMX01BWF9UWVBFX1ZBTFVFID0gMzEKK30gbmFsVW5pdFR5cGVfZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlOworICAgIHUzMiBuYWxSZWZJZGM7Cit9IG5hbFVuaXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U1ZWVmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisgICAgICAgICAgaDI2NGJzZEdldE5laWdoYm91ck1iCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQorICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKKyAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvbGxvd2luZyBmb3VyIHRhYmxlcyBpbmRpY2F0ZSBuZWlnaGJvdXJzIG9mIGVhY2ggYmxvY2sgb2YgYSBtYWNyb2Jsb2NrLgorICogRmlyc3QgMTYgdmFsdWVzIGFyZSBmb3IgbHVtYSBibG9ja3MsIG5leHQgNCB2YWx1ZXMgZm9yIENiIGFuZCBsYXN0IDQKKyAqIHZhbHVlcyBmb3IgQ3IuIEVsZW1lbnRzIG9mIHRoZSB0YWJsZSBpbmRpY2F0ZSB0byB3aGljaCBtYWNyb2Jsb2NrIHRoZQorICogbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmVpZ2hib3VyIGJsb2NrIGluIHF1ZXN0aW9uLgorICogSW5kZXhpbmcgb2YgdGhlIGJsb2NrcyBnb2VzIGFzIGZvbGxvd3MKKyAqCisgKiAgICAgICAgICBZICAgICAgICAgICAgIENiICAgICAgIENyCisgKiAgICAgIDAgIDEgIDQgIDUgICAgICAxNiAxNyAgICAyMCAyMQorICogICAgICAyICAzICA2ICA3ICAgICAgMTggMTkgICAgMjIgMjMKKyAqICAgICAgOCAgOSAxMiAxMworICogICAgIDEwIDExIDE0IDE1CisgKi8KKworLyogbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfNHg0QlsyNF0gPSB7CisgICAge01CX0EsNX0sICAgIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sCisgICAge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sCisgICAge01CX0EsMTN9LCAgIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sICAge01CX0NVUlIsMTB9LAorICAgIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0se01CX0NVUlIsMTF9LHtNQl9DVVJSLDE0fSwKKyAgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LHtNQl9BLDE5fSwgICB7TUJfQ1VSUiwxOH0sCisgICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSx7TUJfQSwyM30sICAge01CX0NVUlIsMjJ9IH07CisKKy8qIGFib3ZlIG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl80eDRCWzI0XSA9IHsKKyAgICB7TUJfQiwxMH0sICAge01CX0IsMTF9LCAgIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSwKKyAgICB7TUJfQiwxNH0sICAge01CX0IsMTV9LCAgIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSwKKyAgICB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSwKKyAgICB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxM30sCisgICAge01CX0IsMTh9LCAgIHtNQl9CLDE5fSwgICB7TUJfQ1VSUiwxNn0se01CX0NVUlIsMTd9LAorICAgIHtNQl9CLDIyfSwgICB7TUJfQiwyM30sICAge01CX0NVUlIsMjB9LHtNQl9DVVJSLDIxfSB9OworCisvKiBhYm92ZS1yaWdodCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfNHg0QlsyNF0gPSB7CisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX05BLDR9LAorICAgIHtNQl9CLDE1fSwgICB7TUJfQywxMH0sICAge01CX0NVUlIsNX0sIHtNQl9OQSwwfSwKKyAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9LAorICAgIHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sICAge01CX0NVUlIsMTN9LHtNQl9OQSw4fSwKKyAgICB7TUJfQiwxOX0sICAge01CX0MsMTh9LCAgIHtNQl9DVVJSLDE3fSx7TUJfTkEsMTZ9LAorICAgIHtNQl9CLDIzfSwgICB7TUJfQywyMn0sICAge01CX0NVUlIsMjF9LHtNQl9OQSwyMH0gfTsKKworLyogYWJvdmUtbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfNHg0QlsyNF0gPSB7CisgICAge01CX0QsMTV9LCAgIHtNQl9CLDEwfSwgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sCisgICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sCisgICAge01CX0EsN30sICAgIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sCisgICAge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LAorICAgIHtNQl9ELDE5fSwgICB7TUJfQiwxOH0sICAge01CX0EsMTd9LCAgIHtNQl9DVVJSLDE2fSwKKyAgICB7TUJfRCwyM30sICAge01CX0IsMjJ9LCAgIHtNQl9BLDIxfSwgICB7TUJfQ1VSUiwyMH0gfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgbWFjcm9ibG9jayBuZWlnaGJvdXJzLiBGdW5jdGlvbiBzZXRzIG5laWdoYm91cgorICAgICAgICAgICAgbWFjcm9ibG9jayBwb2ludGVycyBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8KKyAgICAgICAgICAgIG1hY3JvYmxvY2tzIG9uIHRoZSBsZWZ0LCBhYm92ZSwgYWJvdmUtcmlnaHQgYW5kIGFib3ZlLWxlZnQuCisgICAgICAgICAgICBQb2ludGVycyBhcmUgc2V0IE5VTEwgaWYgdGhlIG5laWdoYm91ciBkb2VzIG5vdCBmaXQgaW50byB0aGUKKyAgICAgICAgICAgIHBpY3R1cmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljV2lkdGggICAgICAgIHdpZHRoIG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbm8gbmVlZCB0byBjbGFyaWZ5CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBNYlN0b3JhZ2UgICAgICBuZWlnaGJvdXIgcG9pbnRlcnMgb2YgZWFjaCBtYlN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCisgICAgdTMyIHBpY1NpemVJbk1icykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcm93LCBjb2w7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWJTdG9yYWdlKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNXaWR0aCA8PSBwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVCgoKHBpY1NpemVJbk1icyAvIHBpY1dpZHRoKSAqIHBpY1dpZHRoKSA9PSBwaWNTaXplSW5NYnMpOworCisgICAgcm93ID0gY29sID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplSW5NYnM7IGkrKykKKyAgICB7CisKKyAgICAgICAgaWYgKGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gcE1iU3RvcmFnZSArIGkgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQSA9IE5VTEw7CisKKyAgICAgICAgaWYgKHJvdykKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJCID0gcE1iU3RvcmFnZSArIGkgLSBwaWNXaWR0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBOVUxMOworCisgICAgICAgIGlmIChyb3cgJiYgKGNvbCA8IHBpY1dpZHRoIC0gMSkpCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQyA9IHBNYlN0b3JhZ2UgKyBpIC0gKHBpY1dpZHRoIC0gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gTlVMTDsKKworICAgICAgICBpZiAocm93ICYmIGNvbCkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJEID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBOVUxMOworCisgICAgICAgIGNvbCsrOworICAgICAgICBpZiAoY29sID09IHBpY1dpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgICAgcm93Kys7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2suCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSBvZiB0aGUgbWFjcm9ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgbmVpZ2hib3VyIGlzIHdhbnRlZAorICAgICAgICAgICAgbmVpZ2hib3VyICAgaW5kaWNhdGVzIHdoaWNoIG5laWdoYm91ciBpcyB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBtYWNyb2Jsb2NrCisgICAgICAgICAgICBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworbWJTdG9yYWdlX3QqIGgyNjRic2RHZXROZWlnaGJvdXJNYihtYlN0b3JhZ2VfdCAqcE1iLCBuZWlnaGJvdXJNYl9lIG5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKChuZWlnaGJvdXIgPD0gTUJfQ1VSUikgfHwgKG5laWdoYm91ciA9PSBNQl9OQSkpOworCisgICAgaWYgKG5laWdoYm91ciA9PSBNQl9BKQorICAgICAgICByZXR1cm4ocE1iLT5tYkEpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9CKQorICAgICAgICByZXR1cm4ocE1iLT5tYkIpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DKQorICAgICAgICByZXR1cm4ocE1iLT5tYkMpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9EKQorICAgICAgICByZXR1cm4ocE1iLT5tYkQpOworICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DVVJSKQorICAgICAgICByZXR1cm4ocE1iKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihOVUxMKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9BXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhYm92ZSBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KKyAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0JfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLXJpZ2h0ICBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIKKyAgICAgICAgICAgIHRvIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0NfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlLWxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCisgICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICByZXR1cm4oTl9EXzR4NEIrYmxvY2tJbmRleCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgbmVpZ2hib3VyIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlLiBOZWlnaGJvdXIgbWFjcm9ibG9jaworICAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgaWYgaXQgaXMgd2l0aGluIHRoZSBwaWN0dXJlIGFuZCBiZWxvbmdzCisgICAgICAgICAgICB0byB0aGUgc2FtZSBzbGljZSBhcyB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgICAgcE5laWdoYm91ciAgcG9pbnRlciB0byB0aGUgbmVpZ2hib3VyIG1hY3JvYmxvY2sKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUUlVFICAgIG5laWdoYm91ciBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIEZBTFNFICAgbmVpZ2hib3VyIGlzIG5vdCBhdmFpbGFibGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIGlmICggKHBOZWlnaGJvdXIgPT0gTlVMTCkgfHwgKHBNYi0+c2xpY2VJZCAhPSBwTmVpZ2hib3VyLT5zbGljZUlkKSApCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmNlMGFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX05FSUdIQk9VUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTUJfQSA9IDAsCisgICAgTUJfQiwKKyAgICBNQl9DLAorICAgIE1CX0QsCisgICAgTUJfQ1VSUiwKKyAgICBNQl9OQSA9IDB4RkYKK30gbmVpZ2hib3VyTWJfZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5laWdoYm91ck1iX2UgICBtYjsKKyAgICB1OCAgICAgICAgICAgICBpbmRleDsKK30gbmVpZ2hib3VyX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAorICAgIHUzMiBwaWNTaXplSW5NYnMpOworCittYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKTsKKwordTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cik7CisKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KTsKK2NvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIyMzM1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIGEgcGljdHVyZS4gRnVuY3Rpb24gaW1wbGVtZW50cworICAgICAgICAgICAgY29tcHV0YXRpb24gb2YgYWxsIFBPQyB0eXBlcyAoMCwgMSBhbmQgMiksIHR5cGUgaXMgb2J0YWluZWQgZnJvbQorICAgICAgICAgICAgc3BzLiBTZWUgc3RhbmRhcmQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBQT0MgdHlwZXMgYW5kIGhvdyBQT0MgaXMKKyAgICAgICAgICAgIGNvbXB1dGVkIGZvciBlYWNoIHR5cGUuCisKKyAgICAgICAgICAgIEZ1bmN0aW9uIHJldHVybnMgdGhlIG1pbmltdW0gb2YgdG9wIGZpZWxkIGFuZCBib3R0b20gZmllbGQgcGljCisgICAgICAgICAgICBvcmRlciBjb3VudHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcG9jICAgICAgICAgcG9pbnRlciB0byBwcmV2aW91cyByZXN1bHRzCisgICAgICAgICAgICBzcHMgICAgICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHNsaWNIZWFkZXIgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIsIGZyYW1lIG51bWJlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHBhcmFtcyBuZWVkZWQgZm9yIFBPQyBjb21wdXRhdGlvbgorICAgICAgICAgICAgcE5hbFVuaXQgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHJ1ZSwgZnVuY3Rpb24gbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGtub3cgaWYgdGhpcyBpcyBhbiBJRFIgcGljdHVyZSBhbmQgYWxzbyBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBvYyAgICAgICAgIHJlc3VsdHMgc3RvcmVkIGhlcmUgZm9yIGNvbXB1dGF0aW9uIG9mIG5leHQgUE9DCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaTMyIGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwb2NTdG9yYWdlX3QgKnBvYywgc2VxUGFyYW1TZXRfdCAqc3BzLAorICAgIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgcGljT3JkZXJDbnQ7CisgICAgdTMyIGZyYW1lTnVtT2Zmc2V0LCBhYnNGcmFtZU51bSwgcGljT3JkZXJDbnRDeWNsZUNudDsKKyAgICB1MzIgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7CisgICAgaTMyIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOworICAgIHUzMiBjb250YWluc01tY281OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocG9jKTsKKyAgICBBU1NFUlQoc3BzKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKKyAgICBBU1NFUlQocE5hbFVuaXQpOworICAgIEFTU0VSVChzcHMtPnBpY09yZGVyQ250VHlwZSA8PSAyKTsKKworI2lmIDAKKyAgICAvKiBKYW5TYTogSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeSwgZG9uJ3Qgc2VlIGFueSByZWFzb24gdG8KKyAgICAgKiBpbmNyZW1lbnQgcHJldkZyYW1lTnVtIG9uZSBieSBvbmUgaW5zdGVhZCBvZiBvbmUgYmlnIGluY3JlbWVudC4KKyAgICAgKiBIb3dldmVyLCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCB0aGlzIHNob3VsZCBiZSBkb25lIC0+IGlmIHNvbWVvbmUKKyAgICAgKiBmaWd1cmVzIG91dCBhbnkgY2FzZSB3aGVuIHRoZSBvdXRjb21lIHdvdWxkIGJlIGRpZmZlcmVudCBmb3Igc3RlcCBieQorICAgICAqIHN0ZXAgaW5jcmVtZW50LCB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgKi8KKworICAgIC8qIGlmIHRoZXJlIHdhcyBhIGdhcCBpbiBmcmFtZSBudW1iZXJpbmcgYW5kIHBpY09yZGVyQ250VHlwZSBpcyAxIG9yIDIgLT4KKyAgICAgKiAiY29tcHV0ZSIgcGljIG9yZGVyIGNvdW50cyBmb3Igbm9uLWV4aXN0aW5nIGZyYW1lcy4gVGhlc2UgYXJlIG5vdAorICAgICAqIGFjdHVhbGx5IGNvbXB1dGVkLCBidXQgcHJvY2VzcyBuZWVkcyB0byBiZSBkb25lIHRvIHVwZGF0ZSB0aGUKKyAgICAgKiBwcmV2RnJhbWVOdW0gYW5kIHByZXZGcmFtZU51bU9mZnNldCAqLworICAgIGlmICggc3BzLT5waWNPcmRlckNudFR5cGUgPiAwICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9IHBvYy0+cHJldkZyYW1lTnVtICYmCisgICAgICAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtICE9ICgocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW0pKQorICAgIHsKKworICAgICAgICAvKiB1c2UgdmFyaWFibGUgaSBmb3IgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKi8KKyAgICAgICAgaSA9IChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisKKyAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IGk7CisKKyAgICAgICAgICAgIGkgPSAoaSArIDEpICUgc3BzLT5tYXhGcmFtZU51bTsKKworICAgICAgICB9IHdoaWxlIChpICE9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOworICAgIH0KKyNlbmRpZgorCisgICAgLyogY2hlY2sgaWYgY3VycmVudCBzbGljZSBpbmNsdWRlcyBtbWNvIGVxdWFsIHRvIDUgKi8KKyAgICBjb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOworICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcuYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCisgICAgeworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChzcHMtPnBpY09yZGVyQ250VHlwZSkKKyAgICB7CisKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogc2V0IHByZXZQaWNPcmRlckNudCB2YWx1ZXMgZm9yIElEUiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBwaWNPcmRlckNudE1zYiAoc3RvcmVkIGluIHBpY09yZGVyQ250IHZhcmlhYmxlKSAqLworICAgICAgICAgICAgaWYgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA8IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgorICAgICAgICAgICAgICAgICgocG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiKSA+PQorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiICsKKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPiBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKKyAgICAgICAgICAgICAgICAoKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgLSBwb2MtPnByZXZQaWNPcmRlckNudExzYikgPgorICAgICAgICAgICAgICAgICBzcHMtPm1heFBpY09yZGVyQ250THNiLzIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiIC0KKyAgICAgICAgICAgICAgICAgICAgKGkzMilzcHMtPm1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2I7CisKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudE1zYiBpcyBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCisgICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQorICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gcGljT3JkZXJDbnQ7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgdG9wIGZpZWxkIG9yZGVyIGNudCAoc3RvcmVkIGluIHBpY09yZGVyQ250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOworCisgICAgICAgICAgICAvKiBpZiBkZWx0YSBmb3IgYm90dG9tIGZpZWxkIGlzIG5lZ2F0aXZlIC0+IGJvdHRvbSB3aWxsIGJlIHRoZQorICAgICAgICAgICAgICogbWluaW11bSBwaWMgb3JkZXIgY291bnQgKi8KKyAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKworICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250THNiIGlzIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaWYgY3VycmVudCBmcmFtZSBjb250YWlucyBtbWNvNSAtPiBtb2RpZnkgdmFsdWVzIHRvIGJlCisgICAgICAgICAgICAgICAgICogc3RvcmVkICovCisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zTW1jbzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIHByZXZQaWNPcmRlckNudExzYiBzaG91bGQgYmUgdGhlIHRvcCBmaWVsZCBwaWNPcmRlckNudAorICAgICAgICAgICAgICAgICAgICAgKiBpZiBwcmV2aW91cyBmcmFtZSBpbmNsdWRlZCBtbWNvNS4gVG9wIGZpZWxkIHBpY09yZGVyQ250CisgICAgICAgICAgICAgICAgICAgICAqIGZvciBmcmFtZXMgY29udGFpbmluZyBtbWNvNSBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcGljT3JkZXJDbnQgZnJvbSBvcmlnaW5hbCB0b3AgZmllbGQgb3JkZXIgY291bnQgLT4KKyAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgaXMgemVybyBpZiB0b3AgZmllbGQgd2FzIHRoZSBtaW5pbXVtLCBpLmUuIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAqIGZvciBib3R0b20gd2FzIHBvc2l0aXZlLCBvdGhlcndpc2UgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogLWRlbHRhUGljT3JkZXJDbnRCb3R0b20gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoLXBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMSAoaW4gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzdGFuZGFyZCkgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBzdGVwIDIgKi8KKyAgICAgICAgICAgIGlmIChzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSA9IDA7CisKKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDAgJiYgYWJzRnJhbWVOdW0gPiAwKQorICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtIC09IDE7CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMyAqLworICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudEN5Y2xlQ250ID0KKyAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSkvc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7CisgICAgICAgICAgICAgICAgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPQorICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKSVzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RlcCA0ICovCisgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZSArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOworCisgICAgICAgICAgICAvKiBzdGVwIDUgKHBpY09yZGVyQ250IHVzZWQgdG8gc3RvcmUgZXhwZWN0ZWRQaWNPcmRlckNudCkgKi8KKyAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnRDeWNsZUNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlKSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY09yZGVyQ250Q3ljbGVDbnQgKiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworCisgICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yTm9uUmVmUGljOworCisgICAgICAgICAgICAvKiBzdGVwIDYgKHBpY09yZGVyQ250IGlzIHRvcCBmaWVsZCBvcmRlciBjbnQgaWYgZGVsdGEgZm9yIGJvdHRvbQorICAgICAgICAgICAgICogaXMgcG9zaXRpdmUsIG90aGVyd2lzZSBpdCBpcyBib3R0b20gZmllbGQgb3JkZXIgY250KSAqLworICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdOworCisgICAgICAgICAgICBpZiAoIChzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKworICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKKyAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKKyAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0CisgICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAyICovCisgICAgICAgICAgICAvKiBkZXJpdmUgZnJhbWVOdW1PZmZzZXQgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OworCisgICAgICAgICAgICAvKiBkZXJpdmUgcGljT3JkZXJDbnQgKHR5cGUgMiBoYXMgc2FtZSB2YWx1ZSBmb3IgdG9wIGFuZCBib3R0b20KKyAgICAgICAgICAgICAqIGZpZWxkIG9yZGVyIGNudHMpICovCisgICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKSAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPQorICAgICAgICAgICAgICAgICAgICAyICogKGkzMikoZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKKworICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCisgICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAorICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCisgICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudCkgYWx3YXlzIGluaXRpYWxpemVkICovCisgICAgcmV0dXJuKHBpY09yZGVyQ250KTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTc0MWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSAorI2RlZmluZSBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBjb21wdXRlZCBmb3IgcHJldmlvdXMgcGljdHVyZSwgbmVlZGVkIGZvcgorICogUE9DIGNvbXB1dGF0aW9uIG9mIGEgcGljdHVyZS4gVHdvIGZpcnN0IGZpZWxkcyBmb3IgUE9DIHR5cGUgMCwgbGFzdCB0d28KKyAqIGZvciB0eXBlcyAxIGFuZCAyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7CisgICAgaTMyIHByZXZQaWNPcmRlckNudE1zYjsKKyAgICB1MzIgcHJldkZyYW1lTnVtOworICAgIHUzMiBwcmV2RnJhbWVOdW1PZmZzZXQ7Cit9IHBvY1N0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCisgICAgc2xpY2VIZWFkZXJfdCAqc2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA0ZGVhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGxvb2t1cCB0YWJsZSBmb3IgY2VpbChsb2cyKG51bVNsaWNlR3JvdXBzKSksIGkuZS4gbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvCisgKiByZXByZXNlbnQgcmFuZ2UgWzAsIG51bVNsaWNlR3JvdXBzKQorICoKKyAqIE5PVEU6IGlmIE1BWF9OVU1fU0xJQ0VfR1JPVVBTIGlzIGhpZ2hlciB0aGFuIDggdGhpcyB0YWJsZSBoYXMgdG8gYmUgcmVzaXplZAorICogYWNjb3JkaW5nbHkgKi8KK3N0YXRpYyBjb25zdCB1MzIgQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1s4XSA9IHsxLCAxLCAyLCAyLCAzLCAzLCAzLCAzfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgorCisgICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgorICAgICAgICAgICAgICAgIC0gcnVuIGxlbmd0aHMgaWYgc2xpY2UgZ3JvdXAgbWFwIHR5cGUgaXMgMAorICAgICAgICAgICAgICAgIC0gdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodCBhcnJheXMgaWYgbWFwIHR5cGUgaXMgMgorICAgICAgICAgICAgICAgIC0gZm9yIHNsaWNlIGdyb3VwIGlkcyBpZiBtYXAgdHlwZSBpcyA2CisKKyAgICAgICAgICAgIFZhbGlkaXR5IG9mIHNvbWUgb2YgdGhlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gZGVwZW5kcworICAgICAgICAgICAgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgd2hpY2ggYXJlIG5vdCBrbm93biBoZXJlLiBUaGVyZWZvcmUgdGhlCisgICAgICAgICAgICB2YWxpZGl0eSBoYXMgdG8gYmUgY2hlY2tlZCBhZnRlcndhcmRzLCBjdXJyZW50bHkgaW4gdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgc2V0IGFjdGl2YXRpb24gcGhhc2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFBpY1BhcmFtU2V0LCAwLCBzaXplb2YocGljUGFyYW1TZXRfdCkpOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcsIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBFUFJJTlQoImVudHJvcHlfY29kaW5nX21vZGVfZmxhZyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPSB2YWx1ZSArIDE7CisgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiBNQVhfTlVNX1NMSUNFX0dST1VQUykKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3NsaWNlX2dyb3Vwc19taW51czEiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGRlY29kZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGlmIG1vcmUgdGhhbiBvbmUgc2xpY2UgZ3JvdXBzICovCisgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPiA2KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX21hcF90eXBlIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ydW5MZW5ndGhbaV0gPSB2YWx1ZSsxOworICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+dG9wTGVmdCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQsCisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7CisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT50b3BMZWZ0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+dG9wTGVmdFtpXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHRbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDMpIHx8CisgICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0KSB8fAorICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkgKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPQorICAgICAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgPSB2YWx1ZSArIDE7CisgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZSBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMgPSB2YWx1ZSArIDE7CisKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkLAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCByYW5nZQorICAgICAgICAgICAgICogWzAsIG51bVNsaWNlR3JvdXBzKSAqLworICAgICAgICAgICAgdG1wID0gQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1twUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLTFdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOworICAgICAgICAgICAgICAgIGlmICggcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPj0KKyAgICAgICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9pZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDMxKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKKworICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPiAzMSkKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogd2VpZ2h0ZWRfcHJlZF9mbGFnLCB0aGlzIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBFUFJJTlQoIndlaWdodGVkX3ByZWRfZmxhZyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogd2VpZ2h0ZWRfYmlwcmVkX2lkYyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7CisgICAgaWYgKHRtcCA+IDIpCisgICAgeworICAgICAgICBFUFJJTlQoIndlaWdodGVkX2JpcHJlZF9pZGMiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xcF9taW51czI2Iik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFBpY1BhcmFtU2V0LT5waWNJbml0UXAgPSAodTMyKShpdG1wICsgMjYpOworCisgICAgLyogcGljX2luaXRfcXNfbWludXMyNiAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19pbml0X3FzX21pbnVzMjYiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICgoaXRtcCA8IC0xMikgfHwgKGl0bXAgPiAxMikpCisgICAgeworICAgICAgICBFUFJJTlQoImNocm9tYV9xcF9pbmRleF9vZmZzZXQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwUGljUGFyYW1TZXQtPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBpdG1wOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQaWNQYXJhbVNldC0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOworCisgICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzMjg2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgUFBTIGluZm9ybWF0aW9uIGRlY29kZWQgZnJvbSB0aGUgc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwaWNQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWc7CisgICAgdTMyIG51bVNsaWNlR3JvdXBzOworICAgIHUzMiBzbGljZUdyb3VwTWFwVHlwZTsKKyAgICB1MzIgKnJ1bkxlbmd0aDsKKyAgICB1MzIgKnRvcExlZnQ7CisgICAgdTMyICpib3R0b21SaWdodDsKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgIHUzMiBwaWNTaXplSW5NYXBVbml0czsKKyAgICB1MzIgKnNsaWNlR3JvdXBJZDsKKyAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7CisgICAgdTMyIHBpY0luaXRRcDsKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKKyAgICB1MzIgZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZzsKKyAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnOworICAgIHUzMiByZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZzsKK30gcGljUGFyYW1TZXRfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTQ4Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKQEAgLTAsMCArMSwyMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisjaWZkZWYgSDI2NERFQ19PTVhETAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKKyAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDEgLWU3MDIgKi8KKworLyogTHVtYSBmcmFjdGlvbmFsLXNhbXBsZSBwb3NpdGlvbnMKKyAqCisgKiAgRyBhIGIgYyBICisgKiAgZCBlIGYgZworICogIGggaSBqIGsgbQorICogIG4gcCBxIHIKKyAqICBNICAgcyAgIE4KKyAqCisgKiAgRywgSCwgTSBhbmQgTiBhcmUgaW50ZWdlciBzYW1wbGUgcG9zaXRpb25zCisgKiAgYS1zIGFyZSBmcmFjdGlvbmFsIHNhbXBsZXMgdGhhdCBuZWVkIHRvIGJlIGludGVycG9sYXRlZC4KKyAqLworI2lmbmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgY29uc3QgdTMyIGx1bWFGcmFjUG9zWzRdWzRdID0geworICAvKiBHICBkICBoICBuICAgIGEgIGUgIGkgIHAgICAgYiAgZiAgaiAgIHEgICAgIGMgICBnICAgayAgIHIgKi8KKyAgICB7MCwgMSwgMiwgM30sIHs0LCA1LCA2LCA3fSwgezgsIDksIDEwLCAxMX0sIHsxMiwgMTMsIDE0LCAxNX19OworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyogY2xpcHBpbmcgdGFibGUsIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KK2V4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4KKyAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCisgICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bworICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwUmVmICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBDYiB0b3AtbGVmdCBjb3JuZXIKKyAgICAgICAgICB4MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHgtY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHkwICAgICAgICAgICAgICAgIGludGVnZXIgeS1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCisgICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKKyAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKKyAgICAgICAgICB4RnJhYyAgICAgICAgICAgICBob3Jpem9udGFsIGZyYWN0aW9uIGZvciBwcmVkaWN0aW9uIGluIDEvOCBwaXhlbHMKKyAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggICB3aWR0aCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCisgICAgICAgICAgY2hyb21hUGFydEhlaWdodCAgaGVpZ2h0IG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwcmVkUGFydENocm9tYSAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19BUk0xMQordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIGMsIHZhbDsKKyAgICB1OCAqcHRyQSwgKmNicjsKKyAgICB1MzIgY29tcDsKKyAgICB1OCBibG9ja1s5KjgqMl07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOworICAgIEFTU0VSVCh4RnJhYyA8IDgpOworICAgIEFTU0VSVChwUmVmKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOworICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSpjaHJvbWFQYXJ0SGVpZ2h0LAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAorICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7CisKKyAgICAgICAgcFJlZiA9IGJsb2NrOworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKKyAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodDsKKyAgICB9CisKKyAgICB2YWwgPSA4IC0geEZyYWM7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKKyAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7CisKKyAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgKiBiaWxpbmVhciBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wNCA9ICpwdHJBKys7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHhGcmFjICogdG1wMykgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB4RnJhYyAqIHRtcDQpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKKyAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDMgKyB4RnJhYyAqIHRtcDEpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXA0ICsgeEZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIHZlcnRpY2FsIGRpcmVjdGlvbi4KKyAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCisgICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bworICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAorICB1OCAqcFJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeUZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCBjLCB2YWw7CisgICAgdTggKnB0ckEsICpjYnI7CisgICAgdTMyIGNvbXA7CisgICAgdTggYmxvY2tbOSo4KjJdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQoeUZyYWMgPCA4KTsKKyAgICBBU1NFUlQocFJlZik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOworICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgY2hyb21hUGFydFdpZHRoKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCisgICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKKworICAgICAgICBwUmVmID0gYmxvY2s7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOworICAgIH0KKworICAgIHZhbCA9IDggLSB5RnJhYzsKKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQorICAgIHsKKworICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOworICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKKworICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGFuZAorICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbi4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAorICB1OCAqcmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCkKK3sKKyAgICB1OCBibG9ja1s5KjkqMl07CisgICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHZhbFgsIHZhbFksIHBsdXMzMiA9IDMyOworICAgIHUzMiBjb21wOworICAgIHU4ICpwdHJBLCAqY2JyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOworICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQoeEZyYWMgPCA4KTsKKyAgICBBU1NFUlQoeUZyYWMgPCA4KTsKKyAgICBBU1NFUlQocmVmKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7CisgICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSooY2hyb21hUGFydEhlaWdodCsxKSwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKKworICAgICAgICByZWYgPSBibG9jazsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7CisgICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKKyAgICB9CisKKyAgICB2YWxYID0gOCAtIHhGcmFjOworICAgIHZhbFkgPSA4IC0geUZyYWM7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgcHRyQSA9IHJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOworICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKKworICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwdHJBOworICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAxICo9IHZhbFk7CisgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKKyAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOworICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDIgPSAqKytwdHJBOworICAgICAgICAgICAgICAgIHRtcDQgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXA2ID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgICAgICB0bXAyICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA0ICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wNCAqPSB2YWxZOworICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wNiAqIHlGcmFjOworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAxICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wMyAqIHZhbFggKyBwbHVzMzI7CisgICAgICAgICAgICAgICAgdG1wMSArPSB0bXAyICogeEZyYWM7CisgICAgICAgICAgICAgICAgdG1wMSA+Pj0gNjsKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDQgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAzID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXAzOworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAxOworCisgICAgICAgICAgICAgICAgdG1wMSA9ICorK3B0ckE7CisgICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKKyAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAzICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wMiA9IHRtcDIgKiB2YWxYICsgcGx1czMyOworICAgICAgICAgICAgICAgIHRtcDQgPSB0bXA0ICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDEgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAyID4+PSA2OworICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMyAqIHhGcmFjOworICAgICAgICAgICAgICAgIHRtcDQgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDQ7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogUHJlZGljdENocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVG9wIGxldmVsIGNocm9tYSBwcmVkaWN0aW9uIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIFByZWRpY3RDaHJvbWEoCisgIHU4ICptYlBhcnRDaHJvbWEsCisgIHUzMiB4QUwsCisgIHUzMiB5QUwsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodDsKKyAgICBpMzIgeEludCwgeUludDsKKyAgICB1OCAqcmVmOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobXYpOworICAgIEFTU0VSVChyZWZQaWMpOworICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOworICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKKyAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOworCisgICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgeEludCA9ICh4QUwgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKKyAgICB5SW50ID0gKHlBTCA+PiAxKSArIChtdi0+dmVyID4+IDMpOworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7CisKKyAgICBjaHJvbWFQYXJ0V2lkdGggID0gcGFydFdpZHRoID4+IDE7CisgICAgY2hyb21hUGFydEhlaWdodCA9IHBhcnRIZWlnaHQgPj4gMTsKKyAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICBpZiAoeEZyYWMgJiYgeUZyYWMpCisgICAgeworICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOworICAgIH0KKyAgICBlbHNlIGlmICh4RnJhYykKKyAgICB7CisgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoeUZyYWMpCisgICAgeworICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOworICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEgKyA4KjgsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOworICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdoJworICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfQVJNMTEKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgaSwgajsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB1OCAqcHRyQywgKnB0clY7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoOworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgcHRyQyA9IHJlZiArIHdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKKworICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24sIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyAqLworICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCisgICAgeworICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCisgICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKKyAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDI7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07CisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDE7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDY7CisKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OworICAgICAgICAgICAgcHRyQysrOworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnZCcKKyAgICAgICAgICBvciAnbicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBkLCAxIGZvciBwaXhlbCBuICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIGksIGo7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdTggKnB0ckMsICpwdHJWLCAqcHRySW50OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCisgICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqd2lkdGg7CisKKyAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uCisgICAgICogaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzIGFuZCBhdmVyYWdlIGJldHdlZW4KKyAgICAgKiBpbnRlcnBvbGF0ZWQgdmFsdWUgYW5kIGludGVnZXIgc2FtcGxlIHZhbHVlICovCisgICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKKyAgICB7CisgICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KKyAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGgqMl07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgdG1wMisrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aF07CisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wMSsrOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNisrOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgICAgIHB0ckludCsrOworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBwdHJJbnQgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYicKKyAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTggKnB0cko7CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQoKHBhcnRXaWR0aCYweDMpID09IDApOworICAgIEFTU0VSVCgocGFydEhlaWdodCYweDMpID09IDApOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA0ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wMyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdhJworICAgICAgICAgIG9yICdjJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGEsIDEgZm9yIHBpeGVsIGMgKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1OCAqcHRySjsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDM7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgdG1wNCArPSAxNjsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDI7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07CisgICAgICAgICAgICB0bXAzICs9IDE2OworICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCisgICAgICAgICAgICAgICAgdG1wNCArPSB0bXAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIDEpID4+IDEpOworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG1wMyArPSB0bXA2OworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgMSkgPj4gMSk7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2UnLCAnZycsICdwJyBvciAncicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seQorICAgICAgICAgIGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQKKyAgICAgICAgICB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yVmVyT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBlLCAxIGZvciBwaXhlbCBnLAorICAgICAgICAgICAgICAgICAgICAgICAyIGZvciBwaXhlbCBwLCAzIGZvciBwaXhlbCByICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTggKnB0ckMsICpwdHJKLCAqcHRyVjsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICAvKiBSZWYgcG9pbnRzIHRvIEcgKyAoLTIsIC0yKSAqLworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgLyogcHRySiBwb2ludHMgdG8gZWl0aGVyIEogb3IgUSwgZGVwZW5kaW5nIG9uIHZlcnRpY2FsIG9mZnNldCAqLworICAgIHB0ckogPSByZWYgKyAoKChob3JWZXJPZmZzZXQgJiAweDIpID4+IDEpICsgMikgKiB3aWR0aCArIDU7CisKKyAgICAvKiBwdHJDIHBvaW50cyB0byBlaXRoZXIgQyBvciBELCBkZXBlbmRpbmcgb24gaG9yaXpvbnRhbCBvZmZzZXQgKi8KKyAgICBwdHJDID0gcmVmICsgd2lkdGggKyAyICsgKGhvclZlck9mZnNldCAmIDB4MSk7CisKKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKworICAgICAgICAvKiBIb3Jpem9udGFsIGludGVycG9sYXRpb24sIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA0ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wMyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOworICAgIH0KKworICAgIG1iIC09IDE2KnBhcnRIZWlnaHQ7CisgICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOworCisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIC8qIFZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2luZywgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj41XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYls0OF07CisgICAgICAgICAgICB0bXAxICs9IDE2OworICAgICAgICAgICAgdG1wNysrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjVdOworICAgICAgICAgICAgdG1wMSA9IG1iWzMyXTsKKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA2ID0gbWJbMTZdOworICAgICAgICAgICAgdG1wNSArPSAxNjsKKyAgICAgICAgICAgIHRtcDcrKzsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgIHRtcDUgPSAqbWI7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKworICAgICAgICB9CisgICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2onIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgorICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKKyAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBpMzIgKnB0ckMsICpwdHJWLCAqYjE7CisgICAgdTggICpwdHJKOworICAgIGkzMiB0YWJsZVsyMSoxNl07CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBiMSA9IHRhYmxlOworICAgIHB0ckogPSByZWYgKyA1OworCisgICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCisgICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgKmIxKysgPSB0bXA2OworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNDsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXAzICs9IHRtcDQ7CisgICAgICAgICAgICAqYjErKyA9IHRtcDM7CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICB9CisKKyAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKKyAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj4xMF07CisgICAgICAgICAgICB0bXAxICs9IDUxMjsKKyAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXA3OworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj4xMF07CisgICAgICAgICAgICB0bXA2ICs9IDUxMjsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXA3OworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjEwXTsKKyAgICAgICAgICAgIHRtcDUgKz0gNTEyOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDc7CisKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjEwXTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDc7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgIH0KKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdmJyBvciAncScgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCisgICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAorICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBmLCAxIGZvciBwaXhlbCBxICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaTMyICpwdHJDLCAqcHRyViwgKnB0ckludCwgKmIxOworICAgIHU4ICAqcHRySjsKKyAgICBpMzIgdGFibGVbMjEqMTZdOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgYjEgPSB0YWJsZTsKKyAgICBwdHJKID0gcmVmICsgNTsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgorICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCisgICAgeworICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7CisgICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKKyAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOworICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7CisgICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICAqYjErKyA9IHRtcDY7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgKmIxKysgPSB0bXA1OworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgKmIxKysgPSB0bXA0OworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgICpiMSsrID0gdG1wMzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgIH0KKworICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLworICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOworICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KKyAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSpwYXJ0V2lkdGg7CisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSA1MTI7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDEgKz0gNTEyOworICAgICAgICAgICAgdG1wMisrOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wNyArIHRtcDIpID4+IDEpOworCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7CisgICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OworICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDYgKz0gNTEyOworICAgICAgICAgICAgdG1wMSsrOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wNyArIHRtcDEpID4+IDEpOworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXA1ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDYrKzsKKyAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDcgKyB0bXA2KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+MTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDcgKyB0bXA1KSA+PiAxKTsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgICAgIHB0ckludCsrOworICAgICAgICB9CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7CisgICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7CisgICAgICAgIHB0ckludCArPSAzKnBhcnRXaWR0aDsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAorICAgICAgICAgIHBvc2l0aW9uICdpJyBvciAnaycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCisgICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAorICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBpLCAxIGZvciBwaXhlbCBrICovCit7CisgICAgdTMyIHAxWzIxKjIxLzQrMV07CisgICAgdTMyIHgsIHk7CisgICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgaTMyICpwdHJKLCAqcHRySW50LCAqaDE7CisgICAgdTggICpwdHJDLCAqcHRyVjsKKyAgICBpMzIgdGFibGVbMjEqMTZdOworICAgIGkzMiB0YWJsZVdpZHRoID0gKGkzMilwYXJ0V2lkdGgrNTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIGgxID0gdGFibGUgKyB0YWJsZVdpZHRoOworICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKKyAgICAgKiB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9ICh1MzIpdGFibGVXaWR0aDsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgaDFbdGFibGVXaWR0aCoyXSA9IHRtcDI7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIGgxW3RhYmxlV2lkdGhdID0gdG1wMTsKKworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgKmgxID0gdG1wNjsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgaDFbLXRhYmxlV2lkdGhdID0gdG1wNTsKKyAgICAgICAgICAgIGgxKys7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgIH0KKyAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKKyAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKKyAgICAgICAgaDEgKz0gMyp0YWJsZVdpZHRoOworICAgIH0KKworICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCisgICAgcHRySiA9IHRhYmxlICsgNTsKKyAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgRyBvciBIICovCisgICAgcHRySW50ID0gdGFibGUgKyAyICsgaG9yT2Zmc2V0OworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoPj4yKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNiArPSA1MTI7CisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDYgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDUgKz0gNTEyOworICAgICAgICAgICAgdG1wNisrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNSA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wNCArPSA1MTI7CisgICAgICAgICAgICB0bXA1Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQgPj4gMTBdOworICAgICAgICAgICAgdG1wNyArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKKyAgICAgICAgICAgIHRtcDMgKz0gNTEyOworICAgICAgICAgICAgdG1wNCsrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wMysrOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgdG1wNykgPj4gMSk7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSA1OworICAgICAgICBwdHJJbnQgKz0gNTsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KKyAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCisgICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0CisgICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKKyAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgorICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgeEEsCisgIHUzMiB5QSwKKyAgdTMyIHBhcnRYLAorICB1MzIgcGFydFksCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodDsKKyAgICBpMzIgeEludCwgeUludDsKKyAgICB1OCAqbHVtYVBhcnREYXRhOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKG12KTsKKyAgICBBU1NFUlQocGFydFdpZHRoKTsKKyAgICBBU1NFUlQocGFydEhlaWdodCk7CisgICAgQVNTRVJUKHJlZlBpYyk7CisgICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7CisgICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOworICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7CisKKyAgICAvKiBsdW1hICovCisgICAgbHVtYVBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7CisKKyAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7CisgICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOworCisgICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKKworICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOworICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOworCisgICAgQVNTRVJUKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10gPCAxNik7CisKKyAgICBzd2l0Y2ggKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10pCisgICAgeworICAgICAgICBjYXNlIDA6IC8qIEcgKi8KKyAgICAgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQseUludCx3aWR0aCxoZWlnaHQscGFydFdpZHRoLHBhcnRIZWlnaHQsMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogZCAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogaCAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogbiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogYSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTogLyogZSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBpICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8qIHAgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODogLyogYiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOTogLyogZiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLyogaiAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTogLyogcSAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjogLyogYyAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8qIGcgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6IC8qIGsgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUsIHIgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2hyb21hICovCisgICAgUHJlZGljdENocm9tYSgKKyAgICAgIGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSksCisgICAgICB4QSArIHBhcnRYLAorICAgICAgeUEgKyBwYXJ0WSwKKyAgICAgIHBhcnRXaWR0aCwKKyAgICAgIHBhcnRIZWlnaHQsCisgICAgICBtdiwKKyAgICAgIHJlZlBpYyk7CisKK30KKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KKyAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCisgICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0CisgICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgorICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKKyAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgorICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypsaW50IC1lezU1MH0gU3ltYm9sICdyZXMnIG5vdCBhY2Nlc3NlZCAqLwordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgY29sQW5kUm93LAorICB1MzIgcGFydCwKKyAgdTggKnBGaWxsKQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHhGcmFjLCB5RnJhYzsKKyAgICB1MzIgd2lkdGgsIGhlaWdodDsKKyAgICBpMzIgeEludCwgeUludCwgeDAsIHkwOworICAgIHU4ICpwYXJ0RGF0YSwgKnJlZjsKKyAgICBPTVhTaXplIHJvaTsKKyAgICB1MzIgZmlsbFdpZHRoOworICAgIHUzMiBmaWxsSGVpZ2h0OworICAgIE9NWFJlc3VsdCByZXM7CisgICAgdTMyIHhBLCB5QTsKKyAgICB1MzIgcGFydFgsIHBhcnRZOworICAgIHUzMiBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobXYpOworICAgIEFTU0VSVChyZWZQaWMpOworICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOworICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKKyAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOworCisgICAgeEEgPSAoY29sQW5kUm93ICYgMHhGRkZGMDAwMCkgPj4gMTY7CisgICAgeUEgPSAoY29sQW5kUm93ICYgMHgwMDAwRkZGRik7CisKKyAgICBwYXJ0WCA9IChwYXJ0ICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisgICAgcGFydFkgPSAocGFydCAmIDB4MDBGRjAwMDApID4+IDE2OworICAgIHBhcnRXaWR0aCA9IChwYXJ0ICYgMHgwMDAwRkYwMCkgPj4gODsKKyAgICBwYXJ0SGVpZ2h0ID0gKHBhcnQgJiAweDAwMDAwMEZGKTsKKworICAgIEFTU0VSVChwYXJ0V2lkdGgpOworICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKKworICAgIC8qIGx1bWEgKi8KKyAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOworCisgICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOworICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKKworICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKKyAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKKworICAgIHgwID0gKHhGcmFjKSA/IHhJbnQtMiA6IHhJbnQ7CisgICAgeTAgPSAoeUZyYWMpID8geUludC0yIDogeUludDsKKworICAgIGlmICh4RnJhYykKKyAgICB7CisgICAgICAgIGlmIChwYXJ0V2lkdGggPT0gMTYpCisgICAgICAgICAgICBmaWxsV2lkdGggPSAzMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlsbFdpZHRoID0gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZmlsbFdpZHRoID0gKHBhcnRXaWR0aCoyKTsKKyAgICBpZiAoeUZyYWMpCisgICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0KzU7CisgICAgZWxzZQorICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodDsKKworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCAodTgqKXBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSBwRmlsbDsKKyAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7CisgICAgICAgIGlmICh5RnJhYykKKyAgICAgICAgICAgIHJlZiArPSAyKndpZHRoOworICAgICAgICBpZiAoeEZyYWMpCisgICAgICAgICAgICByZWYgKz0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLworICAgICAgICByZWYgPSByZWZQaWMtPmRhdGEgKyB5SW50KndpZHRoICsgeEludDsKKyAgICB9CisgICAgLyogTHVtYSBpbnRlcnBvbGF0aW9uICovCisgICAgcm9pLndpZHRoID0gKGkzMilwYXJ0V2lkdGg7CisgICAgcm9pLmhlaWdodCA9IChpMzIpcGFydEhlaWdodDsKKworICAgIHJlcyA9IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hKHJlZiwgKGkzMil3aWR0aCwgcGFydERhdGEsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpeEZyYWMsIChpMzIpeUZyYWMsIHJvaSk7CisgICAgQVNTRVJUKHJlcyA9PSAwKTsKKworICAgIC8qIENocm9tYSAqLworICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKKworICAgIHgwID0gKCh4QSArIHBhcnRYKSA+PiAxKSArIChtdi0+aG9yID4+IDMpOworICAgIHkwID0gKCh5QSArIHBhcnRZKSA+PiAxKSArIChtdi0+dmVyID4+IDMpOworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7CisKKyAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICByb2kud2lkdGggPSAoaTMyKShwYXJ0V2lkdGggPj4gMSk7CisgICAgZmlsbFdpZHRoID0gKChwYXJ0V2lkdGggPj4gMSkgKyA4KSAmIH4weDc7CisgICAgcm9pLmhlaWdodCA9IChpMzIpKHBhcnRIZWlnaHQgPj4gMSk7CisgICAgZmlsbEhlaWdodCA9IChwYXJ0SGVpZ2h0ID4+IDEpICsgMTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKKyAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwgKyBmaWxsV2lkdGgqZmlsbEhlaWdodCwKKyAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZmlsbFdpZHRoLAorICAgICAgICAgICAgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKKworICAgICAgICByZWYgPSBwRmlsbDsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOworICAgICAgICBoZWlnaHQgPSBmaWxsSGVpZ2h0OworICAgIH0KKworICAgIHBhcnREYXRhID0gZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKTsKKworICAgIC8qIENocm9tYSBpbnRlcnBvbGF0aW9uICovCisgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLworICAgIHJlZiArPSB5MCAqIHdpZHRoICsgeDA7CisgICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKKyAgICBBU1NFUlQocmVzID09IDApOworICAgIHBhcnREYXRhICs9IDggKiA4OworICAgIHJlZiArPSBoZWlnaHQgKiB3aWR0aDsKKyAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOworICAgIEFTU0VSVChyZXMgPT0gMCk7CisKK30KKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbGxSb3cxCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgaW4gYSAnbm9ybWFsJyBjYXNlIHdoZW4gbm8KKyAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWNlc3NhcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIEZpbGxSb3cxKAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIGxlZnQsCisgIGkzMiBjZW50ZXIsCisgIGkzMiByaWdodCkKK3sKKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChmaWxsKTsKKworICAgIEgyNjRTd0RlY01lbWNweShmaWxsLCByZWYsICh1MzIpY2VudGVyKTsKKworICAgIC8qbGludCAtZSg3MTUpICovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJvdyBvZiByZWZlcmVuY2UgcGVscyB3aGVuIGhvcml6b250YWwgY29vcmRpbmF0ZQorICAgICAgICAgIGlzIHBhcnRseSBuZWdhdGl2ZSBvciBwYXJ0bHkgZ3JlYXRlciB0aGFuIHJlZmVyZW5jZSBwaWN0dXJlIHdpZHRoCisgICAgICAgICAgKG92ZXJmaWxsaW5nIHNvbWUgcGVscyBvbiBsZWZ0IGFuZC9vciByaWdodCBlZGdlKS4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHJlZiAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBzYW1wbGVzCisgICAgICAgICAgbGVmdCAgICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gb3ZlcmZpbGwgb24gbGVmdC1lZGdlCisgICAgICAgICAgY2VudGVyICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gY29weQorICAgICAgICAgIHJpZ2h0ICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIHJpZ2h0LWVkZ2UKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBmaWxsICAgICAgcG9pbnRlciB3aGVyZSBzYW1wbGVzIGFyZSBzdG9yZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit2b2lkIGgyNjRic2RGaWxsUm93NygKKyAgdTggKnJlZiwKKyAgdTggKmZpbGwsCisgIGkzMiBsZWZ0LAorICBpMzIgY2VudGVyLAorICBpMzIgcmlnaHQpCit7CisgICAgdTggdG1wOworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKGZpbGwpOworCisgICAgaWYgKGxlZnQpCisgICAgICAgIHRtcCA9ICpyZWY7CisKKyAgICBmb3IgKCA7IGxlZnQ7IGxlZnQtLSkKKyAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLworICAgICAgICAqZmlsbCsrID0gdG1wOworCisgICAgZm9yICggOyBjZW50ZXI7IGNlbnRlci0tKQorICAgICAgICAqZmlsbCsrID0gKnJlZisrOworCisgICAgaWYgKHJpZ2h0KQorICAgICAgICB0bXAgPSByZWZbLTFdOworCisgICAgZm9yICggOyByaWdodDsgcmlnaHQtLSkKKyAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXApICB0bXAgaXMgaW5pdGlhbGl6ZWQgaWYgdXNlZCAqLworICAgICAgICAqZmlsbCsrID0gdG1wOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGaWxsQmxvY2sKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGJsb2NrIG9mIHJlZmVyZW5jZSBwZWxzLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWVkZWQgb3Igbm90IGFuZCByZXBlYXRlZGx5IGNhbGxzIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICAgZnVuY3Rpb24gKGJ5IHVzaW5nIGEgZnVuY3Rpb24gcG9pbnRlcikgdGhhdCBmaWxscyBvbmUgcm93IHRoZSBibG9jay4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHJlZiAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lCisgICAgICAgICAgeDAgICAgICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBibG9jaworICAgICAgICAgIHkwICAgICAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgYmxvY2sKKyAgICAgICAgICB3aWR0aCAgICAgICAgICAgICB3aWR0aCBvZiByZWZlcmVuY2UgZnJhbWUKKyAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgcmVmZXJlbmNlIGZyYW1lCisgICAgICAgICAgYmxvY2tXaWR0aCAgICAgICAgd2lkdGggb2YgYmxvY2sKKyAgICAgICAgICBibG9ja0hlaWdodCAgICAgICBoZWlnaHQgb2YgYmxvY2sKKyAgICAgICAgICBmaWxsU2Nhbkxlbmd0aCAgICBsZW5ndGggb2YgYSBsaW5lIGluIG91dHB1dCBhcnJheSAocGl4ZWxzKQorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGZpbGwgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYXJyYXkgd2hlcmUgb3V0cHV0IGJsb2NrIGlzIHdyaXR0ZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRmlsbEJsb2NrKAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIGJsb2NrV2lkdGgsCisgIHUzMiBibG9ja0hlaWdodCwKKyAgdTMyIGZpbGxTY2FuTGVuZ3RoKQorCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHhzdG9wLCB5c3RvcDsKKyAgICB2b2lkICgqZnApKHU4KiwgdTgqLCBpMzIsIGkzMiwgaTMyKTsKKyAgICBpMzIgbGVmdCwgeCwgcmlnaHQ7CisgICAgaTMyIHRvcCwgeSwgYm90dG9tOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQoZmlsbCk7CisgICAgQVNTRVJUKHdpZHRoKTsKKyAgICBBU1NFUlQoaGVpZ2h0KTsKKyAgICBBU1NFUlQoZmlsbCk7CisgICAgQVNTRVJUKGJsb2NrV2lkdGgpOworICAgIEFTU0VSVChibG9ja0hlaWdodCk7CisKKyAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOworICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OworCisgICAgLyogQ2hvb3NlIGNvcnJlY3QgZnVuY3Rpb24gd2hldGhlciBvdmVyZmlsbGluZyBvbiBsZWZ0LWVkZ2Ugb3IgcmlnaHQtZWRnZQorICAgICAqIGlzIG5lZWRlZCBvciBub3QgKi8KKyAgICBpZiAoeDAgPj0gMCAmJiB4c3RvcCA8PSAoaTMyKXdpZHRoKQorICAgICAgICBmcCA9IEZpbGxSb3cxOworICAgIGVsc2UKKyAgICAgICAgZnAgPSBoMjY0YnNkRmlsbFJvdzc7CisKKyAgICBpZiAoeXN0b3AgPCAwKQorICAgICAgICB5MCA9IC0oaTMyKWJsb2NrSGVpZ2h0OworCisgICAgaWYgKHhzdG9wIDwgMCkKKyAgICAgICAgeDAgPSAtKGkzMilibG9ja1dpZHRoOworCisgICAgaWYgKHkwID4gKGkzMiloZWlnaHQpCisgICAgICAgIHkwID0gKGkzMiloZWlnaHQ7CisKKyAgICBpZiAoeDAgPiAoaTMyKXdpZHRoKQorICAgICAgICB4MCA9IChpMzIpd2lkdGg7CisKKyAgICB4c3RvcCA9IHgwICsgKGkzMilibG9ja1dpZHRoOworICAgIHlzdG9wID0geTAgKyAoaTMyKWJsb2NrSGVpZ2h0OworCisgICAgaWYgKHgwID4gMCkKKyAgICAgICAgcmVmICs9IHgwOworCisgICAgaWYgKHkwID4gMCkKKyAgICAgICAgcmVmICs9IHkwICogKGkzMil3aWR0aDsKKworICAgIGxlZnQgPSB4MCA8IDAgPyAteDAgOiAwOworICAgIHJpZ2h0ID0geHN0b3AgPiAoaTMyKXdpZHRoID8geHN0b3AgLSAoaTMyKXdpZHRoIDogMDsKKyAgICB4ID0gKGkzMilibG9ja1dpZHRoIC0gbGVmdCAtIHJpZ2h0OworCisgICAgdG9wID0geTAgPCAwID8gLXkwIDogMDsKKyAgICBib3R0b20gPSB5c3RvcCA+IChpMzIpaGVpZ2h0ID8geXN0b3AgLSAoaTMyKWhlaWdodCA6IDA7CisgICAgeSA9IChpMzIpYmxvY2tIZWlnaHQgLSB0b3AgLSBib3R0b207CisKKyAgICAvKiBUb3Atb3ZlcmZpbGxpbmcgKi8KKyAgICBmb3IgKCA7IHRvcDsgdG9wLS0gKQorICAgIHsKKyAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7CisgICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7CisgICAgfQorCisgICAgLyogTGluZXMgaW5zaWRlIHJlZmVyZW5jZSBpbWFnZSAqLworICAgIGZvciAoIDsgeTsgeS0tICkKKyAgICB7CisgICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOworICAgICAgICByZWYgKz0gd2lkdGg7CisgICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7CisgICAgfQorCisgICAgcmVmIC09IHdpZHRoOworCisgICAgLyogQm90dG9tLW92ZXJmaWxsaW5nICovCisgICAgZm9yICggOyBib3R0b207IGJvdHRvbS0tICkKKyAgICB7CisgICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOworICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOworICAgIH0KK30KKworLypsaW50ICtlNzAxICtlNzAyICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTFhMTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAorI2RlZmluZSBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19PTVhETAordm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCisgIHU4ICpkYXRhLAorICBtdl90ICptdiwKKyAgaW1hZ2VfdCAqcmVmUGljLAorICB1MzIgeEEsCisgIHUzMiB5QSwKKyAgdTMyIHBhcnRYLAorICB1MzIgcGFydFksCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KTsKKyNlbHNlCit2b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKKyAgdTggKmRhdGEsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMsCisgIHUzMiBjb2xBbmRSb3csLyogcGFja2FnZWQgZGF0YSB8IGNvbHVtbiAgICB8IHJvdyAgICAgICAgICAgICAgICB8Ki8KKyAgdTMyIHBhcnQsICAgICAvKiBwYWNrYWdlZCBkYXRhIHxwYXJ0WHxwYXJ0WXxwYXJ0V2lkdGh8cGFydEhlaWdodHwqLworICB1OCAqcEZpbGwpOworI2VuZGlmCisKK3ZvaWQgaDI2NGJzZEZpbGxCbG9jaygKKyAgdTggKiByZWYsCisgIHU4ICogZmlsbCwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIGJsb2NrV2lkdGgsCisgIHUzMiBibG9ja0hlaWdodCwKKyAgdTMyIGZpbGxTY2FuTGVuZ3RoKTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcigKKyAgdTggKnBSZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAorICB1OCAqcmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB4RnJhYywKKyAgdTMyIHlGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvclZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIHZlck9mZnNldCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCk7CisKKwordm9pZCBoMjY0YnNkRmlsbFJvdzcoCisgIHU4ICpyZWYsCisgIHU4ICpmaWxsLAorICBpMzIgbGVmdCwKKyAgaTMyIGNlbnRlciwKKyAgaTMyIHJpZ2h0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDc1NmM0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpAQCAtMCwwICsxLDE2OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQorICAgICAgICAgIERlY29kZUJ1ZmZlcmluZ1BlcmlvZAorICAgICAgICAgIERlY29kZVBpY3R1cmVUaW1pbmcKKyAgICAgICAgICBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCisgICAgICAgICAgRGVjb2RlRmlsbGVyUGF5bG9hZAorICAgICAgICAgIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKKyAgICAgICAgICBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAorICAgICAgICAgIERlY29kZVJlY292ZXJ5UG9pbnQKKyAgICAgICAgICBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgorICAgICAgICAgIERlY29kZVNwYXJlUGljCisgICAgICAgICAgRGVjb2RlU2NlbmVJbmZvCisgICAgICAgICAgRGVjb2RlU3ViU2VxSW5mbworICAgICAgICAgIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCisgICAgICAgICAgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCisgICAgICAgICAgRGVjb2RlRnVsbEZyYW1lRnJlZXplCisgICAgICAgICAgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKKyAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKKyAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCisgICAgICAgICAgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0CisgICAgICAgICAgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zZWkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdTMyIG51bUNsb2NrVFNbOV0gPSB7MSwxLDEsMiwyLDMsMywyLDN9Oworc3RhdGljIGNvbnN0IHUzMiBjZWlsTG9nMk51bVNsaWNlR3JvdXBzWzldID0gezAsMSwxLDIsMiwzLDMsMywzfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKKyAgdTMyIGNwYkNudCwKKyAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAorICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKKyAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAorICB1MzIgdGltZU9mZnNldExlbmd0aCwKKyAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAorICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpOworCitzdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpOworCitzdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpOworCitzdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKKyAgdTMyIHBheWxvYWRTaXplKTsKKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCisgIHUzMiBwYXlsb2FkU2l6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KTsKKworc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCisgIHUzMiBudW1SZWZGcmFtZXMpOworCitzdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKKyAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKTsKKworc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pOworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KTsKKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOworCitzdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7CisKK3N0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAorICB1MzIgbnVtU2xpY2VHcm91cHMpOworCitzdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKKyAgdTMyIHBheWxvYWRTaXplKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHBheWxvYWRUeXBlLCBwYXlsb2FkU2l6ZSwgc3RhdHVzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlaU1lc3NhZ2UpOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNlaU1lc3NhZ2UsIDAsIHNpemVvZihzZWlNZXNzYWdlX3QpKTsKKworICAgIGRvCisgICAgeworICAgICAgICBwYXlsb2FkVHlwZSA9IDA7CisgICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQorICAgICAgICB7CisgICAgICAgICAgICBwYXlsb2FkVHlwZSArPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwYXlsb2FkVHlwZSArPSB0bXA7CisKKyAgICAgICAgcGF5bG9hZFNpemUgPSAwOworICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKKyAgICAgICAgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gMjU1OworICAgICAgICB9CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcGF5bG9hZFNpemUgKz0gdG1wOworCisgICAgICAgIHBTZWlNZXNzYWdlLT5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOworCisgICAgICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmJ1ZmZlcmluZ1BlcmlvZCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBpY3R1cmVUaW1pbmcoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBpY1RpbWluZywKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPworICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBhblNjYW5SZWN0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZpbGxlclBheWxvYWQocFN0cm1EYXRhLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAorICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhVW5yZWdpc3RlcmVkLAorICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVjb3ZlcnlQb2ludCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVjb3ZlcnlQb2ludCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTcGFyZVBpYygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3BhcmVQaWMsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNjZW5lSW5mbygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c2NlbmVJbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFJbmZvKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFJbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZUZyZWV6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTQ6IC8qIFRoaXMgU0VJIGRvZXMgbm90IGNvbnRhaW4gZGF0YSwgd2hhdCB0byBkbyA/Pz8gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZVNuYXBzaG90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPm1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKKyAgICAgICAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHN0YXR1cyk7CisKKyAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkpOworCisgICAgcmV0dXJuKGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSkpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlQnVmZmVyaW5nUGVyaW9kCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKKyAgdTMyIGNwYkNudCwKKyAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAorICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEJ1ZmZlcmluZ1BlcmlvZCk7CisgICAgQVNTRVJUKGNwYkNudCk7CisgICAgQVNTRVJUKGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkID4gMzEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGlmIChuYWxIcmRCcFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmNsSHJkQnBQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVBpY3R1cmVUaW1pbmcKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKKyAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAorICB1MzIgdGltZU9mZnNldExlbmd0aCwKKyAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAorICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQaWNUaW1pbmcpOworCisKKyAgICBpZiAoY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGNwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBpY1RpbWluZy0+Y3BiUmVtb3ZhbERlbGF5ID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgZHBiT3V0cHV0RGVsYXlMZW5ndGgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQaWNUaW1pbmctPmRwYk91dHB1dERlbGF5ID0gdG1wOworICAgIH0KKworICAgIGlmIChwaWNTdHJ1Y3RQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKHRtcCA+IDgpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBQaWNUaW1pbmctPnBpY1N0cnVjdCA9IHRtcDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2xvY2tUU1twUGljVGltaW5nLT5waWNTdHJ1Y3RdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jdFR5cGVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm51aXRGaWVsZEJhc2VkRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID4gNikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNvdW50aW5nVHlwZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZGlzY29udGludWl0eUZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y250RHJvcHBlZEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bkZyYW1lc1tpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+aG91cnNGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aW1lT2Zmc2V0TGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0aW1lT2Zmc2V0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpdG1wID0gKGkzMil0bXA7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyAiY29udmVydHMiIHRpbWVPZmZzZXRMZW5ndGgtYml0IHNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgKiBpbnRlZ2VyIGludG8gaTMyICovCisgICAgICAgICAgICAgICAgICAgIC8qbGludCAtc2F2ZSAtZTcwMSAtZTcwMiAqLworICAgICAgICAgICAgICAgICAgICBpdG1wIDw8PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaXRtcCA+Pj0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8qbGludCAtcmVzdG9yZSAqLworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gaXRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQYW5TY2FuUmVjdGFuZ2xlKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmICghcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQrKzsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RMZWZ0T2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFRvcE9mZnNldFtpXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RCb3R0b21PZmZzZXRbaV0pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDEgJiYKKyAgICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVGaWxsZXJQYXlsb2FkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworCisgICAgaWYgKHBheWxvYWRTaXplKQorICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKiBwYXlsb2FkU2l6ZSkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCisgIHUzMiBwYXlsb2FkU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUpOworICAgIEFTU0VSVChwYXlsb2FkU2l6ZSk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlID0gdG1wOworCisgICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgIT0gMHhGRikKKyAgICAgICAgaSA9IDE7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZSA9IHRtcDsKKyAgICAgICAgaSA9IDI7CisgICAgfQorCisgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgQUxMT0NBVEUocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZS1pLHU4KTsKKyAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSBpOworICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBqID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlW2pdID0gKHU4KXRtcDsKKyAgICAgICAgaSsrOworICAgICAgICBqKys7CisgICAgfSB3aGlsZSAoaSA8IHBheWxvYWRTaXplKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAorICB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBVc2VyRGF0YVVucmVnaXN0ZXJlZCk7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnV1aWRJc29JZWMxMTU3OFtpXSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICBBTExPQ0FURShwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUsIHBheWxvYWRTaXplIC0gMTYsIHU4KTsKKyAgICBpZiAocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gMTY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemUgLSAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVjb3ZlcnlQb2ludAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBSZWNvdmVyeVBvaW50KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBSZWNvdmVyeVBvaW50LT5yZWNvdmVyeUZyYW1lQ250KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBSZWNvdmVyeVBvaW50LT5leGFjdE1hdGNoRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBSZWNvdmVyeVBvaW50LT5icm9rZW5MaW5rRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICh0bXAgPiAyKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFJlY292ZXJ5UG9pbnQtPmNoYW5naW5nU2xpY2VHcm91cElkYyA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAorICB1MzIgbnVtUmVmRnJhbWVzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24pOworCisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxJZHJGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbEZyYW1lTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnIGFzc3VtZWQgYWx3YXlzIHRydWUgc28gc29tZSBmaWVsZCByZWxhdGVkIHN5bnRheAorICAgICAqIGVsZW1lbnRzIGFyZSBza2lwcGVkLCBzZWUgSC4yNjQgc3RhbmRhcmQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsCisgICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5kZWNSZWZQaWNNYXJraW5nLCBOQUxfU0VJLCBudW1SZWZGcmFtZXMpOworCisgICAgcmV0dXJuKHRtcCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTcGFyZVBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCisgIHUzMiBwaWNTaXplSW5NYXBVbml0cykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCBqLCBtYXBVbml0Q250OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNwYXJlUGljKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTcGFyZVBpYy0+dGFyZ2V0RnJhbWVOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgLyogZG8gbm90IGFjY2VwdCBmaWVsZHMgKi8KKyAgICBpZiAocFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNwYXJlUGljLT5udW1TcGFyZVBpY3MrKzsKKyAgICBpZiAocFNwYXJlUGljLT5udW1TcGFyZVBpY3MgPiBNQVhfTlVNX1NQQVJFX1BJQ1MpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFNwYXJlUGljLT5kZWx0YVNwYXJlRnJhbWVOdW1baV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPiAyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldW2pdID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOworICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGogPSAwLCBtYXBVbml0Q250ID0gMDsgbWFwVW5pdENudCA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBtYXBVbml0Q250ICs9IHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgcmVzdCB0byBudWxsICovCisgICAgZm9yIChpID0gcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkgPCBNQVhfTlVNX1NQQVJFX1BJQ1M7IGkrKykKKyAgICB7CisgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7CisgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTY2VuZUluZm8KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2NlbmVJbmZvKTsKKworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNjZW5lSW5mby0+c2NlbmVJZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlID4gNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBTY2VuZUluZm8tPnNlY29uZFNjZW5lSWQpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxSW5mbworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUluZm8pOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSA+IDI1NSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTdWJTZXFJbmZvLT5zdWJTZXFJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxSWQgPiA2NTUzNSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxSW5mby0+Zmlyc3RSZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPmxlYWRpbmdOb25SZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPmxhc3RQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKys7CisgICAgaWYgKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tpXSA9CisgICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGVbaV0gPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlW2ldID0gdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0gPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCA+IDY1NTM1KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcpCisgICAgeworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFEdXJhdGlvbiA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZyA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWcgPQorICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZSA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlID0gdG1wOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxczsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxTGF5ZXJOdW1baV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUlkW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcURpcmVjdGlvbltpXSA9IHRtcDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZUZyZWV6ZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBGdWxsRnJhbWVGcmVlemUpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEZ1bGxGcmFtZVNuYXBzaG90KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBGdWxsRnJhbWVTbmFwc2hvdC0+c25hcFNob3RJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMrKzsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQpOworICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA8IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCsrOworICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0ID4gbnVtU2xpY2VHcm91cHMpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0OyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsCisgICAgICAgICAgICBjZWlsTG9nMk51bVNsaWNlR3JvdXBzW251bVNsaWNlR3JvdXBzXSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID0gdG1wOworICAgICAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID4KKyAgICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0LTEpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5leGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnID0KKyAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0SWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKKyAgdTMyIHBheWxvYWRTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzZXJ2ZWRTZWlNZXNzYWdlKTsKKworCisgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCisgICAgQUxMT0NBVEUocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUscGF5bG9hZFNpemUsdTgpOworICAgIGlmIChwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSw4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmZTU0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0VJX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NFSV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfUEFOX1NDQU5fQ05UIDMyCisjZGVmaW5lIE1BWF9OVU1fU1BBUkVfUElDUyAxNgorI2RlZmluZSBNQVhfTlVNX0NMT0NLX1RTIDMKKyNkZWZpbmUgTUFYX05VTV9TVUJfU0VRX0xBWUVSUyAyNTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbTUFYX0NQQl9DTlRdOworfSBzZWlCdWZmZXJpbmdQZXJpb2RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgY3BiUmVtb3ZhbERlbGF5OworICAgIHUzMiBkcGJPdXRwdXREZWxheTsKKyAgICB1MzIgcGljU3RydWN0OworICAgIHUzMiBjbG9ja1RpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGNsb2NrVGltZVN0YW1wW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBjdFR5cGVbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIG51aXRGaWVsZEJhc2VkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgY291bnRpbmdUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBmdWxsVGltZVN0YW1wRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgZGlzY29udGludWl0eUZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGNudERyb3BwZWRGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBuRnJhbWVzW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBzZWNvbmRzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgc2Vjb25kc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBtaW51dGVzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgbWludXRlc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBob3Vyc0ZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGhvdXJzVmFsdWVbTUFYX05VTV9DTE9DS19UU107CisgICAgaTMyIHRpbWVPZmZzZXRbTUFYX05VTV9DTE9DS19UU107Cit9IHNlaVBpY1RpbWluZ190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwYW5TY2FuUmVjdElkOworICAgIHUzMiBwYW5TY2FuUmVjdENhbmNlbEZsYWc7CisgICAgdTMyIHBhblNjYW5DbnQ7CisgICAgaTMyIHBhblNjYW5SZWN0TGVmdE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICBpMzIgcGFuU2NhblJlY3RSaWdodE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICBpMzIgcGFuU2NhblJlY3RUb3BPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07CisgICAgaTMyIHBhblNjYW5SZWN0Qm90dG9tT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOworICAgIHUzMiBwYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2Q7Cit9IHNlaVBhblNjYW5SZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZTsKKyAgICB1MzIgaXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZTsKKyAgICB1OCAqaXR1VFQzNVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgdXVpZElzb0llYzExNTc4WzRdOworICAgIHU4ICp1c2VyRGF0YVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHJlY292ZXJ5RnJhbWVDbnQ7CisgICAgdTMyIGV4YWN0TWF0Y2hGbGFnOworICAgIHUzMiBicm9rZW5MaW5rRmxhZzsKKyAgICB1MzIgY2hhbmdpbmdTbGljZUdyb3VwSWRjOworfSBzZWlSZWNvdmVyeVBvaW50X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG9yaWdpbmFsSWRyRmxhZzsKKyAgICB1MzIgb3JpZ2luYWxGcmFtZU51bTsKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKK30gc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgdGFyZ2V0RnJhbWVOdW07CisgICAgdTMyIHNwYXJlRmllbGRGbGFnOworICAgIHUzMiB0YXJnZXRCb3R0b21GaWVsZEZsYWc7CisgICAgdTMyIG51bVNwYXJlUGljczsKKyAgICB1MzIgZGVsdGFTcGFyZUZyYW1lTnVtW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyIHNwYXJlQm90dG9tRmllbGRGbGFnW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyIHNwYXJlQXJlYUlkY1tNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiAqc3BhcmVVbml0RmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOworICAgIHUzMiAqemVyb1J1bkxlbmd0aFtNQVhfTlVNX1NQQVJFX1BJQ1NdOworfSBzZWlTcGFyZVBpY190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzY2VuZUluZm9QcmVzZW50RmxhZzsKKyAgICB1MzIgc2NlbmVJZDsKKyAgICB1MzIgc2NlbmVUcmFuc2l0aW9uVHlwZTsKKyAgICB1MzIgc2Vjb25kU2NlbmVJZDsKK30gc2VpU2NlbmVJbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHN1YlNlcUxheWVyTnVtOworICAgIHUzMiBzdWJTZXFJZDsKKyAgICB1MzIgZmlyc3RSZWZQaWNGbGFnOworICAgIHUzMiBsZWFkaW5nTm9uUmVmUGljRmxhZzsKKyAgICB1MzIgbGFzdFBpY0ZsYWc7CisgICAgdTMyIHN1YlNlcUZyYW1lTnVtRmxhZzsKKyAgICB1MzIgc3ViU2VxRnJhbWVOdW07Cit9IHNlaVN1YlNlcUluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbnVtU3ViU2VxTGF5ZXJzOworICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiBhdmVyYWdlQml0UmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKKyAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKK30gc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc3ViU2VxTGF5ZXJOdW07CisgICAgdTMyIHN1YlNlcUlkOworICAgIHUzMiBkdXJhdGlvbkZsYWc7CisgICAgdTMyIHN1YlNlcUR1cmF0aW9uOworICAgIHUzMiBhdmVyYWdlUmF0ZUZsYWc7CisgICAgdTMyIGFjY3VyYXRlU3RhdGlzdGljc0ZsYWc7CisgICAgdTMyIGF2ZXJhZ2VCaXRSYXRlOworICAgIHUzMiBhdmVyYWdlRnJhbWVSYXRlOworICAgIHUzMiBudW1SZWZlcmVuY2VkU3Vic2VxczsKKyAgICB1MzIgcmVmU3ViU2VxTGF5ZXJOdW1bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107CisgICAgdTMyIHJlZlN1YlNlcUlkW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiByZWZTdWJTZXFEaXJlY3Rpb25bTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Cit9IHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBmdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kOworfSBzZWlGdWxsRnJhbWVGcmVlemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc25hcFNob3RJZDsKK30gc2VpRnVsbEZyYW1lU25hcHNob3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQ7CisgICAgdTMyIG51bVJlZmluZW1lbnRTdGVwczsKK30gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOworfSBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG51bVNsaWNlR3JvdXBzSW5TZXQ7CisgICAgdTMyIHNsaWNlR3JvdXBJZFtNQVhfTlVNX1NMSUNFX0dST1VQU107CisgICAgdTMyIGV4YWN0U2FtcGxlVmFsdWVNYXRjaEZsYWc7CisgICAgdTMyIHBhblNjYW5SZWN0RmxhZzsKKyAgICB1MzIgcGFuU2NhblJlY3RJZDsKK30gc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTggKnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlOworICAgIHUzMiBudW1QYXlsb2FkQnl0ZXM7Cit9IHNlaVJlc2VydmVkU2VpTWVzc2FnZV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwYXlsb2FkVHlwZTsKKyAgICBzZWlCdWZmZXJpbmdQZXJpb2RfdCBidWZmZXJpbmdQZXJpb2Q7CisgICAgc2VpUGljVGltaW5nX3QgcGljVGltaW5nOworICAgIHNlaVBhblNjYW5SZWN0X3QgcGFuU2NhblJlY3Q7CisgICAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90IHVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzU7CisgICAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCB1c2VyRGF0YVVucmVnaXN0ZXJlZDsKKyAgICBzZWlSZWNvdmVyeVBvaW50X3QgcmVjb3ZlcnlQb2ludDsKKyAgICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90IGRlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uOworICAgIHNlaVNwYXJlUGljX3Qgc3BhcmVQaWM7CisgICAgc2VpU2NlbmVJbmZvX3Qgc2NlbmVJbmZvOworICAgIHNlaVN1YlNlcUluZm9fdCBzdWJTZXFJbmZvOworICAgIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3M7CisgICAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3Qgc3ViU2VxQ2hhcmFjdGVyaXN0aWNzOworICAgIHNlaUZ1bGxGcmFtZUZyZWV6ZV90IGZ1bGxGcmFtZUZyZWV6ZTsKKyAgICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90IGZ1bGxGcmFtZVNuYXBzaG90OworICAgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydDsKKyAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZDsKKyAgICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCBtb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQ7CisgICAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgcmVzZXJ2ZWRTZWlNZXNzYWdlOworfSBzZWlNZXNzYWdlX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKKyAgdTMyIG51bVNsaWNlR3JvdXBzKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0VJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMDUxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKKyAgICAgICAgICBHZXREcGJTaXplCisgICAgICAgICAgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZW51bWVyYXRpb24gdG8gaW5kaWNhdGUgaW52YWxpZCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgR2V0RHBiU2l6ZSBmdW5jdGlvbiAqLworZW51bSB7SU5WQUxJRF9EUEJfU0laRSA9IDB4N0ZGRkZGRkZ9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgRnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3Igb2Zmc2V0Rm9yUmVmRnJhbWUgYXJyYXkgaWYKKyAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQgdHlwZSBpcyAxIGFuZCBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUKKyAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIGludmFsaWQgaW5mb3JtYXRpb24gb3IgZW5kIG9mIHN0cmVhbQorICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNlcVBhcmFtU2V0LCAwLCBzaXplb2Yoc2VxUGFyYW1TZXRfdCkpOworCisgICAgLyogcHJvZmlsZV9pZGMgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGlmICh0bXAgIT0gNjYpCisgICAgeworICAgICAgICBERUJVRygoIk5PVCBCQVNFTElORSBQUk9GSUxFICVkXG4iLCB0bXApKTsKKyAgICB9CisgICAgcFNlcVBhcmFtU2V0LT5wcm9maWxlSWRjID0gdG1wOworCisgICAgLyogY29uc3RyYWluZWRfc2V0MF9mbGFnICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAvKiBjb25zdHJhaW5lZF9zZXQxX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIGNvbnN0cmFpbmVkX3NldDJfZmxhZyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHJlc2VydmVkX3plcm9fNWJpdHMsIHZhbHVlcyBvZiB0aGVzZSBiaXRzIHNoYWxsIGJlIGlnbm9yZWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPmxldmVsSWRjID0gdG1wOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID4gMTIpCisgICAgeworICAgICAgICBFUFJJTlQoImxvZzJfbWF4X2ZyYW1lX251bV9taW51czQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICAvKiBtYXhGcmFtZU51bSA9IDJeKGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KSAqLworICAgIHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPSAxIDw8ICh2YWx1ZSs0KTsKKworICAgIC8qIHZhbGlkIFBPQyB0eXBlcyBhcmUgMCwgMSBhbmQgMiAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDIpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19vcmRlcl9jbnRfdHlwZSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID0gdmFsdWU7CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAodmFsdWUgPiAxMikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICAvKiBtYXhQaWNPcmRlckNudExzYiA9IDJeKGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpICovCisgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPSAxIDw8ICh2YWx1ZSs0KTsKKyAgICB9CisgICAgZWxzZSBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvck5vblJlZlBpYyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlID4gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTk9URTogVGhpcyBoYXMgdG8gYmUgZnJlZWQgc29tZXdoZXJlISAqLworICAgICAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlLCBpMzIpOworICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgKyBpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyA+IE1BWF9OVU1fUkVGX1BJQ1MpCisgICAgeworICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgPSB2YWx1ZSArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzID0gdmFsdWUgKyAxOworCisgICAgLyogZnJhbWVfbWJzX29ubHlfZmxhZywgc2hhbGwgYmUgMSBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKCF0bXApCisgICAgeworICAgICAgICBFUFJJTlQoImZyYW1lX21ic19vbmx5X2ZsYWciKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcHBpbmdGbGFnID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wTGVmdE9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BUb3BPZmZzZXQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAvKiBjaGVjayB0aGF0IGZyYW1lIGNyb3BwaW5nIHBhcmFtcyBhcmUgdmFsaWQsIHBhcmFtZXRlcnMgc2hhbGwKKyAgICAgICAgICogc3BlY2lmeSBub24tbmVnYXRpdmUgYXJlYSB3aXRoaW4gdGhlIG9yaWdpbmFsIHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKCAoIChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ID4KKyAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzIC0KKyAgICAgICAgICAgICAgICAgKChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCArIDEpICkgKSB8fAorICAgICAgICAgICAgICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCA+CisgICAgICAgICAgICAgICAoIDggKiAoaTMyKXBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgLQorICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCArIDEpICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiZnJhbWVfY3JvcHBpbmciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgbGV2ZWxJZGMgbWF0Y2ggKi8KKyAgICB0bXAgPSBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzOworICAgIHZhbHVlID0gR2V0RHBiU2l6ZSh0bXAsIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMpOworICAgIGlmICh2YWx1ZSA9PSBJTlZBTElEX0RQQl9TSVpFIHx8IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gdmFsdWUpCisgICAgeworICAgICAgICBERUJVRygoIldBUk5JTkchIEludmFsaWQgRFBCIHNpemUgYmFzZWQgb24gU1BTIExldmVsIVxuIikpOworICAgICAgICBERUJVRygoIldBUk5JTkchIFVzaW5nIG51bV9yZWZfZnJhbWVzID0lZCBmb3IgRFBCIHNpemUhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpKTsKKyAgICAgICAgdmFsdWUgPSBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lczsKKyAgICB9CisgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0gdmFsdWU7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgLyogVlVJICovCisgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLCAxLCB2dWlQYXJhbWV0ZXJzX3QpOworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhwU3RybURhdGEsCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAvKiBjaGVjayBudW1SZW9yZGVyRnJhbWVzIGFuZCBtYXhEZWNGcmFtZUJ1ZmZlcmluZyAqLworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgPgorICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIHx8CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA8CisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzIHx8CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA+CisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgdGhhdCAidGhlIHNlcXVlbmNlIHNoYWxsIG5vdCByZXF1aXJlIGEgRFBCIHdpdGgKKyAgICAgICAgICAgICAqIHNpemUgb2YgbW9yZSB0aGFuIG1heCgxLCBtYXhEZWNGcmFtZUJ1ZmZlcmluZykgKi8KKyAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSA9CisgICAgICAgICAgICAgICAgTUFYKDEsIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKTsKKworICAgIC8qIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgaW4gdHJhaWxpbmcgYml0cyBvZiBwYXJhbWV0ZXJzIHNldHMgKi8KKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldERwYlNpemUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMuIFNpemUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBhbmQgTWF4RFBCIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsLiBUaGVzZSBkZXRlcm1pbmUKKyAgICAgICAgICAgIGhvdyBtYW55IHBpY3R1cmVzIG1heSBmaXQgaW50byB0byB0aGUgYnVmZmVyLiBIb3dldmVyLCB0aGUgc2l6ZQorICAgICAgICAgICAgaXMgYWxzbyBsaW1pdGVkIHRvIGEgbWF4aW11bSBvZiAxNiBmcmFtZXMgYW5kIHRoZXJlZm9yZSBmdW5jdGlvbgorICAgICAgICAgICAgcmV0dXJucyB0aGUgbWluaW11bSBvZiB0aGUgZGV0ZXJtaW5lZCBzaXplIGFuZCAxNi4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGluIHRoZSBwaWN0dXJlCisgICAgICAgICAgICBsZXZlbElkYyAgICAgICAgaW5kaWNhdGVzIHRoZSBsZXZlbAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMKKyAgICAgICAgICAgIElOVkFMSURfRFBCX1NJWkUgd2hlbiBpbnZhbGlkIGxldmVsSWRjIHNwZWNpZmllZCBvciBwaWNTaXplSW5NYnMKKyAgICAgICAgICAgIGlzIGhpZ2hlciB0aGFuIHN1cHBvcnRlZCBieSB0aGUgbGV2ZWwgaW4gcXVlc3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIEdldERwYlNpemUodTMyIHBpY1NpemVJbk1icywgdTMyIGxldmVsSWRjKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisgICAgdTMyIG1heFBpY1NpemVJbk1iczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisKKyAgICAvKiB1c2UgdG1wIGFzIHRoZSBzaXplIG9mIHRoZSBEUEIgaW4gYnl0ZXMsIGNvbXB1dGVzIGFzIDEwMjQgKiBNYXhEUEIKKyAgICAgKiAoZnJvbSB0YWJsZSBBLTEgaW4gQW5uZXggQSkgKi8KKyAgICBzd2l0Y2ggKGxldmVsSWRjKQorICAgIHsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIHRtcCA9IDE1MjA2NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDk5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHRtcCA9IDM0NTYwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB0bXAgPSA5MTIzODQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgdG1wID0gOTEyMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICB0bXAgPSAxODI0NzY4OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gNzkyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgIHRtcCA9IDY5MTIwMDA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIHRtcCA9IDc4NjQzMjA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA1MTIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICB0bXAgPSAxMjU4MjkxMjsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDgxOTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgdG1wID0gMzQ4MTYqMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODcwNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAvKiBzdGFuZGFyZCBzYXlzIDQyMzAxNDQwIGhlcmUsIGJ1dCBjb3JyaWdlbmR1bSAiY29ycmVjdHMiIHRoaXMgdG8KKyAgICAgICAgICAgICAqIDQyMzkzNjAwICovCisgICAgICAgICAgICB0bXAgPSA0MjM5MzYwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDIyMDgwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgIHRtcCA9IDcwNzc4ODgwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzY4NjQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKElOVkFMSURfRFBCX1NJWkUpOworICAgIH0KKworICAgIC8qIHRoaXMgaXMgbm90ICJjb3JyZWN0IiByZXR1cm4gdmFsdWUhIEhvd2V2ZXIsIGl0IHJlc3VsdHMgaW4gZXJyb3IgaW4KKyAgICAgKiBkZWNvZGluZyBhbmQgdGhpcyB3YXMgZWFzaWVzdCBwbGFjZSB0byBjaGVjayBwaWN0dXJlIHNpemUgKi8KKyAgICBpZiAocGljU2l6ZUluTWJzID4gbWF4UGljU2l6ZUluTWJzKQorICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7CisKKyAgICB0bXAgLz0gKHBpY1NpemVJbk1icyozODQpOworCisgICAgcmV0dXJuKE1JTih0bXAsIDE2KSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTcHMxICAgcG9pbnRlciB0byBhIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKyAgICAgICAgICAgIHBTcHMyICAgcG9pbnRlciB0byBhbm90aGVyIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgMCAgICAgICBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcmUgZXF1YWwKKyAgICAgICAgICAgIDEgICAgICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3BzMSk7CisgICAgQVNTRVJUKHBTcHMyKTsKKworICAgIC8qIGZpcnN0IGNvbXBhcmUgcGFyYW1ldGVycyB3aG9zZSBleGlzdGVuY2UgZG9lcyBub3QgZGVwZW5kIG9uIG90aGVyCisgICAgICogcGFyYW1ldGVycyBhbmQgb25seSBjb21wYXJlIHRoZSByZXN0IG9mIHRoZSBwYXJhbXMgaWYgdGhlc2UgYXJlIGVxdWFsICovCisgICAgaWYgKHBTcHMxLT5wcm9maWxlSWRjICAgICAgICA9PSBwU3BzMi0+cHJvZmlsZUlkYyAmJgorICAgICAgICBwU3BzMS0+bGV2ZWxJZGMgICAgICAgICAgPT0gcFNwczItPmxldmVsSWRjICYmCisgICAgICAgIHBTcHMxLT5tYXhGcmFtZU51bSAgICAgICA9PSBwU3BzMi0+bWF4RnJhbWVOdW0gJiYKKyAgICAgICAgcFNwczEtPnBpY09yZGVyQ250VHlwZSAgID09IHBTcHMyLT5waWNPcmRlckNudFR5cGUgJiYKKyAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lcyAgICAgID09IHBTcHMyLT5udW1SZWZGcmFtZXMgJiYKKyAgICAgICAgcFNwczEtPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyA9PQorICAgICAgICAgICAgcFNwczItPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyAmJgorICAgICAgICBwU3BzMS0+cGljV2lkdGhJbk1icyAgICAgPT0gcFNwczItPnBpY1dpZHRoSW5NYnMgJiYKKyAgICAgICAgcFNwczEtPnBpY0hlaWdodEluTWJzICAgID09IHBTcHMyLT5waWNIZWlnaHRJbk1icyAmJgorICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcgPT0gcFNwczItPmZyYW1lQ3JvcHBpbmdGbGFnICYmCisgICAgICAgIHBTcHMxLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPT0gcFNwczItPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIGlmIChwU3BzMS0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3BzMS0+bWF4UGljT3JkZXJDbnRMc2IgIT0gcFNwczItPm1heFBpY09yZGVyQ250THNiKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTcHMxLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNwczItPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JOb25SZWZQaWMgIT0gcFNwczItPm9mZnNldEZvck5vblJlZlBpYyB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICE9CisgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkIHx8CisgICAgICAgICAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSAhPQorICAgICAgICAgICAgICAgICAgICBwU3BzMi0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwU3BzMS0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV0gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcHBpbmdGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcExlZnRPZmZzZXQgICAhPSBwU3BzMi0+ZnJhbWVDcm9wTGVmdE9mZnNldCB8fAorICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BSaWdodE9mZnNldCAgIT0gcFNwczItPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFRvcE9mZnNldCAgICAhPSBwU3BzMi0+ZnJhbWVDcm9wVG9wT2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCAhPSBwU3BzMi0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxOGRmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlCisgKiBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByb2ZpbGVJZGM7CisgICAgdTMyIGxldmVsSWRjOworICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgbWF4RnJhbWVOdW07CisgICAgdTMyIHBpY09yZGVyQ250VHlwZTsKKyAgICB1MzIgbWF4UGljT3JkZXJDbnRMc2I7CisgICAgdTMyIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZzsKKyAgICBpMzIgb2Zmc2V0Rm9yTm9uUmVmUGljOworICAgIGkzMiBvZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkOworICAgIHUzMiBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7CisgICAgaTMyICpvZmZzZXRGb3JSZWZGcmFtZTsKKyAgICB1MzIgbnVtUmVmRnJhbWVzOworICAgIHUzMiBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWc7CisgICAgdTMyIHBpY1dpZHRoSW5NYnM7CisgICAgdTMyIHBpY0hlaWdodEluTWJzOworICAgIHUzMiBmcmFtZUNyb3BwaW5nRmxhZzsKKyAgICB1MzIgZnJhbWVDcm9wTGVmdE9mZnNldDsKKyAgICB1MzIgZnJhbWVDcm9wUmlnaHRPZmZzZXQ7CisgICAgdTMyIGZyYW1lQ3JvcFRvcE9mZnNldDsKKyAgICB1MzIgZnJhbWVDcm9wQm90dG9tT2Zmc2V0OworICAgIHUzMiB2dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWc7CisgICAgdnVpUGFyYW1ldGVyc190ICp2dWlQYXJhbWV0ZXJzOworICAgIHUzMiBtYXhEcGJTaXplOworfSBzZXFQYXJhbVNldF90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7CisKK3UzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzI4OGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCisgICAgICAgICAgU2V0TWJQYXJhbXMKKyAgICAgICAgICBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9kYXRhLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAorICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4xICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBvbmUgc2xpY2UuIEZ1bmN0aW9uIGRlY29kZXMgc3RyZWFtIGRhdGEsIGkuZS4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIGFuZCBwb3NzaWJsZSBza2lwX3J1biBmaWVsZHMuIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBjYWxsZWQgdG8gaGFuZGxlIGFsbCBvdGhlciBtYWNyb2Jsb2NrIHJlbGF0ZWQgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIE1hY3JvYmxvY2sgdG8gc2xpY2UgZ3JvdXAgbWFwcGluZyBpcyBjb25zaWRlcmVkIHdoZW4gbmV4dAorICAgICAgICAgICAgbWFjcm9ibG9jayB0byBwcm9jZXNzIGlzIGRldGVybWluZWQgKGgyNjRic2ROZXh0TWJBZGRyZXNzIGZ1bmN0aW9uKQorICAgICAgICAgICAgbWFwCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwcm9jZXNzZWQgcGljdHVyZSwgbmVlZGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhIHByZWRpY3Rpb24gb2YgdGhlIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwU2xpY2VIZWFkZXIgICAgcG9pbnRlciB0byBzbGljZSBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgc2xpY2UKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHByb2Nlc3NlZCBtYWNyb2Jsb2NrcyBhcmUgd3JpdHRlbiB0byBjdXJyZW50IGltYWdlCisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgbWJTdG9yYWdlIHN0cnVjdHVyZSBvZiBlYWNoIHByb2Nlc3NlZCBtYWNyb2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXBkYXRlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEsIHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCisgICAgaW1hZ2VfdCAqY3VyckltYWdlLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTggbWJEYXRhWzM4NCArIDE1ICsgMzJdOworICAgIHU4ICpkYXRhOworICAgIHUzMiB0bXA7CisgICAgdTMyIHNraXBSdW47CisgICAgdTMyIHByZXZTa2lwcGVkOworICAgIHUzMiBjdXJyTWJBZGRyOworICAgIHUzMiBtb3JlTWJzOworICAgIHUzMiBtYkNvdW50OworICAgIGkzMiBxcFk7CisgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKKworICAgIC8qIGVuc3VyZSAxNi1ieXRlIGFsaWdubWVudCAqLworICAgIGRhdGEgPSAodTgqKUFMSUdOKG1iRGF0YSwgMTYpOworCisgICAgbWJMYXllciA9IHBTdG9yYWdlLT5tYkxheWVyOworCisgICAgY3Vyck1iQWRkciA9IHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2U7CisgICAgc2tpcFJ1biA9IDA7CisgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBpbmNyZW1lbnQgc2xpY2UgaW5kZXgsIHdpbGwgYmUgb25lIGZvciBkZWNvZGluZyBvZiB0aGUgZmlyc3Qgc2xpY2Ugb2YKKyAgICAgKiB0aGUgcGljdHVyZSAqLworICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCsrOworCisgICAgLyogbGFzdE1iQWRkciBzdG9yZXMgYWRkcmVzcyBvZiB0aGUgbWFjcm9ibG9jayB0aGF0IHdhcyBsYXN0IHN1Y2Nlc3NmdWxseQorICAgICAqIGRlY29kZWQsIG5lZWRlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSAwOworCisgICAgbWJDb3VudCA9IDA7CisgICAgLyogaW5pdGlhbCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGUgc2xpY2UgaXMgb2J0YWluZWQgYXMgdGhlIHN1bSBvZgorICAgICAqIGluaXRpYWwgUVAgZm9yIHRoZSBwaWN0dXJlIGFuZCBzbGljZVFwRGVsdGEgZm9yIHRoZSBjdXJyZW50IHNsaWNlICovCisgICAgcXBZID0gKGkzMilwU3RvcmFnZS0+YWN0aXZlUHBzLT5waWNJbml0UXAgKyBwU2xpY2VIZWFkZXItPnNsaWNlUXBEZWx0YTsKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogcHJpbWFyeSBwaWN0dXJlIGFuZCBhbHJlYWR5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBlcnJvciAqLworICAgICAgICBpZiAoIXBTbGljZUhlYWRlci0+cmVkdW5kYW50UGljQ250ICYmIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIlByaW1hcnkgYW5kIGFscmVhZHkgZGVjb2RlZCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgU2V0TWJQYXJhbXMocFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkLCBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKKworICAgICAgICBpZiAoIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXByZXZTa2lwcGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZza2lwUnVuKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgLyogc2tpcF9ydW4gc2hhbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAqIG1hY3JvYmxvY2tzIGxlZnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2tpcFJ1biA+IChwU3RvcmFnZS0+cGljU2l6ZUluTWJzIC0gY3Vyck1iQWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoInNraXBfcnVuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNraXBSdW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoJm1iTGF5ZXItPm1iUHJlZCwgMCwgc2l6ZW9mKG1iUHJlZF90KSk7CisgICAgICAgICAgICAgICAgICAgIC8qIG1hcmsgY3VycmVudCBtYWNyb2Jsb2NrIHNraXBwZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgbWJMYXllci0+bWJUeXBlID0gUF9Ta2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChza2lwUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlNraXBwaW5nIG1hY3JvYmxvY2sgJWRcbiIsIGN1cnJNYkFkZHIpKTsKKyAgICAgICAgICAgIHNraXBSdW4tLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihwU3RybURhdGEsIG1iTGF5ZXIsCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgcFNsaWNlSGVhZGVyLT5zbGljZVR5cGUsCisgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIm1hY3JvYmxvY2tfbGF5ZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIG1iTGF5ZXIsCisgICAgICAgICAgICBjdXJySW1hZ2UsIHBTdG9yYWdlLT5kcGIsICZxcFksIGN1cnJNYkFkZHIsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLT5jb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIGRhdGEpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJNQUNST19CTE9DSyIpOworICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbmNyZW1lbnQgbWFjcm9ibG9jayBjb3VudCBvbmx5IGZvciBtYWNyb2Jsb2NrcyB0aGF0IHdlcmUgZGVjb2RlZAorICAgICAgICAgKiBmb3IgdGhlIGZpcnN0IHRpbWUgKHJlZHVuZGFudCBzbGljZXMpICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCA9PSAxKQorICAgICAgICAgICAgbWJDb3VudCsrOworCisgICAgICAgIC8qIGtlZXAgb24gcHJvY2Vzc2luZyBhcyBsb25nIGFzIHRoZXJlIGlzIHN0cmVhbSBkYXRhIGxlZnQgb3IKKyAgICAgICAgICogcHJvY2Vzc2luZyBvZiBtYWNyb2Jsb2NrcyB0byBiZSBza2lwcGVkIGJhc2VkIG9uIHRoZSBsYXN0IHNraXBSdW4gaXMKKyAgICAgICAgICogbm90IGZpbmlzaGVkICovCisgICAgICAgIG1vcmVNYnMgPSAoaDI2NGJzZE1vcmVSYnNwRGF0YShwU3RybURhdGEpIHx8IHNraXBSdW4pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAvKiBsYXN0TWJBZGRyIGlzIG9ubHkgdXBkYXRlZCBmb3IgaW50cmEgc2xpY2VzIChhbGwgbWFjcm9ibG9ja3Mgb2YKKyAgICAgICAgICogaW50ZXIgc2xpY2VzIHdpbGwgYmUgbG9zdCBpbiBjYXNlIG9mIGFuIGVycm9yKSAqLworICAgICAgICBpZiAoSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCisgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgPSBjdXJyTWJBZGRyOworCisgICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOworICAgICAgICAvKiBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBidXQgbm8gbW9yZSBtYWNyb2Jsb2NrcyBmb3IgY3VycmVudCBzbGljZQorICAgICAgICAgKiBncm91cCAtPiBlcnJvciAqLworICAgICAgICBpZiAobW9yZU1icyAmJiAhY3Vyck1iQWRkcikKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJOZXh0IG1iIGFkZHJlc3MiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAobW9yZU1icyk7CisKKyAgICBpZiAoKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyArIG1iQ291bnQpID4gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKKyAgICB7CisgICAgICAgIEVQUklOVCgiTnVtIGRlY29kZWQgbWJzIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKz0gbWJDb3VudDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMiAgRnVuY3Rpb246IFNldE1iUGFyYW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFNldCBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgdGhhdCByZW1haW4gY29uc3RhbnQgZm9yIHRoaXMgc2xpY2UKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU2xpY2UgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgc2xpY2UgaGVhZGVyCisgICAgICAgICAgICBzbGljZUlkICAgICBpZCBvZiB0aGUgY3VycmVudCBzbGljZQorICAgICAgICAgICAgY2hyb21hUXBJbmRleE9mZnNldAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIHdoaWNoIGlzIHVwZGF0ZWQKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNldE1iUGFyYW1zKG1iU3RvcmFnZV90ICpwTWIsIHNsaWNlSGVhZGVyX3QgKnBTbGljZSwgdTMyIHNsaWNlSWQsCisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiB0bXAxOworICAgIGkzMiB0bXAyLCB0bXAzOworCisvKiBDb2RlICovCisKKyAgICB0bXAxID0gcFNsaWNlLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKKyAgICB0bXAyID0gcFNsaWNlLT5zbGljZUFscGhhQzBPZmZzZXQ7CisgICAgdG1wMyA9IHBTbGljZS0+c2xpY2VCZXRhT2Zmc2V0OworICAgIHBNYi0+c2xpY2VJZCA9IHNsaWNlSWQ7CisgICAgcE1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IHRtcDE7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRBID0gdG1wMjsKKyAgICBwTWItPmZpbHRlck9mZnNldEIgPSB0bXAzOworICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCA9IGNocm9tYVFwSW5kZXhPZmZzZXQ7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4zICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1hcmsgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGNvcnJ1cHRlZC4gSWYgbGFzdE1iQWRkciBpbiB0aGUgc2xpY2UKKyAgICAgICAgICAgIHN0b3JhZ2UgaXMgc2V0IC0+IHBpY1dpZGh0SW5NYnMgKG9yIGF0IGxlYXN0IDEwKSBtYWNyb2Jsb2NrcyBiYWNrCisgICAgICAgICAgICBmcm9tICB0aGUgbGFzdE1iQWRkciBhcmUgbWFya2VkIGNvcnJ1cHRlZC4gSG93ZXZlciwgaWYgbGFzdE1iQWRkcgorICAgICAgICAgICAgaXMgbm90IHNldCAtPiBhbGwgbWFjcm9ibG9ja3Mgb2YgdGhlIHNsaWNlIGFyZSBtYXJrZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZpcnN0TWJJblNsaWNlICBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSwgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIHNsaWNlIHRvIGJlIG1hcmtlZCBjb3JydXB0ZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBmb3IgdGhlIGNvcnJ1cHRlZCBtYWNyb2Jsb2NrcyB1cGRhdGVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworICAgIHUzMiBzbGljZUlkOworICAgIHUzMiBjdXJyTWJBZGRyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChmaXJzdE1iSW5TbGljZSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOworCisgICAgY3Vyck1iQWRkciA9IGZpcnN0TWJJblNsaWNlOworCisgICAgc2xpY2VJZCA9IHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZDsKKworICAgIC8qIERlY29kZVNsaWNlRGF0YSBzZXRzIGxhc3RNYkFkZHIgZm9yIEkgc2xpY2VzIC0+IGlmIGl0IHdhcyBzZXQsIGdvIGJhY2sKKyAgICAgKiBNQVgocGljV2lkdGhJbk1icywgMTApIG1hY3JvYmxvY2tzIGFuZCBzdGFydCBtYXJraW5nIGZyb20gdGhlcmUgKi8KKyAgICBpZiAocFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHBTdG9yYWdlLT5tYltwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCk7CisgICAgICAgIGkgPSBwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIgLSAxOworICAgICAgICB0bXAgPSAwOworICAgICAgICB3aGlsZSAoaSA+IGN1cnJNYkFkZHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+bWJbaV0uc2xpY2VJZCA9PSBzbGljZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIGlmICh0bXAgPj0gTUFYKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsIDEwKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0KKyAgICAgICAgY3Vyck1iQWRkciA9IGk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgaWYgKCAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLnNsaWNlSWQgPT0gc2xpY2VJZCkgJiYKKyAgICAgICAgICAgICAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQpICkKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3Vyck1iQWRkciA9IGgyNjRic2ROZXh0TWJBZGRyZXNzKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgY3Vyck1iQWRkcik7CisKKyAgICB9IHdoaWxlIChjdXJyTWJBZGRyKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjNkNDllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlcik7CisKK3ZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9EQVRBX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjYmI1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKQEAgLTAsMCArMSw1ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcAorICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcAorICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAorICAgICAgICAgIERlY29kZUJveE91dE1hcAorICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAKKyAgICAgICAgICBEZWNvZGVXaXBlTWFwCisgICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyICpydW5MZW5ndGgsCisgIHUzMiBwaWNTaXplKTsKKworc3RhdGljIHZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCitzdGF0aWMgdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqdG9wTGVmdCwKKyAgdTMyICpib3R0b21SaWdodCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworc3RhdGljIHZvaWQgRGVjb2RlQm94T3V0TWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCitzdGF0aWMgdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNTaXplKTsKKworc3RhdGljIHZvaWQgRGVjb2RlV2lwZU1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUludGVybGVhdmVkTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBpbnRlcmxlYXZlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQorICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgcnVuTGVuZ3RoICAgICAgIHJ1bl9sZW5ndGhbXSB2YWx1ZXMgZm9yIGVhY2ggc2xpY2UgZ3JvdXAKKyAgICAgICAgICAgIHBpY1NpemUgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqcnVuTGVuZ3RoLAorICB1MzIgcGljU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSxqLCBncm91cDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVChydW5MZW5ndGgpOworCisgICAgaSA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG51bVNsaWNlR3JvdXBzICYmIGkgPCBwaWNTaXplOworICAgICAgICAgIGkgKz0gcnVuTGVuZ3RoW2dyb3VwKytdKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQocnVuTGVuZ3RoW2dyb3VwXSA8PSBwaWNTaXplKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW5MZW5ndGhbZ3JvdXBdICYmIGkgKyBqIDwgcGljU2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIG1hcFtpK2pdID0gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpIDwgcGljU2l6ZSk7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZURpc3BlcnNlZE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZGlzcGVyc2VkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCisgICAgICAgICAgICBncm91cCBtYXAgdHlwZSAxLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcGljU2l6ZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBtYXBbaV0gPSAoKGkgJSBwaWNXaWR0aCkgKyAoKChpIC8gcGljV2lkdGgpICogbnVtU2xpY2VHcm91cHMpID4+IDEpKSAlCisgICAgICAgICAgICBudW1TbGljZUdyb3VwczsKKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBmb3JlZ3JvdW5kIHdpdGggbGVmdC1vdmVyIHNsaWNlIGdyb3VwIG1hcCB0eXBlLAorICAgICAgICAgICAgaS5lLiBzbGljZSBncm91cCBtYXAgdHlwZSAyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICAgICAgICAgICAgdG9wTGVmdCAgICAgICAgICAgdG9wX2xlZnRbXSB2YWx1ZXMKKyAgICAgICAgICAgIGJvdHRvbVJpZ2h0ICAgICAgIGJvdHRvbV9yaWdodFtdIHZhbHVlcworICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiAqdG9wTGVmdCwKKyAgdTMyICpib3R0b21SaWdodCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLHkseCx5VG9wTGVmdCx5Qm90dG9tUmlnaHQseFRvcExlZnQseEJvdHRvbVJpZ2h0LCBwaWNTaXplOworICAgIHUzMiBncm91cDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOworICAgIEFTU0VSVCh0b3BMZWZ0KTsKKyAgICBBU1NFUlQoYm90dG9tUmlnaHQpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBtYXBbaV0gPSBudW1TbGljZUdyb3VwcyAtIDE7CisKKyAgICBmb3IgKGdyb3VwID0gbnVtU2xpY2VHcm91cHMgLSAxOyBncm91cC0tOyApCisgICAgeworICAgICAgICBBU1NFUlQoIHRvcExlZnRbZ3JvdXBdIDw9IGJvdHRvbVJpZ2h0W2dyb3VwXSAmJgorICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0W2dyb3VwXSA8IHBpY1NpemUgKTsKKyAgICAgICAgeVRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAvIHBpY1dpZHRoOworICAgICAgICB4VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdICUgcGljV2lkdGg7CisgICAgICAgIHlCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAvIHBpY1dpZHRoOworICAgICAgICB4Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gJSBwaWNXaWR0aDsKKyAgICAgICAgQVNTRVJUKHhUb3BMZWZ0IDw9IHhCb3R0b21SaWdodCk7CisKKyAgICAgICAgZm9yICh5ID0geVRvcExlZnQ7IHkgPD0geUJvdHRvbVJpZ2h0OyB5KyspCisgICAgICAgICAgICBmb3IgKHggPSB4VG9wTGVmdDsgeCA8PSB4Qm90dG9tUmlnaHQ7IHgrKykKKyAgICAgICAgICAgICAgICBtYXBbIHkgKiBwaWNXaWR0aCArIHggXSA9IGdyb3VwOworICAgIH0KKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlQm94T3V0TWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBib3gtb3V0IHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwCisgICAgICAgICAgICBtYXAgdHlwZSAzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKKyAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCAgICAgICAgICAgICAgICBtYnMgb24gc2xpY2UgZ3JvdXAgMAorICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVCb3hPdXRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgaywgcGljU2l6ZTsKKyAgICBpMzIgeCwgeSwgeERpciwgeURpciwgbGVmdEJvdW5kLCB0b3BCb3VuZCwgcmlnaHRCb3VuZCwgYm90dG9tQm91bmQ7CisgICAgdTMyIG1hcFVuaXRWYWNhbnQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisgICAgQVNTRVJUKHVuaXRzSW5TbGljZUdyb3VwMCA8PSBwaWNTaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgIG1hcFtpXSA9IDE7CisKKyAgICB4ID0gKHBpY1dpZHRoIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKKyAgICB5ID0gKHBpY0hlaWdodCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7CisKKyAgICBsZWZ0Qm91bmQgPSB4OworICAgIHRvcEJvdW5kID0geTsKKworICAgIHJpZ2h0Qm91bmQgPSB4OworICAgIGJvdHRvbUJvdW5kID0geTsKKworICAgIHhEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKKyAgICB5RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKworICAgIGZvciAoayA9IDA7IGsgPCB1bml0c0luU2xpY2VHcm91cDA7IGsgKz0gbWFwVW5pdFZhY2FudCA/IDEgOiAwKQorICAgIHsKKyAgICAgICAgbWFwVW5pdFZhY2FudCA9IChtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIGlmIChtYXBVbml0VmFjYW50KQorICAgICAgICAgICAgbWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID0gMDsKKworICAgICAgICBpZiAoeERpciA9PSAtMSAmJiB4ID09IGxlZnRCb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgbGVmdEJvdW5kID0gTUFYKGxlZnRCb3VuZCAtIDEsIDApOworICAgICAgICAgICAgeCA9IGxlZnRCb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAwOworICAgICAgICAgICAgeURpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh4RGlyID09IDEgJiYgeCA9PSByaWdodEJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICByaWdodEJvdW5kID0gTUlOKHJpZ2h0Qm91bmQgKyAxLCAoaTMyKXBpY1dpZHRoIC0gMSk7CisgICAgICAgICAgICB4ID0gcmlnaHRCb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAwOworICAgICAgICAgICAgeURpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh5RGlyID09IC0xICYmIHkgPT0gdG9wQm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvcEJvdW5kID0gTUFYKHRvcEJvdW5kIC0gMSwgMCk7CisgICAgICAgICAgICB5ID0gdG9wQm91bmQ7CisgICAgICAgICAgICB4RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgICAgICAgICAgeURpciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeURpciA9PSAxICYmIHkgPT0gYm90dG9tQm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvdHRvbUJvdW5kID0gTUlOKGJvdHRvbUJvdW5kICsgMSwgKGkzMilwaWNIZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHkgPSBib3R0b21Cb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7CisgICAgICAgICAgICB5RGlyID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0geERpcjsKKyAgICAgICAgICAgIHkgKz0geURpcjsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmFzdGVyU2Nhbk1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcmFzdGVyIHNjYW4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKKyAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZworICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAorICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocGljU2l6ZSk7CisgICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1NpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgaWYgKGkgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKKyAgICAgICAgICAgIG1hcFtpXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hcFtpXSA9IDEgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVXaXBlTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB3aXBlIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwIG1hcAorICAgICAgICAgICAgdHlwZSA1LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKKyAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgRGVjb2RlV2lwZU1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksaixrOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNXaWR0aCAqIHBpY0hlaWdodCk7CisKKyAgICBrID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgcGljV2lkdGg7IGorKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY0hlaWdodDsgaSsrKQorICAgICAgICAgICAgaWYgKGsrKyA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQorICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9IDEgLQorICAgICAgICAgICAgICAgICAgICAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXAuIENvbnN0cnVjdGlvbgorICAgICAgICAgICAgb2YgZGlmZmVyZW50IHNsaWNlIGdyb3VwIG1hcCB0eXBlcyBpcyBoYW5kbGVkIGJ5IHNlcGFyYXRlCisgICAgICAgICAgICBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzIGhvdyBzbGljZSBncm91cAorICAgICAgICAgICAgbWFwcyBhcmUgY29tcHV0ZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcHBzICAgICAgICAgICAgICAgICAgICAgYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAorICB1MzIgKm1hcCwKKyAgcGljUGFyYW1TZXRfdCAqcHBzLAorICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHBpY1NpemUsIHVuaXRzSW5TbGljZUdyb3VwMCA9IDAsIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKHBwcyk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKyAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDcpOworCisgICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OworCisgICAgLyoganVzdCBvbmUgc2xpY2UgZ3JvdXAgLT4gYWxsIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBncm91cCAwICovCisgICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPT0gMSkKKyAgICB7CisgICAgICAgIEgyNjRTd0RlY01lbXNldChtYXAsIDAsIHBpY1NpemUgKiBzaXplb2YodTMyKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCisgICAgeworICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAmJgorICAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplKTsKKworICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgPQorICAgICAgICAgICAgTUlOKHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAqIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUsIHBpY1NpemUpOworCisgICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQgfHwgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KQorICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID8KKyAgICAgICAgICAgICAgICAocGljU2l6ZSAtIHVuaXRzSW5TbGljZUdyb3VwMCkgOiB1bml0c0luU2xpY2VHcm91cDA7CisgICAgfQorCisgICAgc3dpdGNoIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAorICAgICAgICAgICAgICBwcHMtPnJ1bkxlbmd0aCwgcGljU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLCBwaWNXaWR0aCwKKyAgICAgICAgICAgICAgcGljSGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCisgICAgICAgICAgICAgIHBwcy0+dG9wTGVmdCwgcHBzLT5ib3R0b21SaWdodCwgcGljV2lkdGgsIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICAgICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcChtYXAsCisgICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsIHNpemVPZlVwcGVyTGVmdEdyb3VwLAorICAgICAgICAgICAgICBwaWNTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERlY29kZVdpcGVNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICAgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCwgcGljV2lkdGgsIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkW2ldIDwgcHBzLT5udW1TbGljZUdyb3Vwcyk7CisgICAgICAgICAgICAgICAgbWFwW2ldID0gcHBzLT5zbGljZUdyb3VwSWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiY2I2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAoCisgIHUzMiAqbWFwLAorICBwaWNQYXJhbVNldF90ICpwcHMsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2M2ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCkBAIC0wLDAgKzEsMTUxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcgorICAgICAgICAgIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKKyAgICAgICAgICBSZWZQaWNMaXN0UmVvcmRlcmluZworICAgICAgICAgIERlY1JlZlBpY01hcmtpbmcKKyAgICAgICAgICBDaGVja1Bwc0lkCisgICAgICAgICAgQ2hlY2tGcmFtZU51bQorICAgICAgICAgIENoZWNrSWRyUGljSWQKKyAgICAgICAgICBDaGVja1BpY09yZGVyQ250THNiCisgICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCisgICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250CisgICAgICAgICAgQ2hlY2tSZWR1bmRhbnRQaWNDbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICosIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKiwKKyAgICB1MzIsIHUzMik7CisKK3N0YXRpYyB1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLAorICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7CisKK3N0YXRpYyB1MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgICB1MzIgbnVtUmVmRnJhbWVzKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzbGljZSBoZWFkZXIgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAorICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAorICAgIG5hbFVuaXRfdCAqcE5hbFVuaXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisgICAgdTMyIHBpY1NpemVJbk1iczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTbGljZUhlYWRlcik7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKCBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8CisgICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiApOworCisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFNsaWNlSGVhZGVyLCAwLCBzaXplb2Yoc2xpY2VIZWFkZXJfdCkpOworCisgICAgcGljU2l6ZUluTWJzID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlID0gdmFsdWU7CisgICAgaWYgKHZhbHVlID49IHBpY1NpemVJbk1icykKKyAgICB7CisgICAgICAgIEVQUklOVCgiZmlyc3RfbWJfaW5fc2xpY2UiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlID0gdmFsdWU7CisgICAgLyogc2xpY2UgdHlwZSBoYXMgdG8gYmUgZWl0aGVyIEkgb3IgUCBzbGljZS4gUCBzbGljZSBpcyBub3QgYWxsb3dlZCB3aGVuCisgICAgICogY3VycmVudCBOQUwgdW5pdCBpcyBhbiBJRFIgTkFMIHVuaXQgb3IgbnVtX3JlZl9mcmFtZXMgaXMgMCAqLworICAgIGlmICggIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpICYmCisgICAgICAgICAoICFJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSB8fAorICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIHx8CisgICAgICAgICAgICFwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyApICkKKyAgICB7CisgICAgICAgIEVQUklOVCgic2xpY2VfdHlwZSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCA9IHZhbHVlOworICAgIGlmIChwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkICE9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYgdG1wICE9IDApCisgICAgeworICAgICAgICBFUFJJTlQoImZyYW1lX251bSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gPSB0bXA7CisKKyAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+aWRyUGljSWQgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlID4gNjU1MzUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiaWRyX3BpY19pZCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPSB0bXA7CisKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tID0gaXRtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCisgICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KKyAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCisgICAgICAgICAgICAgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+CisgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYi8yKSB8fAorICAgICAgICAgICAgICAgIE1JTigoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IsCisgICAgICAgICAgICAgICAgICAgIChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiArCisgICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSkgIT0gMCApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkgJiYKKyAgICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyApCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gPSBpdG1wOworCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSA9IGl0bXA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQorICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCisgICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgorICAgICAgICAgICAgIE1JTihwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0sCisgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSArCisgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCisgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCA9IHZhbHVlOworICAgICAgICBpZiAodmFsdWUgPiAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgicmVkdW5kYW50X3BpY19jbnQiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcgPSB0bXA7CisKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPiAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIHNldCBudW1SZWZJZHhMMEFjdGl2ZSBmcm9tIHBpYyBwYXJhbSBzZXQgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB2YWx1ZSAobWludXMxKSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgZXhjZWVkcyAxNSBpdCBzaG91bGQKKyAgICAgICAgICAgICAqIGhhdmUgYmVlbiBvdmVycmlkZGVuIGhlcmUgKi8KKyAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID4gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyIpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgdG1wID0gUmVmUGljTGlzdFJlb3JkZXJpbmcocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTbGljZUhlYWRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmcsCisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlLAorICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLCAmcFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAorICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlLCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogZGVjb2RlIHNsaWNlUXBEZWx0YSBhbmQgY2hlY2sgdGhhdCBpbml0aWFsIFFQIGZvciB0aGUgc2xpY2Ugd2lsbCBiZSBvbgorICAgICAqIHRoZSByYW5nZSBbMCwgNTFdICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGEgPSBpdG1wOworICAgIGl0bXAgKz0gKGkzMilwUGljUGFyYW1TZXQtPnBpY0luaXRRcDsKKyAgICBpZiAoIChpdG1wIDwgMCkgfHwgKGl0bXAgPiA1MSkgKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzbGljZV9xcF9kZWx0YSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgaWYgKHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiIpOworICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUFscGhhQzBPZmZzZXQgPSBpdG1wICogMjsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYmV0YV9vZmZzZXRfZGl2MiIpOworICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUJldGFPZmZzZXQgPSBpdG1wICogMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKSAmJgorICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPj0gMykgJiYKKyAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlIDw9IDUpICkKKyAgICB7CisgICAgICAgIC8qIHNldCB0bXAgdG8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCisgICAgICAgICAqIGluIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgdG1wID0gTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyhwaWNTaXplSW5NYnMsCisgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKKyAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA9IHZhbHVlOworCisgICAgICAgIC8qIGNvcnJlc3BvbmRzIHRvIHRtcCA9IENlaWwocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICovCisgICAgICAgIHRtcCA9IChwaWNTaXplSW5NYnMgKyBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIC0gMSkgLworICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPiB0bXApCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQKKyAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpbiB0aGUgc3RyZWFtLiBUaGUgc3RhbmRhcmQgc3RhdGVzIHRoYXQKKyAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpcyByZXByZXNlbnRlZCBieQorICAgICAgICAgICAgICAgIENlaWwoIExvZzIoIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKyAxKSApCisKKyAgICAgICAgICAgIGJpdHMuIERpdmlzaW9uICIvIiBpbiB0aGUgZXF1YXRpb24gaXMgbm9uLXRydW5jYXRpbmcgZGl2aXNpb24uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlUmF0ZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIG5lZWRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLCB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCxudW1CaXRzLG1hc2s7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7CisgICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemVJbk1icyk7CisKKyAgICAvKiBjb21wdXRlIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSArIDEpLCByb3VuZGVkIHVwICovCisgICAgaWYgKHBpY1NpemVJbk1icyAlIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQorICAgICAgICB0bXAgPSAyICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgIGVsc2UKKyAgICAgICAgdG1wID0gMSArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKworICAgIG51bUJpdHMgPSAwOworICAgIG1hc2sgPSB+MFU7CisKKyAgICAvKiBzZXQgbnVtQml0cyB0byBwb3NpdGlvbiBvZiByaWdodC1tb3N0IG5vbi16ZXJvIGJpdCAqLworICAgIHdoaWxlICh0bXAgJiAobWFzazw8KytudW1CaXRzKSkKKyAgICAgICAgOworICAgIG51bUJpdHMtLTsKKworICAgIC8qIGFkZCBvbmUgbW9yZSBiaXQgaWYgdmFsdWUgZ3JlYXRlciB0aGFuIDJebnVtQml0cyAqLworICAgIGlmICh0bXAgJiAoKDE8PG51bUJpdHMpLTEpKQorICAgICAgICBudW1CaXRzKys7CisKKyAgICByZXR1cm4obnVtQml0cyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBSZWZQaWNMaXN0UmVvcmRlcmluZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCisgICAgICAgICAgICB0aGUgc3RyZWFtLiBNYXggbnVtYmVyIG9mIHJlb3JkZXJpbmcgY29tbWFuZHMgaXMgbnVtUmVmSWR4QWN0aXZlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlIGluZGljZXMgdG8gYmUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNsaWNlCisgICAgICAgICAgICBtYXhQaWNOdW0gICAgICAgbWF4RnJhbWVOdW0gZnJvbSB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqcFJlZlBpY0xpc3RSZW9yZGVyaW5nLCB1MzIgbnVtUmVmSWR4QWN0aXZlLAorICAgIHUzMiBtYXhQaWNOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgdTMyIGNvbW1hbmQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVmUGljTGlzdFJlb3JkZXJpbmcpOworICAgIEFTU0VSVChudW1SZWZJZHhBY3RpdmUpOworICAgIEFTU0VSVChtYXhQaWNOdW0pOworCisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCA9IHRtcDsKKworICAgIGlmIChwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQorICAgIHsKKyAgICAgICAgaSA9IDA7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiBudW1SZWZJZHhBY3RpdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSByZW9yZGVyaW5nIGNvbW1hbmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29tbWFuZCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID4gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoInJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgIGlmICgoY29tbWFuZCA9PSAwKSB8fCAoY29tbWFuZCA9PSAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gbWF4UGljTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJhYnNfZGlmZl9waWNfbnVtX21pbnVzMSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtID0gdmFsdWUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0gd2hpbGUgKGNvbW1hbmQgIT0gMyk7CisKKyAgICAgICAgLyogdGhlcmUgc2hhbGwgYmUgYXQgbGVhc3Qgb25lIHJlb3JkZXJpbmcgY29tbWFuZCBpZgorICAgICAgICAgKiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCB3YXMgc2V0ICovCisgICAgICAgIGlmIChpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgicmVmX3BpY19saXN0X3Jlb3JkZXJpbmciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjUmVmUGljTWFya2luZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCisgICAgICAgICAgICB0aGUgc3RyZWFtLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKyAgICAgICAgICAgIG51bVJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZnJvbSB0aGUgYWN0aXZlIFNQUworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgICAgdTMyIG51bVJlZkZyYW1lcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZTsKKyAgICB1MzIgaTsKKyAgICB1MzIgb3BlcmF0aW9uOworICAgIC8qIHZhcmlhYmxlcyBmb3IgZXJyb3IgY2hlY2tpbmcgcHVycG9zZXMsIHN0b3JlIG51bWJlciBvZiBtZW1vcnkKKyAgICAgKiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgY2VydGFpbiB0eXBlICovCisgICAgdTMyIG51bTQgPSAwLCBudW01ID0gMCwgbnVtNiA9IDAsIG51bTF0bzMgPSAwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgfHwKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAorICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX1NFSSApOworCisKKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZyA9IHRtcDsKKyAgICAgICAgaWYgKCFudW1SZWZGcmFtZXMgJiYgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWciKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZyA9IHRtcDsKKyAgICAgICAgaWYgKHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNlZSBleHBsYW5hdGlvbiBvZiB0aGUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyBpbgorICAgICAgICAgICAgICAgICAqIHNsaWNlX2hlYWRlci5oICovCisgICAgICAgICAgICAgICAgaWYgKGkgPiAoMiAqIG51bVJlZkZyYW1lcyArIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID4gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDEpIHx8IChvcGVyYXRpb24gPT0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDMpIHx8IChvcGVyYXRpb24gPT0gNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHNoYWxsIGJlIGluIHJhbmdlIFswLCBudW1SZWZGcmFtZXNdICovCisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IG51bVJlZkZyYW1lcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0gdmFsdWUgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG51bTQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtNSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uICYmIG9wZXJhdGlvbiA8PSAzKQorICAgICAgICAgICAgICAgICAgICBudW0xdG8zKys7CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA2KQorICAgICAgICAgICAgICAgICAgICBudW02Kys7CisKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9IHdoaWxlIChvcGVyYXRpb24gIT0gMCk7CisKKyAgICAgICAgICAgIC8qIGVycm9yIGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAobnVtNCA+IDEgfHwgbnVtNSA+IDEgfHwgbnVtNiA+IDEgfHwgKG51bTF0bzMgJiYgbnVtNSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDaGVja1Bwc0lkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX3BhcmFtZXRlcl9zZXRfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgorICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICAgICAgICAgIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwaWNQYXJhbVNldElkICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcGljUGFyYW1TZXRJZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAqcGljUGFyYW1TZXRJZCA9IHZhbHVlOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tGcmFtZU51bQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGZyYW1lX251bSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90CisgICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCisgICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBtYXhGcmFtZU51bQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBmcmFtZU51bSAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiAqZnJhbWVOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQoZnJhbWVOdW0pOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAqZnJhbWVOdW0gPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0lkclBpY0lkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgaWRyX3BpY19pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90CisgICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCisgICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlciBmcm9tIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGlkclBpY0lkICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICppZHJQaWNJZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChpZHJQaWNJZCk7CisKKyAgICAvKiBuYWxVbml0VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDUgYmVjYXVzZSBvdGhlcndpc2UgaWRyUGljSWQgaXMgbm90CisgICAgICogcHJlc2VudCAqLworICAgIGlmIChuYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBpZHJfcGljX2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCBpZHJQaWNJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19vcmRlcl9jbnRfbHNiIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KKyAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCisgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCisgICAgICAgICAgICBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY09yZGVyQ250THNiICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICpwaWNPcmRlckNudExzYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocGljT3JkZXJDbnRMc2IpOworCisgICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCAqLworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgKnBpY09yZGVyQ250THNiID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgorICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZQorICAgICAgICAgICAgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQorICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKworICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgYW5kIHBpY09yZGVyUHJlc2VudEZsYWcgbXVzdCBiZSBUUlVFCisgICAgICogKi8KKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlcyBkZWx0YV9waWNfb3JkZXJfY250WzBdIGFuZCBkZWx0YV9waWNfb3JkZXJfY250WzFdCisgICAgICAgICAgICBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbQorICAgICAgICAgICAgcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlCisgICAgICAgICAgICB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgICAgICAgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisgICAgICAgICAgICBwaWNPcmRlclByZXNlbnRGbGFnICAgICBmbGFnIGluZGljYXRpbmcgaWYgZGVsdGFfcGljX29yZGVyX2NudFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGUgc3RyZWFtCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnQgICAgICAgIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAorICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnQpOworCisgICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMSBhbmQgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIG11c3QKKyAgICAgKiBiZSBGQUxTRSAqLworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKTsKKyAgICBBU1NFUlQoIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFswXSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCisgICAgaWYgKHBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFsxXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiByZWR1bmRhbnRfcGljX2NudCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCisgICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQorICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZworICAgICAgICAgICAgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICByZWR1bmRhbnRQaWNDbnQgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcmVkdW5kYW50UGljQ250KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIGkzMiBpdmFsdWU7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisgICAgQVNTRVJUKHJlZHVuZGFudFBpY0NudCk7CisKKyAgICAvKiByZWR1bmRhbnRfcGljX2NudF9mbGFnIG11c3QgYmUgVFJVRSAqLworICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID4gMCB8fAorICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKKyAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKKyAgICB7CisgICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWR1bmRhbnRfcGljX2NudCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgcmVkdW5kYW50UGljQ250KTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgorICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzCisgICAgICAgICAgICB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQorICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgdmFsdWUgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKmxpbnQgLWU3MTUgZGlzYWJsZSBsaW50IGluZm8gbmFsVW5pdFR5cGUgbm90IHJlZmVyZW5jZWQgKi8KK3UzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSkKK3sKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgaTMyIGl2YWx1ZTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQobm9PdXRwdXRPZlByaW9yUGljc0ZsYWcpOworCisgICAgLyogbXVzdCBiZSBJRFIgbHNpY2UgKi8KKyAgICBBU1NFUlQobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUik7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgLyogc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAodG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICBpZihwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGktLTsKKworICAgICAgICAvKiBza2lwIHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICAgICAgaWYodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworCisgICAgICAgIGlmKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKKyAgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCisgICAgeworICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KKyAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2tpcCByZWR1bmRhbnRfcGljX2NudCAqLworICAgIGlmKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisgICAgfQorCisgICAgKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIDEpOworICAgIGlmKCpub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworCisgICAgcmV0dXJuIChIQU5UUk9fT0spOworCit9CisvKmxpbnQgK2U3MTUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk4ODk4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAorI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VudW0geworICAgIFBfU0xJQ0UgPSAwLAorICAgIElfU0xJQ0UgPSAyCit9OworCitlbnVtIHtOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUyA9IDB4RkZGRn07CisKKy8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRlciBzbGljZSwgc2xpY2VUeXBlcyAwIGFuZCA1ICovCisjZGVmaW5lIElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IFBfU0xJQ0UpIHx8IFwKKyAgICAoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSArIDUpKQorCisvKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50cmEgc2xpY2UsIHNsaWNlVHlwZXMgMiBhbmQgNyAqLworI2RlZmluZSBJU19JX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFKSB8fCBcCisgICAgKChzbGljZVR5cGUpID09IElfU0xJQ0UgKyA1KSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcmVvcmRlcmluZ09mUGljTnVtc0lkYzsKKyAgICB1MzIgYWJzRGlmZlBpY051bTsKKyAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07Cit9IHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDA7CisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdCBjb21tYW5kW01BWF9OVU1fUkVGX1BJQ1MrMV07Cit9IHJlZlBpY0xpc3RSZW9yZGVyaW5nX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSBEUEIgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uOworICAgIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zOworICAgIHUzMiBsb25nVGVybVBpY051bTsKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeDsKKyAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKK30gbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90OworCisvKiB3b3JzdCBjYXNlIHNjZW5hcmlvOiBhbGwgTUFYX05VTV9SRUZfUElDUyBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGFyZQorICogc2hvcnQgdGVybSBwaWN0dXJlcywgZWFjaCBvbmUgb2YgdGhlbSBpcyBmaXJzdCBtYXJrZWQgYXMgbG9uZyB0ZXJtCisgKiByZWZlcmVuY2UgcGljdHVyZSB3aGljaCBpcyB0aGVuIG1hcmtlZCBhcyB1bnVzZWQgZm9yIHJlZmVyZW5jZS4KKyAqIEFkZGl0aW9uYWxseSwgbWF4IGxvbmctdGVybSBmcmFtZSBpbmRleCBpcyBzZXQgYW5kIGN1cnJlbnQgcGljdHVyZSBpcworICogbWFya2VkIGFzIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZS4gTGFzdCBwb3NpdGlvbiByZXNlcnZlZCBmb3IKKyAqIGVuZCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBjb21tYW5kICovCisjZGVmaW5lIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgKDIqTUFYX05VTV9SRUZfUElDUysyKzEpCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWc7CisgICAgdTMyIGxvbmdUZXJtUmVmZXJlbmNlRmxhZzsKKyAgICB1MzIgYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWc7CisgICAgbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90IG9wZXJhdGlvbltNQVhfTlVNX01NQ19PUEVSQVRJT05TXTsKK30gZGVjUmVmUGljTWFya2luZ190OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2xpY2UgaGVhZGVyIGRhdGEgZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGZpcnN0TWJJblNsaWNlOworICAgIHUzMiBzbGljZVR5cGU7CisgICAgdTMyIHBpY1BhcmFtZXRlclNldElkOworICAgIHUzMiBmcmFtZU51bTsKKyAgICB1MzIgaWRyUGljSWQ7CisgICAgdTMyIHBpY09yZGVyQ250THNiOworICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tOworICAgIGkzMiBkZWx0YVBpY09yZGVyQ250WzJdOworICAgIHUzMiByZWR1bmRhbnRQaWNDbnQ7CisgICAgdTMyIG51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZzsKKyAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7CisgICAgaTMyIHNsaWNlUXBEZWx0YTsKKyAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7CisgICAgaTMyIHNsaWNlQWxwaGFDME9mZnNldDsKKyAgICBpMzIgc2xpY2VCZXRhT2Zmc2V0OworICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGU7CisgICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCByZWZQaWNMaXN0UmVvcmRlcmluZzsKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKK30gc2xpY2VIZWFkZXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKKyAgbmFsVW5pdF90ICpwTmFsVW5pdCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcHBzSWQpOworCit1MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgKmZyYW1lTnVtKTsKKwordTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICppZHJQaWNJZCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcGljT3JkZXJDbnRMc2IpOworCit1MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCisgIHUzMiAqcmVkdW5kYW50UGljQ250KTsKKwordTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzIzNDc1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKQEAgLTAsMCArMSw4ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkSW5pdFN0b3JhZ2UKKyAgICAgICAgICBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAorICAgICAgICAgIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0CisgICAgICAgICAgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzCisgICAgICAgICAgaDI2NGJzZFJlc2V0U3RvcmFnZQorICAgICAgICAgIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZElzRW5kT2ZQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwCisgICAgICAgICAgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5CisgICAgICAgICAgQ2hlY2tQcHMKKyAgICAgICAgICBoMjY0YnNkVmFsaWRQYXJhbVNldHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIENoZWNrUHBzKHBpY1BhcmFtU2V0X3QgKnBwcywgc2VxUGFyYW1TZXRfdCAqc3BzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0U3RvcmFnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBJbml0aWFsaXplIHN0b3JhZ2Ugc3RydWN0dXJlLiBTZXRzIGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlIHRvICcwJworICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgYWN0aXZlIHBhcmFtZXRlciBzZXQgaWRzLCB3aGljaCBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgIHRvIGludmFsaWQgdmFsdWVzLgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgaW5pdGlhbGl6ZWQgZGF0YSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBTdG9yYWdlLCAwLCBzaXplb2Yoc3RvcmFnZV90KSk7CisKKyAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOworICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7CisKKyAgICBwU3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX1RSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgU1BTIGlzCisgICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBjb250ZW50cyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzLCBzZXQKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgdG8gZm9yY2UgcmVhY3RpdmF0aW9uIG9mIHBhcmFtZXRlciBzZXRzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIHBhcmFtIHNldCB0byBiZSBzdG9yZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpOworCisgICAgaWQgPSBwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkOworCisgICAgLyogc2VxIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBub3QgdXNlZCBiZWZvcmUgLT4gYWxsb2NhdGUgbWVtb3J5ICovCisgICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCisgICAgeworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c3BzW2lkXSwgMSwgc2VxUGFyYW1TZXRfdCk7CisgICAgICAgIGlmIChwU3RvcmFnZS0+c3BzW2lkXSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICB9CisgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBzcHMgKi8KKyAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCisgICAgeworICAgICAgICAvKiBpZiBzZXEgcGFyYW1ldGVyIHNldCBjb250ZW50cyBjaGFuZ2VzCisgICAgICAgICAqICAgIC0+IG92ZXJ3cml0ZSBhbmQgcmUtYWN0aXZhdGUgd2hlbiBuZXh0IElEUiBwaWN0dXJlIGRlY29kZWQKKyAgICAgICAgICogICAgaWRzIG9mIGFjdGl2ZSBwYXJhbSBzZXRzIHNldCB0byBpbnZhbGlkIHZhbHVlcyB0byBmb3JjZQorICAgICAgICAgKiAgICByZS1hY3RpdmF0aW9uLiBNZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBzcHMgZnJlZWQKKyAgICAgICAgICogb3RoZXJ3aXNlIGZyZWUgbWVtZXJpZXMgYWxsb2NhdGVkIGZvciBqdXN0IGRlY29kZWQgc3BzIGFuZAorICAgICAgICAgKiBjb250aW51ZSAqLworICAgICAgICBpZiAoaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMocFNlcVBhcmFtU2V0LCBwU3RvcmFnZS0+YWN0aXZlU3BzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgKyAxOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gTlVMTDsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgICAgIEZSRUUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICB9CisgICAgfQorICAgIC8qIG92ZXJ3cml0ZSBzZXEgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCisgICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAqcFN0b3JhZ2UtPnNwc1tpZF0gPSAqcFNlcVBhcmFtU2V0OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTdG9yZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW50byB0aGUgc3RvcmFnZS4gSWYgYWN0aXZlIFBQUyBpcworICAgICAgICAgICAgb3ZlcndyaXR0ZW4gLT4gY2hlY2sgaWYgYWN0aXZlIFNQUyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzIC0+IHNldAorICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7CisKKyAgICBpZCA9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQ7CisKKyAgICAvKiBwaWMgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5wcHNbaWRdLCAxLCBwaWNQYXJhbVNldF90KTsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbaWRdID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIH0KKyAgICAvKiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBlcXVhbCB0byBpZCBvZiBhY3RpdmUgcHBzICovCisgICAgZWxzZSBpZiAoaWQgPT0gcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgd2hldGhlciBzZXEgcGFyYW0gc2V0IGNoYW5nZXMsIGZvcmNlIHJlLWFjdGl2YXRpb24gb2YKKyAgICAgICAgICogcGFyYW0gc2V0IGlmIGl0IGRvZXMuIFNldCBhY3RpdmVTcHNJZCB0byBpbnZhbGlkIHZhbHVlIHRvCisgICAgICAgICAqIGFjY29tcGxpc2ggdGhpcyAqLworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIGZyZWUgbWVtb3JpZXMgYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnJ1bkxlbmd0aCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnRvcExlZnQpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ib3R0b21SaWdodCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnNsaWNlR3JvdXBJZCk7CisgICAgfQorICAgIC8qIG92ZXJ3cml0ZSBwaWMgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCisgICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKKyAgICB9CisKKyAgICAqcFN0b3JhZ2UtPnBwc1tpZF0gPSAqcFBpY1BhcmFtU2V0OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQWN0aXZhdGUgY2VydGFpbiBTUFMvUFBTIGNvbWJpbmF0aW9uLiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGJlCisgICAgICAgICAgICBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBpY3R1cmUuIFBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgY2FuIGJlIGNoYW5nZWQgYXMgd2FudGVkLCBidXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBtYXkgb25seSBiZQorICAgICAgICAgICAgY2hhbmdlZCB3aGVuIHRoZSBzdGFydGluZyBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlLgorCisgICAgICAgICAgICBXaGVuIG5ldyBTUFMgaXMgYWN0aXZhdGVkIHRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgorICAgICAgICAgICAgbWFjcm9ibG9jayBzdG9yYWdlcyBhbmQgc2xpY2UgZ3JvdXAgbWFwIGFuZCAocmUtKWluaXRpYWxpemVzIHRoZQorICAgICAgICAgICAgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFjdGl2YXRpb24gdGhlIG9sZAorICAgICAgICAgICAgYWxsb2NhdGlvbnMgYXJlIGZyZWVkIGFuZCBGcmVlRHBiIGNhbGxlZCBiZWZvcmUgbmV3IGFsbG9jYXRpb25zLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBwc0lkICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBQUFMgdG8gYmUgYWN0aXZhdGVkLCBTUFMgaWQgb2J0YWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBQUFMKKyAgICAgICAgICAgIGlzSWRyICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBub24tZXhpc3Rpbmcgb3IgaW52YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5aW5nIHRvIGNoYW5nZSBTUFMgd2l0aCBub24tSURSIHBpY3R1cmUKKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICAgICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICB1MzIgZmxhZzsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocHBzSWQgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKTsKKworICAgIC8qIGNoZWNrIHRoYXQgcHBzIGFuZCBjb3JyZXNwb25kaW5nIHNwcyBleGlzdCAqLworICAgIGlmICggKHBTdG9yYWdlLT5wcHNbcHBzSWRdID09IE5VTEwpIHx8CisgICAgICAgICAocFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdID09IE5VTEwpICkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IHBwcyBwYXJhbWV0ZXJzIGRvIG5vdCB2aW9sYXRlIHBpY3R1cmUgc2l6ZSBjb25zdHJhaW50cyAqLworICAgIHRtcCA9IENoZWNrUHBzKHBTdG9yYWdlLT5wcHNbcHBzSWRdLAorICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkXSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MSAqLworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPT0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKKyAgICB7CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOworICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+YWN0aXZlU3BzSWRdOworICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0KKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOworICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MiAqLworICAgIGVsc2UgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICB7CisgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKKworICAgICAgICBGUkVFKHBTdG9yYWdlLT5tYik7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOworCisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5tYiwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgbWJTdG9yYWdlX3QpOworICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgdTMyKTsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5tYiA9PSBOVUxMIHx8IHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworCisgICAgICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZS0+bWIsIDAsCisgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzICogc2l6ZW9mKG1iU3RvcmFnZV90KSk7CisKKyAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMocFN0b3JhZ2UtPm1iLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOworCisgICAgICAgIC8qIGRwYiBvdXRwdXQgcmVvcmRlcmluZyBkaXNhYmxlZCBpZgorICAgICAgICAgKiAxKSBhcHBsaWNhdGlvbiBzZXQgbm9SZW9yZGVyaW5nIGZsYWcKKyAgICAgICAgICogMikgUE9DIHR5cGUgZXF1YWwgdG8gMgorICAgICAgICAgKiAzKSBudW1fcmVvcmRlcl9mcmFtZXMgaW4gdnVpIGVxdWFsIHRvIDAgKi8KKyAgICAgICAgaWYgKCBwU3RvcmFnZS0+bm9SZW9yZGVyaW5nIHx8CisgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljT3JkZXJDbnRUeXBlID09IDIgfHwKKyAgICAgICAgICAgICAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyAmJgorICAgICAgICAgICAgICAhcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcykgKQorICAgICAgICAgICAgZmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFnID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RSZXNldERwYihwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heERwYlNpemUsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5udW1SZWZGcmFtZXMsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhGcmFtZU51bSwKKyAgICAgICAgICAgIGZsYWcpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwcHNJZCAhPSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCisgICAgeworICAgICAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHNoYWxsIG5vdCBjaGFuZ2UgYnV0IGJlZm9yZSBhbiBJRFIgcGljdHVyZSAqLworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJTRVEgUEFSQU0gU0VUIENIQU5HSU5HLi4uXG4iKSk7CisgICAgICAgICAgICBpZiAoaXNJZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKCgiVFJZSU5HIFRPIENIQU5HRSBTUFMgSU4gTk9OLUlEUiBTTElDRVxuIikpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXRTdG9yYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlc2V0IGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgICAgICAgICAgICBwcm9jZXNzaW5nIG9mIG5ldyBpbWFnZSBpcyBzdGFydGVkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPSAwOworICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQorICAgIHsKKyAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPSAwOworICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA9IDA7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBzdGFydCBvZiBhIHBpY3R1cmUuIFRoaXMKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWNpZGUgaWYgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzIGFuZAorICAgICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQuIEZ1bmN0aW9uCisgICAgICAgICAgICBjb25zaWRlcnMgdGhhdCBuZXcgcGljdHVyZSBpcyBzdGFydGluZyBpZiBubyBzbGljZSBoZWFkZXJzCisgICAgICAgICAgICBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgZm9yIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcKKyAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3Qgc3RhcnRpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIGlmIChwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9PSBIQU5UUk9fRkFMU0UpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc0VuZE9mUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGVuZCBvZiBhIHBpY3R1cmUuIFRoaXMKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hlbiBkZWJsb2NraW5nIGZpbHRlcmluZworICAgICAgICAgICAgYW5kIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzc2VzIHNob3VsZCBiZSBwZXJmb3JtZWQuCisKKyAgICAgICAgICAgIElmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcgcHJpbWFyeSBzbGljZXMgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgdmFsdWUgb2YgbnVtRGVjb2RlZE1icyBpbiB0aGUKKyAgICAgICAgICAgIHN0b3JhZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nCisgICAgICAgICAgICByZWR1bmRhbnQgc2xpY2VzIHRoZSBudW1EZWNvZGVkTWJzIG1heSBub3QgY29udGFpbiB2YWxpZAorICAgICAgICAgICAgaW5mb3JtYXRpb25hIGFuZCBlYWNoIG1hY3JvYmxvY2sgaGFzIHRvIGJlIGNoZWNrZWQgc2VwYXJhdGVseS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIGVuZCBvZiBwaWN0dXJlCisgICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm91cAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgLyogcHJpbWFyeSBwaWN0dXJlICovCisgICAgaWYgKCFwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0ucmVkdW5kYW50UGljQ250KQorICAgIHsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA/IDEgOiAwOworCisgICAgICAgIGlmICh0bXAgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBzbGljZSBncm91cCBtYXAuIEp1c3QgY2FsbCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCB3aXRoCisgICAgICAgICAgICBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLCBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIG5leHQgTkFMIHVuaXQgc3RhcnRzIGEgbmV3IGFjY2VzcyB1bml0LiBGb2xsb3dpbmcKKyAgICAgICAgICAgIGNvbmRpdGlvbnMgc3BlY2lmeSBzdGFydCBvZiBhIG5ldyBhY2Nlc3MgdW5pdDoKKworICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlcyA2LTExLCAxMy0xOCAoZS5nLiBTUFMsIFBQUykKKworICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBjaGVja2VkIG9ubHkgZm9yIHNsaWNlIE5BTCB1bml0cywgdmFsdWVzCisgICAgICAgICAgIGNvbXBhcmVkIHRvIG9uZXMgb2J0YWluZWQgZnJvbSBwcmV2aW91cyBzbGljZToKKworICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlIGRpZmZlcnMgKHNsaWNlIC8gSURSIHNsaWNlKQorICAgICAgICAgICAgICAgIC1mcmFtZV9udW0gZGlmZmVycworICAgICAgICAgICAgICAgIC1uYWxfcmVmX2lkYyBkaWZmZXJzIGFuZCBvbmUgb2YgdGhlIHZhbHVlcyBpcyAwCisgICAgICAgICAgICAgICAgLVBPQyBpbmZvcm1hdGlvbiBkaWZmZXJzCisgICAgICAgICAgICAgICAgLWJvdGggYXJlIElEUiBzbGljZXMgYW5kIGlkcl9waWNfaWQgZGlmZmVycworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudU5leHQgICAgICBwb2ludGVyIHRvIE5BTCB1bml0IHN0cnVjdHVyZQorICAgICAgICAgICAgc3RvcmFnZSAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICB0aGUgcmVzdWx0IGlzIHN0b3JlZCBoZXJlLCBUUlVFIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQgYm91bmRhcnksIEZBTFNFIG90aGVyd2lzZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgZmFpbHVyZSwgaW52YWxpZCBzdHJlYW0gZGF0YQorICAgICAgICAgICAgUEFSQU1fU0VUX0VSUk9SICAgICBpbnZhbGlkIHBhcmFtIHNldCB1c2FnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAorICBzdHJtRGF0YV90ICpzdHJtLAorICBuYWxVbml0X3QgKm51TmV4dCwKKyAgc3RvcmFnZV90ICpzdG9yYWdlLAorICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgcHBzSWQsIGZyYW1lTnVtLCBpZHJQaWNJZCwgcGljT3JkZXJDbnRMc2I7CisgICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b20sIGRlbHRhUGljT3JkZXJDbnRbMl07CisgICAgc2VxUGFyYW1TZXRfdCAqc3BzOworICAgIHBpY1BhcmFtU2V0X3QgKnBwczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN0cm0pOworICAgIEFTU0VSVChudU5leHQpOworICAgIEFTU0VSVChzdG9yYWdlKTsKKyAgICBBU1NFUlQoc3RvcmFnZS0+c3BzKTsKKyAgICBBU1NFUlQoc3RvcmFnZS0+cHBzKTsKKworICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBvdXRwdXQgdG8gRkFMU0UgKi8KKyAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKKworICAgIGlmICggKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDUpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDwgMTIpICkgfHwKKyAgICAgICAgICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiAxMikgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPD0gMTgpICkgKQorICAgIHsKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UgaWYgKCBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRSAmJgorICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICBpZiAoc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnKQorICAgIHsKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIC8qIGdldCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtLCAmcHBzSWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHN0b3JlIHNwcyBhbmQgcHBzIGluIHNlcGFyYXRlIHBvaW50ZXJzIGp1c3QgdG8gbWFrZSBuYW1lcyBzaG9ydGVyICovCisgICAgcHBzID0gc3RvcmFnZS0+cHBzW3Bwc0lkXTsKKyAgICBpZiAoIHBwcyA9PSBOVUxMIHx8IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMICB8fAorICAgICAgICAgKHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICE9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgJiYKKyAgICAgICAgICBwcHMtPnNlcVBhcmFtZXRlclNldElkICE9IHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICYmCisgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSApCisgICAgICAgIHJldHVybihQQVJBTV9TRVRfRVJST1IpOworICAgIHNwcyA9IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXTsKKworICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjICE9IG51TmV4dC0+bmFsUmVmSWRjICYmCisgICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyA9PSAwIHx8IG51TmV4dC0+bmFsUmVmSWRjID09IDApKQorICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworCisgICAgaWYgKChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgfHwKKyAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikpCisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisKKyAgICB0bXAgPSBoMjY0YnNkQ2hlY2tGcmFtZU51bShzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCAmZnJhbWVOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gIT0gZnJhbWVOdW0pCisgICAgeworICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSA9IGZyYW1lTnVtOworICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgIH0KKworICAgIGlmIChudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tJZHJQaWNJZChzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCBudU5leHQtPm5hbFVuaXRUeXBlLAorICAgICAgICAgICZpZHJQaWNJZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgorICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkICE9IGlkclBpY0lkKQorICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKworICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCA9IGlkclBpY0lkOworICAgIH0KKworICAgIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2Ioc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAorICAgICAgICAgICZwaWNPcmRlckNudExzYik7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiAhPSBwaWNPcmRlckNudExzYikKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKHN0cm0sIHNwcywKKyAgICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlLCAmZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gIT0KKyAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gPQorICAgICAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tOworICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMSAmJiAhc3BzLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKKyAgICAgICAgICBwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcsIGRlbHRhUGljT3JkZXJDbnQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdICE9IGRlbHRhUGljT3JkZXJDbnRbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gPSBkZWx0YVBpY09yZGVyQ250WzBdOworICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSAhPSBkZWx0YVBpY09yZGVyQ250WzFdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gPSBkZWx0YVBpY09yZGVyQ250WzFdOworICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgKnN0b3JhZ2UtPmF1Yi0+bnVQcmV2ID0gKm51TmV4dDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogQ2hlY2tQcHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgcGljdHVyZSBwYXJhbWV0ZXIgc2V0LiBDb250ZW50cyBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHNldCBpbmZvcm1hdGlvbiB0aGF0IGRlcGVuZHMgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgaXMgY2hlY2tlZAorICAgICAgICAgICAgYWdhaW5zdCB0aGUgZGltZW5zaW9ucyBpbiB0aGUgc3BzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBwcyAgICAgcG9pbnRlciB0byBwaWN0dXJlIHBhcmFtdGVyIHNldAorICAgICAgICAgICAgc3BzICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBldmVyeXRoaW5nIG9rCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGRhdGEgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpCit7CisKKyAgICB1MzIgaTsKKyAgICB1MzIgcGljU2l6ZTsKKworICAgIHBpY1NpemUgPSBzcHMtPnBpY1dpZHRoSW5NYnMgKiBzcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgLyogY2hlY2sgc2xpY2UgZ3JvdXAgcGFyYW1zICovCisgICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPiAxKQorICAgIHsKKyAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHBwcy0+cnVuTGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBwcy0+cnVuTGVuZ3RoW2ldID4gcGljU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHBwcy0+dG9wTGVmdCk7CisgICAgICAgICAgICBBU1NFUlQocHBzLT5ib3R0b21SaWdodCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3Vwcy0xOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBwcy0+dG9wTGVmdFtpXSA+IHBwcy0+Ym90dG9tUmlnaHRbaV0gfHwKKyAgICAgICAgICAgICAgICAgICAgcHBzLT5ib3R0b21SaWdodFtpXSA+PSBwaWNTaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChwcHMtPnRvcExlZnRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpID4KKyAgICAgICAgICAgICAgICAgICAgIChwcHMtPmJvdHRvbVJpZ2h0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPiBwaWNTaXplKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYgJiYKKyAgICAgICAgICAgICAgICAgcHBzLT5waWNTaXplSW5NYXBVbml0cyA8IHBpY1NpemUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFZhbGlkUGFyYW1TZXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGV4aXN0cyBpbiB0aGUgc3RvcmFnZS4KKyAgICAgICAgICAgIEZ1bmN0aW9uIHRyaWVzIGVhY2ggUFBTIGluIHRoZSBidWZmZXIgYW5kIGNoZWNrcyBpZiBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICBTUFMgZXhpc3RzIGFuZCBjYWxscyBDaGVja1BwcyB0byBkZXRlcm1pbmUgaWYgdGhlIFBQUyBjb25mb3JtcworICAgICAgICAgICAgdG8gaW1hZ2UgZGltZW5zaW9ucyBvZiB0aGUgU1BTLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgSEFOVFJPX09LICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisgICAgICAgICAgICBIQU5UUk9fTk9LICBubyB2YWxpZCBjb21iaW5hdGlvbnMgZm91bmQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwU3RvcmFnZS0+cHBzW2ldICYmCisgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0gJiYKKyAgICAgICAgICAgICBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW2ldLAorICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdKSA9PQorICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19OT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhM2IyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NUT1JBR0VfSAorI2RlZmluZSBIMjY0U1dERUNfU1RPUkFHRV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfb3JkZXJfY250LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc2xpY2VJZDsKKyAgICB1MzIgbnVtRGVjb2RlZE1iczsKKyAgICB1MzIgbGFzdE1iQWRkcjsKK30gc2xpY2VTdG9yYWdlX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBwYXJhbWV0ZXJzIG5lZWRlZCBmb3IgYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbmFsVW5pdF90IG51UHJldlsxXTsKKyAgICB1MzIgcHJldkZyYW1lTnVtOworICAgIHUzMiBwcmV2SWRyUGljSWQ7CisgICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKKyAgICBpMzIgcHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b207CisgICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250WzJdOworICAgIHUzMiBmaXJzdENhbGxGbGFnOworfSBhdWJDaGVja190OworCisvKiBzdG9yYWdlIGRhdGEgc3RydWN0dXJlLCBob2xkcyBhbGwgZGF0YSBvZiBhIGRlY29kZXIgaW5zdGFuY2UgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogYWN0aXZlIHBhcmFtZXQgc2V0IGlkcyBhbmQgcG9pbnRlcnMgKi8KKyAgICB1MzIgb2xkU3BzSWQ7CisgICAgdTMyIGFjdGl2ZVBwc0lkOworICAgIHUzMiBhY3RpdmVTcHNJZDsKKyAgICBwaWNQYXJhbVNldF90ICphY3RpdmVQcHM7CisgICAgc2VxUGFyYW1TZXRfdCAqYWN0aXZlU3BzOworICAgIHNlcVBhcmFtU2V0X3QgKnNwc1tNQVhfTlVNX1NFUV9QQVJBTV9TRVRTXTsKKyAgICBwaWNQYXJhbVNldF90ICpwcHNbTUFYX05VTV9QSUNfUEFSQU1fU0VUU107CisKKyAgICAvKiBjdXJyZW50IHNsaWNlIGdyb3VwIG1hcCwgcmVjb21wdXRlZCBmb3IgZWFjaCBzbGljZSAqLworICAgIHUzMiAqc2xpY2VHcm91cE1hcDsKKworICAgIHUzMiBwaWNTaXplSW5NYnM7CisKKyAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IGFmdGVyIGFsbCBtYWNyb2Jsb2NrcyBvZiBhIHBpY3R1cmUgc3VjY2Vzc2Z1bGx5CisgICAgICogZGVjb2RlZCAtPiByZWR1bmRhbnQgc2xpY2VzIG5vdCBkZWNvZGVkICovCisgICAgdTMyIHNraXBSZWR1bmRhbnRTbGljZXM7CisgICAgdTMyIHBpY1N0YXJ0ZWQ7CisKKyAgICAvKiBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnQgYWNjZXNzIHVuaXQgY29udGFpbnMgYW55IHZhbGlkIHNsaWNlcyAqLworICAgIHUzMiB2YWxpZFNsaWNlSW5BY2Nlc3NVbml0OworCisgICAgLyogc3RvcmUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBoYW5kbGluZyBvZiBzbGljZSBkZWNvZGluZyAqLworICAgIHNsaWNlU3RvcmFnZV90IHNsaWNlWzFdOworCisgICAgLyogbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudCBpbWFnZSAqLworICAgIHUzMiBudW1Db25jZWFsZWRNYnM7CisKKyAgICAvKiBwaWNJZCBnaXZlbiBieSBhcHBsaWNhdGlvbiAqLworICAgIHUzMiBjdXJyZW50UGljSWQ7CisKKyAgICAvKiBtYWNyb2Jsb2NrIHNwZWNpZmljIHN0b3JhZ2VzLCBzaXplIGRldGVybWluZWQgYnkgaW1hZ2UgZGltZW5zaW9ucyAqLworICAgIG1iU3RvcmFnZV90ICptYjsKKworICAgIC8qIGZsYWcgdG8gc3RvcmUgbm9PdXRwdXRSZW9yZGVyaW5nIGZsYWcgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiAqLworICAgIHUzMiBub1Jlb3JkZXJpbmc7CisKKyAgICAvKiBEUEIgKi8KKyAgICBkcGJTdG9yYWdlX3QgZHBiWzFdOworCisgICAgLyogc3RydWN0dXJlIHRvIHN0b3JlIHBpY3R1cmUgb3JkZXIgY291bnQgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworICAgIHBvY1N0b3JhZ2VfdCBwb2NbMV07CisKKyAgICAvKiBhY2Nlc3MgdW5pdCBib3VuZGFyeSBjaGVja2luZyByZWxhdGVkIGRhdGEgKi8KKyAgICBhdWJDaGVja190IGF1YlsxXTsKKworICAgIC8qIGN1cnJlbnQgcHJvY2Vzc2VkIGltYWdlICovCisgICAgaW1hZ2VfdCBjdXJySW1hZ2VbMV07CisKKyAgICAvKiBsYXN0IHZhbGlkIE5BTCB1bml0IGhlYWRlciBpcyBzdG9yZWQgaGVyZSAqLworICAgIG5hbFVuaXRfdCBwcmV2TmFsVW5pdFsxXTsKKworICAgIC8qIHNsaWNlIGhlYWRlciwgc2Vjb25kIHN0cnVjdHVyZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IHN0b3JhZ2Ugd2hpbGUKKyAgICAgKiBkZWNvZGluZyBzbGljZSBoZWFkZXIsIGZpcnN0IG9uZSBzdG9yZXMgbGFzdCBzdWNjZXNzZnVsbHkgZGVjb2RlZAorICAgICAqIHNsaWNlIGhlYWRlciAqLworICAgIHNsaWNlSGVhZGVyX3Qgc2xpY2VIZWFkZXJbMl07CisKKyAgICAvKiBmaWVsZHMgdG8gc3RvcmUgb2xkIHN0cmVhbSBidWZmZXIgcG9pbnRlcnMsIG5lZWRlZCB3aGVuIG9ubHkgcGFydCBvZgorICAgICAqIGEgc3RyZWFtIGJ1ZmZlciBpcyBwcm9jZXNzZWQgYnkgaDI2NGJzZERlY29kZSBmdW5jdGlvbiAqLworICAgIHUzMiBwcmV2QnVmTm90RmluaXNoZWQ7CisgICAgdTggKnByZXZCdWZQb2ludGVyOworICAgIHUzMiBwcmV2Qnl0ZXNDb25zdW1lZDsKKyAgICBzdHJtRGF0YV90IHN0cm1bMV07CisKKyAgICAvKiBtYWNyb2Jsb2NrIGxheWVyIHN0cnVjdHVyZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSB0aGlzIGJ1dCBpdAorICAgICAqIHdvdWxkIGhhdmUgaW5jcmVhc2VkIHRoZSBzdGFjayBzaXplIGV4Y2Vzc2l2ZWx5IGFuZCBuZWVkZWQgdG8gYmUKKyAgICAgKiBhbGxvY2F0ZWQgZnJvbSBoZWFkIC0+IGVhc2llc3QgdG8gcHV0IGl0IGhlcmUgKi8KKyAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllcjsKKworICAgIHUzMiBwZW5kaW5nQWN0aXZhdGlvbjsgLyogQWN0aXZhdGUgcGFyYW1ldGVyIHNldHMgYWZ0ZXIgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJTX1JEWSB0byB0aGUgdXNlciAqLworICAgIHUzMiBpbnRyYUNvbmNlYWxtZW50RmxhZzsgLyogMCBncmF5IHBpY3R1cmUgZm9yIGNvcnJ1cHRlZCBpbnRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBwcmV2aW91cyBmcmFtZSB1c2VkIGlmIGF2YWlsYWJsZSAqLworfSBzdG9yYWdlX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit2b2lkIGgyNjRic2RSZXNldFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7Cit1MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKK3UzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpOwordm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlKTsKKwordTMyIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKKyAgc3RybURhdGFfdCAqc3RybSwKKyAgbmFsVW5pdF90ICpudU5leHQsCisgIHN0b3JhZ2VfdCAqc3RvcmFnZSwKKyAgdTMyICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKKwordTMyIGgyNjRic2RWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU1RPUkFHRV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGQxMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEdldEJpdHMKKyAgICAgICAgICBoMjY0YnNkU2hvd0JpdHMzMgorICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMKKyAgICAgICAgICBoMjY0YnNkSXNCeXRlQWxpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0Qml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWFkIGFuZCByZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG51bUJpdHMgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKworICAgICAgICBPdXRwdXQ6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQorICAgICAgICAgICAgRU5EX09GX1NUUkVBTSBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEdldEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKK3sKKworICAgIHUzMiBvdXQ7CisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQobnVtQml0cyA8IDMyKTsKKworICAgIG91dCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSkgPj4gKDMyIC0gbnVtQml0cyk7CisKKyAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIG51bUJpdHMpID09IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIHJldHVybihvdXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4oRU5EX09GX1NUUkVBTSk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFNob3dCaXRzMzIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVhZCAzMiBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuIEJ1ZmZlciBpcyBsZWZ0IGFzIGl0IGlzLCBpLmUuCisgICAgICAgICAgICBubyBiaXRzIGFyZSByZW1vdmVkLiBGaXJzdCBiaXQgcmVhZCBmcm9tIHRoZSBzdHJlYW0gaXMgdGhlIE1TQiBvZgorICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZS4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCBiaXRzIGluIHRoZSBidWZmZXIgLT4KKyAgICAgICAgICAgIGJpdHMgYmV5b25nIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhcmUgc2V0IHRvICcwJyBpbiB0aGUgcmV0dXJuCisgICAgICAgICAgICB2YWx1ZS4KKworICAgICAgICBJbnB1dDoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBiaXRzIHJlYWQgZnJvbSBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RTaG93Qml0czMyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworICAgIGkzMiBiaXRzLCBzaGlmdDsKKyAgICB1MzIgb3V0OworICAgIHU4ICpwU3RybTsKKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09CisgICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKKworICAgIHBTdHJtID0gcFN0cm1EYXRhLT5wU3RybUN1cnJQb3M7CisKKyAgICAvKiBudW1iZXIgb2YgYml0cyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICBiaXRzID0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSo4IC0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHM7CisKKyAgICAvKiBhdCBsZWFzdCAzMi1iaXRzIGluIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoYml0cyA+PSAzMikKKyAgICB7CisgICAgICAgIHUzMiBiaXRQb3NJbldvcmQgPSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKyAgICAgICAgb3V0ID0gKCh1MzIpcFN0cm1bMF0gPDwgMjQpIHwgKCh1MzIpcFN0cm1bMV0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgKCh1MzIpcFN0cm1bMl0gPDwgIDgpIHwgKCh1MzIpcFN0cm1bM10pOworCisgICAgICAgIGlmIChiaXRQb3NJbldvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiBieXRlID0gKHUzMilwU3RybVs0XTsKKyAgICAgICAgICAgIHUzMiB0bXAgPSAoOC1iaXRQb3NJbldvcmQpOworICAgICAgICAgICAgb3V0IDw8PSBiaXRQb3NJbldvcmQ7CisgICAgICAgICAgICBvdXQgfD0gYnl0ZT4+dG1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiAob3V0KTsKKyAgICB9CisgICAgLyogYXQgbGVhc3Qgb25lIGJpdCBpbiB0aGUgYnVmZmVyICovCisgICAgZWxzZSBpZiAoYml0cyA+IDApCisgICAgeworICAgICAgICBzaGlmdCA9IChpMzIpKDI0ICsgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOworICAgICAgICBvdXQgPSAodTMyKSgqcFN0cm0rKykgPDwgc2hpZnQ7CisgICAgICAgIGJpdHMgLT0gKGkzMikoOCAtIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKTsKKyAgICAgICAgd2hpbGUgKGJpdHMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzaGlmdCAtPSA4OworICAgICAgICAgICAgb3V0IHw9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKKyAgICAgICAgICAgIGJpdHMgLT0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG91dCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVtb3ZlIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudW1CaXRzICAgICAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVtb3ZlCisKKyAgICAgICAgT3V0cHV0OgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgRU5EX09GX1NUUkVBTSAgIG5vdCBlbm91Z2ggYml0cyBsZWZ0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKK3sKKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0KTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOworICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PSAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3KSk7CisKKyAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKz0gbnVtQml0czsKKyAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NzsKKyAgICBpZiAoIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKSA8PSAoOCpwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSkgKQorICAgIHsKKyAgICAgICAgcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0ICsKKyAgICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPj4gMyk7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc0J5dGVBbGlnbmVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGlzIGJ5dGUgYWxpZ25lZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIFRSVUUgICAgICAgIHN0cmVhbSBpcyBieXRlIGFsaWduZWQKKyAgICAgICAgICAgIEZBTFNFICAgICAgIHN0cmVhbSBpcyBub3QgYnl0ZSBhbGlnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBpZiAoIXBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ0MDRiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TVFJFQU1fSAorI2RlZmluZSBIMjY0U1dERUNfU1RSRUFNX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTggICpwU3RybUJ1ZmZTdGFydDsgICAgLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJlYW0gYnVmZmVyICovCisgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogY3VycmVudCByZWFkIGFkZHJlc3MgaW4gc3RyZWFtIGJ1ZmZlciAqLworICAgIHUzMiAgYml0UG9zSW5Xb3JkOyAgICAgIC8qIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gYnVmZmVyIGJ5dGUgKi8KKyAgICB1MzIgIHN0cm1CdWZmU2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cmVhbSBidWZmZXIgKGJ5dGVzKSAqLworICAgIHUzMiAgc3RybUJ1ZmZSZWFkQml0czsgIC8qIG51bWJlciBvZiBiaXRzIHJlYWQgZnJvbSBzdHJlYW0gYnVmZmVyICovCit9IHN0cm1EYXRhX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOworCit1MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKTsKKwordTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7CisKK3UzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICopOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVFJFQU1fSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGViNmRkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RQcm9jZXNzQmxvY2sKKyAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0x1bWFEYworICAgICAgICAgIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKKyAqLworLypsaW50IC1lNzAxIC1lNzAyICovCisKKy8qIExldmVsU2NhbGUgZnVuY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBpMzIgbGV2ZWxTY2FsZVs2XVszXSA9IHsKKyAgICB7MTAsMTMsMTZ9LCB7MTEsMTQsMTh9LCB7MTMsMTYsMjB9LCB7MTQsMTgsMjN9LCB7MTYsMjAsMjV9LCB7MTgsMjMsMjl9fTsKKworLyogcXAgJSA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KK3N0YXRpYyBjb25zdCB1OCBxcE1vZDZbNTJdID0gezAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LAorICAgIDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDMsNCw1LDAsMSwyLDN9OworCisvKiBxcCAvIDYgYXMgYSBmdW5jdGlvbiBvZiBxcCAqLworc3RhdGljIGNvbnN0IHU4IHFwRGl2Nls1Ml0gPSB7MCwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMiwyLDIsMiwyLDIsMywzLDMsMywzLDMsCisgICAgNCw0LDQsNCw0LDQsNSw1LDUsNSw1LDUsNiw2LDYsNiw2LDYsNyw3LDcsNyw3LDcsOCw4LDgsOH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgemlnLXphZyBzY2FuLCBpbnZlcnNlIHNjYWxpbmcgYW5kCisgICAgICAgICAgICBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgYSBsdW1hIG9yIGEgY2hyb21hIHJlc2lkdWFsIGJsb2NrCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgICAgICAgICAgICBza2lwICAgICAgICAgICAgc2tpcCBwcm9jZXNzaW5nIG9mIGRhdGFbMF0sIHNldCB0byBub24temVybyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRjIGNvZWZmIGhhbmxlZCBzZXBhcmF0ZWx5CisgICAgICAgICAgICBjb2VmZk1hcCAgICAgICAgMTYgbHNiJ3MgaW5kaWNhdGUgd2hpY2ggY29lZmZzIGFyZSBub24temVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAobHNiKSBmb3IgY29lZmYgMCwgYml0IDEgZm9yIGNvZWZmIDEgZXRjLgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBwcm9jZXNzZWQgZGF0YSBub3QgaW4gdmFsaWQgcmFuZ2UgWy01MTIsIDUxMV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIGkzMiBkMSwgZDIsIGQzOworICAgIHUzMiByb3csY29sOworICAgIHUzMiBxcERpdjsKKyAgICBpMzIgKnB0cjsKKworLyogQ29kZSAqLworCisgICAgcXBEaXYgPSBxcERpdjZbcXBdOworICAgIHRtcDEgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzBdIDw8IHFwRGl2OworICAgIHRtcDIgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzFdIDw8IHFwRGl2OworICAgIHRtcDMgPSBsZXZlbFNjYWxlW3FwTW9kNltxcF1dWzJdIDw8IHFwRGl2OworCisgICAgaWYgKCFza2lwKQorICAgICAgICBkYXRhWzBdID0gKGRhdGFbMF0gKiB0bXAxKTsKKworICAgIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgcm93cyAxLCAyIG9yIDMgY29udGFpbiBub24temVybyBjb2VmZnMsIG1hc2sgdGFrZXMKKyAgICAgKiB0aGUgc2Nhbm5pbmcgb3JkZXIgaW50byBhY2NvdW50ICovCisgICAgaWYgKGNvZWZmTWFwICYgMHhGRjlDKQorICAgIHsKKyAgICAgICAgLyogZG8gdGhlIHppZy16YWcgc2NhbiBhbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgZDEgPSBkYXRhWzFdOworICAgICAgICBkMiA9IGRhdGFbMTRdOworICAgICAgICBkMyA9IGRhdGFbMTVdOworICAgICAgICBkYXRhWzFdID0gKGQxICogdG1wMik7CisgICAgICAgIGRhdGFbMTRdID0gKGQyICogdG1wMik7CisgICAgICAgIGRhdGFbMTVdID0gKGQzICogdG1wMyk7CisKKyAgICAgICAgZDEgPSBkYXRhWzJdOworICAgICAgICBkMiA9IGRhdGFbNV07CisgICAgICAgIGQzID0gZGF0YVs0XTsKKyAgICAgICAgZGF0YVs0XSA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzJdICA9IChkMiAqIHRtcDEpOworICAgICAgICBkYXRhWzVdID0gKGQzICogdG1wMyk7CisKKyAgICAgICAgZDEgPSBkYXRhWzhdOworICAgICAgICBkMiA9IGRhdGFbM107CisgICAgICAgIGQzID0gZGF0YVs2XTsKKyAgICAgICAgdG1wMCA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzhdID0gKGQyICogdG1wMSk7CisgICAgICAgIGRhdGFbM10gID0gKGQzICogdG1wMik7CisgICAgICAgIGQxID0gZGF0YVs3XTsKKyAgICAgICAgZDIgPSBkYXRhWzEyXTsKKyAgICAgICAgZDMgPSBkYXRhWzldOworICAgICAgICBkYXRhWzZdICA9IChkMSAqIHRtcDIpOworICAgICAgICBkYXRhWzddICA9IChkMiAqIHRtcDMpOworICAgICAgICBkYXRhWzEyXSA9IChkMyAqIHRtcDIpOworICAgICAgICBkYXRhWzldICA9IHRtcDA7CisKKyAgICAgICAgZDEgPSBkYXRhWzEwXTsKKyAgICAgICAgZDIgPSBkYXRhWzExXTsKKyAgICAgICAgZDMgPSBkYXRhWzEzXTsKKyAgICAgICAgZGF0YVsxM10gPSAoZDEgKiB0bXAzKTsKKyAgICAgICAgZGF0YVsxMF0gPSAoZDIgKiB0bXAxKTsKKyAgICAgICAgZGF0YVsxMV0gPSAoZDMgKiB0bXAyKTsKKworICAgICAgICAvKiBob3Jpem9udGFsIHRyYW5zZm9ybSAqLworICAgICAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IHB0clswXSArIHB0clsyXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07CisgICAgICAgICAgICB0bXAyID0gKHB0clsxXSA+PiAxKSAtIHB0clszXTsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJbMV0gKyAocHRyWzNdID4+IDEpOworICAgICAgICAgICAgcHRyWzBdID0gdG1wMCArIHRtcDM7CisgICAgICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOworICAgICAgICAgICAgcHRyWzNdID0gdG1wMCAtIHRtcDM7CisgICAgICAgIH0KKworICAgICAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLworICAgICAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4XTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoZGF0YVs0XSA+PiAxKSAtIGRhdGFbMTJdOworICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyAoZGF0YVsxMl0gPj4gMSk7CisgICAgICAgICAgICBkYXRhWzAgXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVs4IF0gPSAodG1wMSAtIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzEyXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgZWFjaCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLworICAgICAgICAgICAgaWYgKCgodTMyKShkYXRhWzBdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbNF0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVs4XSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzEyXSArIDUxMikgPiAxMDIzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogcm93cyAxLCAyIGFuZCAzIGFyZSB6ZXJvICovCisgICAgeworICAgICAgICAvKiBvbmx5IGRjLWNvZWZmIGlzIG5vbi16ZXJvLCBpLmUuIGNvZWZmcyBhdCBvcmlnaW5hbCBwb3NpdGlvbnMKKyAgICAgICAgICogMSwgNSBhbmQgNiBhcmUgemVybyAqLworICAgICAgICBpZiAoKGNvZWZmTWFwICYgMHg2MikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IChkYXRhWzBdICsgMzIpID4+IDY7CisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCisgICAgICAgICAgICBpZiAoKHUzMikodG1wMCArIDUxMikgPiAxMDIzKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzFdICA9IGRhdGFbMl0gID0gZGF0YVszXSAgPSBkYXRhWzRdICA9IGRhdGFbNV0gID0KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdICA9IGRhdGFbN10gID0gZGF0YVs4XSAgPSBkYXRhWzldICA9IGRhdGFbMTBdID0KKyAgICAgICAgICAgICAgICAgICAgICBkYXRhWzExXSA9IGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0KKyAgICAgICAgICAgICAgICAgICAgICB0bXAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogYXQgbGVhc3Qgb25lIG9mIHRoZSBjb2VmZnMgMSwgNSBvciA2IGlzIG5vbi16ZXJvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAoZGF0YVsxXSAqIHRtcDIpOworICAgICAgICAgICAgZGF0YVsyXSA9IChkYXRhWzVdICogdG1wMSk7CisgICAgICAgICAgICBkYXRhWzNdID0gKGRhdGFbNl0gKiB0bXAyKTsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVsyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoZGF0YVsxXSA+PiAxKSAtIGRhdGFbM107CisgICAgICAgICAgICB0bXAzID0gZGF0YVsxXSArIChkYXRhWzNdID4+IDEpOworICAgICAgICAgICAgZGF0YVswXSA9ICh0bXAwICsgdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAodG1wMSArIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzJdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVszXSA9ICh0bXAwIC0gdG1wMyArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSBkYXRhWzBdOworICAgICAgICAgICAgZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IGRhdGFbMV07CisgICAgICAgICAgICBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IGRhdGFbMl07CisgICAgICAgICAgICBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IGRhdGFbM107CisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KKyAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzFdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMl0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVszXSArIDUxMikgPiAxMDIzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0x1bWFEYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kCisgICAgICAgICAgICBpbnZlcnNlIHNjYWxpbmcgZm9yIGEgbHVtYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdTMyIHJvdyxjb2w7CisgICAgdTMyIHFwTW9kLCBxcERpdjsKKyAgICBpMzIgbGV2U2NhbGU7CisgICAgaTMyICpwdHI7CisKKy8qIENvZGUgKi8KKworICAgIHFwTW9kID0gcXBNb2Q2W3FwXTsKKyAgICBxcERpdiA9IHFwRGl2NltxcF07CisKKyAgICAvKiB6aWctemFnIHNjYW4gKi8KKyAgICB0bXAwID0gZGF0YVsyXTsKKyAgICBkYXRhWzJdICA9IGRhdGFbNV07CisgICAgZGF0YVs1XSA9IGRhdGFbNF07CisgICAgZGF0YVs0XSA9IHRtcDA7CisKKyAgICB0bXAwID0gZGF0YVs4XTsKKyAgICBkYXRhWzhdID0gZGF0YVszXTsKKyAgICBkYXRhWzNdICA9IGRhdGFbNl07CisgICAgZGF0YVs2XSAgPSBkYXRhWzddOworICAgIGRhdGFbN10gID0gZGF0YVsxMl07CisgICAgZGF0YVsxMl0gPSBkYXRhWzldOworICAgIGRhdGFbOV0gID0gdG1wMDsKKworICAgIHRtcDAgPSBkYXRhWzEwXTsKKyAgICBkYXRhWzEwXSA9IGRhdGFbMTFdOworICAgIGRhdGFbMTFdID0gZGF0YVsxM107CisgICAgZGF0YVsxM10gPSB0bXAwOworCisgICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KKyAgICBmb3IgKHJvdyA9IDQsIHB0ciA9IGRhdGE7IHJvdy0tOyBwdHIgKz0gNCkKKyAgICB7CisgICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07CisgICAgICAgIHRtcDEgPSBwdHJbMF0gLSBwdHJbMl07CisgICAgICAgIHRtcDIgPSBwdHJbMV0gLSBwdHJbM107CisgICAgICAgIHRtcDMgPSBwdHJbMV0gKyBwdHJbM107CisgICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOworICAgICAgICBwdHJbMV0gPSB0bXAxICsgdG1wMjsKKyAgICAgICAgcHRyWzJdID0gdG1wMSAtIHRtcDI7CisgICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOworICAgIH0KKworICAgIC8qbGludCArZTY2MSArZTY2MiovCisgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyAqLworICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2QgXVswXTsKKyAgICBpZiAocXAgPj0gMTIpCisgICAgeworICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTIpOworICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4IF07CisgICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMiA9IGRhdGFbNF0gLSBkYXRhWzEyXTsKKyAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgZGF0YVsxMl07CisgICAgICAgICAgICBkYXRhWzAgXSA9ICgodG1wMCArIHRtcDMpKmxldlNjYWxlKTsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUpOworICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSk7CisgICAgICAgICAgICBkYXRhWzEyXSA9ICgodG1wMCAtIHRtcDMpKmxldlNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpMzIgdG1wOworICAgICAgICB0bXAgPSAoKDEgLSBxcERpdikgPT0gMCkgPyAxIDogMjsKKyAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKKyAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07CisgICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOworICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgICAgIGRhdGFbNCBdID0gKCh0bXAxICsgdG1wMikqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7CisgICAgICAgICAgICBkYXRhWzggXSA9ICgodG1wMSAtIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOworICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzQ2hyb21hRGMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIGludmVyc2Ugc2NhbGluZyBmb3IgYQorICAgICAgICAgICAgY2hyb21hIERDIGNvZWZmaWNpZW50cyBibG9jaworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHUzMiBxcERpdjsKKyAgICBpMzIgbGV2U2NhbGU7CisgICAgdTMyIGxldlNoaWZ0OworCisvKiBDb2RlICovCisKKyAgICBxcERpdiA9IHFwRGl2NltxcF07CisgICAgbGV2U2NhbGUgPSBsZXZlbFNjYWxlWyBxcE1vZDZbcXBdIF1bMF07CisKKyAgICBpZiAocXAgPj0gNikKKyAgICB7CisgICAgICAgIGxldlNjYWxlIDw8PSAocXBEaXYtMSk7CisgICAgICAgIGxldlNoaWZ0ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGV2U2hpZnQgPSAxOworICAgIH0KKworICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVsyXTsKKyAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07CisgICAgdG1wMiA9IGRhdGFbMV0gLSBkYXRhWzNdOworICAgIHRtcDMgPSBkYXRhWzFdICsgZGF0YVszXTsKKyAgICBkYXRhWzBdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVsxXSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbMl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzNdID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgdG1wMCA9IGRhdGFbNF0gKyBkYXRhWzZdOworICAgIHRtcDEgPSBkYXRhWzRdIC0gZGF0YVs2XTsKKyAgICB0bXAyID0gZGF0YVs1XSAtIGRhdGFbN107CisgICAgdG1wMyA9IGRhdGFbNV0gKyBkYXRhWzddOworICAgIGRhdGFbNF0gPSAoKHRtcDAgKyB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzVdID0gKCh0bXAwIC0gdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVs2XSA9ICgodG1wMSArIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbN10gPSAoKHRtcDEgLSB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKworfQorCisvKmxpbnQgK2U3MDEgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGY0MWEyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1RSQU5TRk9STV9ICisjZGVmaW5lIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCk7Cit2b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKK3ZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1RSQU5TRk9STV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzYjJmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisgICAgICAgICAgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKKyAgICAgICAgICBoMjY0YnNkTW9yZVJic3BEYXRhCisgICAgICAgICAgaDI2NGJzZE5leHRNYkFkZHJlc3MKKyAgICAgICAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsb29rLXVwIHRhYmxlIGZvciBleHBlY3RlZCB2YWx1ZXMgb2Ygc3R1ZmZpbmcgYml0cyAqLworc3RhdGljIGNvbnN0IHUzMiBzdHVmZmluZ1RhYmxlWzhdID0gezB4MSwweDIsMHg0LDB4OCwweDEwLDB4MjAsMHg0MCwweDgwfTsKKworLyogbG9vay11cCB0YWJsZSBmb3IgY2hyb21hIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXMgYSBmdW5jdGlvbiBvZiBsdW1hIFFQICovCitjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml0gPSB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwKKyAgICAyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwyOSwzMCwzMSwzMiwzMiwzMywzNCwzNCwzNSwzNSwzNiwzNiwzNywzNywzNywKKyAgICAzOCwzOCwzOCwzOSwzOSwzOSwzOX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvdW50IGxlYWRpbmcgemVyb3MgaW4gYSBjb2RlIHdvcmQuIENvZGUgd29yZCBpcyBhc3N1bWVkIHRvIGJlCisgICAgICAgICAgICByaWdodC1hbGlnbmVkLCBsYXN0IGJpdCBvZiB0aGUgY29kZSB3b3JkIGluIHRoZSBsc2Igb2YgdGhlIHZhbHVlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgY29kZSB3b3JkCisgICAgICAgICAgICBsZW5ndGggIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb2RlIHdvcmQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgY29kZSB3b3JkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfTkVPTgordTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHplcm9zID0gMDsKKyAgICB1MzIgbWFzayA9IDEgPDwgKGxlbmd0aCAtIDEpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobGVuZ3RoIDw9IDMyKTsKKworICAgIHdoaWxlIChtYXNrICYmICEodmFsdWUgJiBtYXNrKSkKKyAgICB7CisgICAgICAgIHplcm9zKys7CisgICAgICAgIG1hc2sgPj49IDE7CisgICAgfQorICAgIHJldHVybih6ZXJvcyk7CisKK30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgUmF3IEJ5dGUgU3RyZWFtIFBheWxvYWQgKFJCU1ApIHRyYWlsaW5nIGJpdHMsIGkuZS4gc3R1ZmZpbmcuCisgICAgICAgICAgICBSZXN0IG9mIHRoZSBjdXJyZW50IGJ5dGUgKHdob2xlIGJ5dGUgaWYgYWxscmVhZHkgYnl0ZSBhbGlnbmVkKQorICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSBidWZmZXIgc2hhbGwgY29udGFpbiBhICcxJyBiaXQgZm9sbG93ZWQgYnkgemVybyBvcgorICAgICAgICAgICAgbW9yZSAnMCcgYml0cy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIFJCU1AgdHJhaWxpbmcgYml0cyBmb3VuZAorICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgb3RoZXJ3aXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHN0dWZmaW5nOworICAgIHUzMiBzdHVmZmluZ0xlbmd0aDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7CisKKyAgICBzdHVmZmluZ0xlbmd0aCA9IDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKKworICAgIHN0dWZmaW5nID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBzdHVmZmluZ0xlbmd0aCk7CisgICAgaWYgKHN0dWZmaW5nID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGlmIChzdHVmZmluZyAhPSBzdHVmZmluZ1RhYmxlW3N0dWZmaW5nTGVuZ3RoIC0gMV0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2RNb3JlUmJzcERhdGEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IFJCU1AuIFRoZSBzdGFuZGFyZAorICAgICAgICAgICAgZGVmaW5lcyB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgdGhlcmUgaXMgbW9yZSBkYXRhIGlmCisgICAgICAgICAgICAgICAgLW1vcmUgdGhhbiA4IGJpdHMgbGVmdCBvcgorICAgICAgICAgICAgICAgIC1sYXN0IGJpdHMgYXJlIG5vdCBSQlNQIHRyYWlsaW5nIGJpdHMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19UUlVFICAgIHRoZXJlIGlzIG1vcmUgZGF0YQorICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgbm8gbW9yZSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYml0czsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA8PSA4ICogcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpOworCisgICAgYml0cyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICogOCAtIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKKworICAgIGlmIChiaXRzID09IDApCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCisgICAgaWYgKCAoYml0cyA+IDgpIHx8CisgICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDEgPDwgKGJpdHMtMSkpKSApCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkTmV4dE1iQWRkcmVzcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlIGdyb3VwLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTbGljZUdyb3VwTWFwICAgICAgc2xpY2UgZ3JvdXAgZm9yIGVhY2ggbWFjcm9ibG9jaworICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICBzaXplIG9mIHRoZSBwaWN0dXJlCisgICAgICAgICAgICBjdXJyTWJBZGRyICAgICAgICAgIHdoZXJlIHRvIHN0YXJ0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrCisgICAgICAgICAgICAwICAgaWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBzYW1lIHNsaWNlCisgICAgICAgICAgICAgICAgZ3JvdXAgYXMgY3Vyck1iQWRkcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE5leHRNYkFkZHJlc3ModTMyICpwU2xpY2VHcm91cE1hcCwgdTMyIHBpY1NpemVJbk1icywgdTMyIGN1cnJNYkFkZHIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHNsaWNlR3JvdXAsIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTbGljZUdyb3VwTWFwKTsKKyAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKKyAgICBBU1NFUlQoY3Vyck1iQWRkciA8IHBpY1NpemVJbk1icyk7CisKKyAgICBzbGljZUdyb3VwID0gcFNsaWNlR3JvdXBNYXBbY3Vyck1iQWRkcl07CisKKyAgICBpID0gY3Vyck1iQWRkciArIDE7CisgICAgdG1wID0gcFNsaWNlR3JvdXBNYXBbaV07CisgICAgd2hpbGUgKChpIDwgcGljU2l6ZUluTWJzKSAmJiAodG1wICE9IHNsaWNlR3JvdXApKQorICAgIHsKKyAgICAgICAgaSsrOworICAgICAgICB0bXAgPSBwU2xpY2VHcm91cE1hcFtpXTsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBwaWNTaXplSW5NYnMpCisgICAgICAgIGkgPSAwOworCisgICAgcmV0dXJuKGkpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS41ICBGdW5jdGlvbjogaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2V0IGx1bWEgYW5kIGNocm9tYSBwb2ludGVycyBpbiBpbWFnZV90IGZvciBjdXJyZW50IE1CCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgaW1hZ2UgICAgICAgQ3VycmVudCBpbWFnZQorICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIGN1cnJlbnQgTUIKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKQoreworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHUzMiBwaWNTaXplOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgdG1wOworCisgICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKKyAgICByb3cgPSBtYk51bSAvIHdpZHRoOworICAgIGNvbCA9IG1iTnVtICUgd2lkdGg7CisKKyAgICB0bXAgPSByb3cgKiB3aWR0aDsKKyAgICBwaWNTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBpbWFnZS0+bHVtYSA9ICh1OCopKGltYWdlLT5kYXRhICsgY29sICogMTYgKyB0bXAgKiAyNTYpOworICAgIGltYWdlLT5jYiA9ICh1OCopKGltYWdlLT5kYXRhICsgcGljU2l6ZSAqIDI1NiArIHRtcCAqIDY0ICsgY29sICogOCk7CisgICAgaW1hZ2UtPmNyID0gKHU4KikoaW1hZ2UtPmNiICsgcGljU2l6ZSAqIDY0KTsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNhZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19VVElMX0gKKyNkZWZpbmUgSDI2NFNXREVDX1VUSUxfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9BU1NFUlRfVVNFRAorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKworI2lmIGRlZmluZWQoX1JBTkdFX0NIRUNLKSB8fCBkZWZpbmVkKF9ERUJVR19QUklOVCkgfHwgZGVmaW5lZChfRVJST1JfUFJJTlQpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBIQU5UUk9fT0sgICAwCisjZGVmaW5lIEhBTlRST19OT0sgIDEKKworI2RlZmluZSBIQU5UUk9fVFJVRSAgICAgKDEpCisjZGVmaW5lIEhBTlRST19GQUxTRSAgICAoMCkKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKyNkZWZpbmUgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgMHhGRkZGCisjZGVmaW5lIFBBUkFNX1NFVF9FUlJPUiAweEZGRjAKKworLyogdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgR2V0Qml0cyBpZiBzdHJlYW0gYnVmZmVyIGlzIGVtcHR5ICovCisjZGVmaW5lIEVORF9PRl9TVFJFQU0gMHhGRkZGRkZGRlUKKworI2RlZmluZSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IgMHhGRkZGRkYKKworLyogbWFjcm8gdG8gbWFyayBhIHJlc2lkdWFsIGJsb2NrIGVtcHR5LCBpLmUuIGNvbnRhaW4gemVybyBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgTUFSS19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCisvKiBtYWNybyB0byBjaGVjayBpZiByZXNpZHVhbCBibG9jayBpcyBlbXB0eSAqLworI2RlZmluZSBJU19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPT0gRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SKQorCisvKiBtYWNybyBmb3IgYXNzZXJ0aW9uLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfQVNTRVJUX1VTRUQgaXMgZGVmaW5lZCAqLworI2lmZGVmIF9BU1NFUlRfVVNFRAorI2RlZmluZSBBU1NFUlQoZXhwcikgYXNzZXJ0KGV4cHIpCisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gdmFsdWUsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSworICogaXMgZGVmaW5lZCAqLworI2lmZGVmIF9SQU5HRV9DSEVDSworI2RlZmluZSBSQU5HRV9DSEVDSyh2YWx1ZSwgbWluQm91bmQsIG1heEJvdW5kKSBcCit7IFwKKyAgICBpZiAoKHZhbHVlKSA8IChtaW5Cb3VuZCkgfHwgKHZhbHVlKSA+IChtYXhCb3VuZCkpIFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBWYWx1ZSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIik7IFwKK30KKyNlbHNlCisjZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpCisjZW5kaWYKKworLyogbWFjcm8gZm9yIHJhbmdlIGNoZWNraW5nIGFuIGFycmF5LCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfUkFOR0VfQ0hFQ0sKKyAqIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBfUkFOR0VfQ0hFQ0sKKyNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKSBcCit7IFwKKyAgICBpMzIgaTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoKTsgaSsrKSBcCisgICAgICAgIGlmICgoYXJyYXkpW2ldIDwgKG1pbkJvdW5kKSB8fCAoYXJyYXkpW2ldID4gKG1heEJvdW5kKSkgXAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFZhbHVlIFslZF0gZXhjZWVkcyBnaXZlbiBsaW1pdChzKSFcbiIsaSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIFJBTkdFX0NIRUNLX0FSUkFZKGFycmF5LCBtaW5Cb3VuZCwgbWF4Qm91bmQsIGxlbmd0aCkKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgZGVidWcgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9ERUJVR19QUklOVCBpcworICogZGVmaW5lZCAqLworI2lmZGVmIF9ERUJVR19QUklOVAorI2RlZmluZSBERUJVRyhhcmdzKSBwcmludGYgYXJncworI2Vsc2UKKyNkZWZpbmUgREVCVUcoYXJncykKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgZXJyb3IgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9FUlJPUl9QUklOVCBpcworICogZGVmaW5lZCAqLworI2lmZGVmIF9FUlJPUl9QUklOVAorI2RlZmluZSBFUFJJTlQobXNnKSBmcHJpbnRmKHN0ZGVyciwiRVJST1I6ICVzXG4iLG1zZykKKyNlbHNlCisjZGVmaW5lIEVQUklOVChtc2cpCisjZW5kaWYKKworLyogbWFjcm8gdG8gZ2V0IHNtYWxsZXIgb2YgdHdvIHZhbHVlcyAqLworI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisvKiBtYWNybyB0byBnZXQgZ3JlYXRlciBvZiB0d28gdmFsdWVzICovCisjZGVmaW5lIE1BWChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKKy8qIG1hY3JvIHRvIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLworI2RlZmluZSBBQlMoYSkgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKy8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IHggPD0geiA9PCB5ICovCisjZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQorCisvKiBtYWNybyB0byBjbGlwIGEgdmFsdWUgeiwgc28gdGhhdCAwIDw9IHogPTwgMjU1ICovCisjZGVmaW5lIENMSVAxKHopICgoKHopIDwgMCkgPyAwIDogKCgoeikgPiAyNTUpID8gMjU1IDogKHopKSkKKworLyogbWFjcm8gdG8gYWxsb2NhdGUgbWVtb3J5ICovCisjZGVmaW5lIEFMTE9DQVRFKHB0ciwgY291bnQsIHR5cGUpIFwKK3sgXAorICAgIChwdHIpID0gSDI2NFN3RGVjTWFsbG9jKChjb3VudCkgKiBzaXplb2YodHlwZSkpOyBcCit9CisKKy8qIG1hY3JvIHRvIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworI2RlZmluZSBGUkVFKHB0cikgXAoreyBcCisgICAgSDI2NFN3RGVjRnJlZSgocHRyKSk7IChwdHIpID0gTlVMTDsgXAorfQorCisjZGVmaW5lIEFMSUdOKHB0ciwgYnl0ZVBvcykgXAorICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAoaW50KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQorCitleHRlcm4gY29uc3QgdTMyIGgyNjRic2RRcENbNTJdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSwgdTMyIGxlbmd0aCk7CisjZWxzZQordTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUpOworI2VuZGlmCit1MzIgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMoc3RybURhdGFfdCAqc3RybURhdGEpOworCit1MzIgaDI2NGJzZE1vcmVSYnNwRGF0YShzdHJtRGF0YV90ICpzdHJtRGF0YSk7CisKK3UzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcik7CisKK3ZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1VUSUxfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDYwZjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYwpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCisgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBkZWZpbml0aW9uIG9mIHNwZWNpYWwgY29kZSBudW0sIHRoaXMgYWxvbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQKKyAqIHRvIGhhbmRsZSBjb2RlIG51bSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzJdIGluIHRoZSBEZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorICogZnVuY3Rpb24gKi8KKyNkZWZpbmUgQklHX0NPREVfTlVNIDB4RkZGRkZGRkZVCisKKy8qIE1hcHBpbmcgdGFibGVzIGZvciBjb2RlZF9ibG9ja19wYXR0ZXJuLCB1c2VkIGZvciBkZWNvZGluZyBvZiBtYXBwZWQKKyAqIEV4cC1Hb2xvbWIgY29kZXMgKi8KK3N0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0WzQ4XSA9IHsKKyAgICA0NywzMSwxNSwwLDIzLDI3LDI5LDMwLDcsMTEsMTMsMTQsMzksNDMsNDUsNDYsMTYsMyw1LDEwLDEyLDE5LDIxLDI2LDI4LDM1LAorICAgIDM3LDQyLDQ0LDEsMiw0LDgsMTcsMTgsMjAsMjQsNiw5LDIyLDI1LDMyLDMzLDM0LDM2LDQwLDM4LDQxfTsKKworc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbNDhdID0geworICAgIDAsMTYsMSwyLDQsOCwzMiwzLDUsMTAsMTIsMTUsNDcsNywxMSwxMywxNCw2LDksMzEsMzUsMzcsNDIsNDQsMzMsMzQsMzYsNDAsCisgICAgMzksNDMsNDUsNDYsMTcsMTgsMjAsMjQsMTksMjEsMjYsMjgsMjMsMjcsMjksMzAsMjIsMjUsMzgsNDF9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvZGVOdW0gdXNlZAorICAgICAgICAgICAgaW4gb3RoZXIgRXhwLUdvbG9tYiBjb2RlIG1hcHBpbmdzLiBDb2RlIG51bSAoaS5lLiB0aGUgZGVjb2RlZAorICAgICAgICAgICAgc3ltYm9sKSBpcyBkZXRlcm1pbmVkIGFzCisKKyAgICAgICAgICAgICAgICBjb2RlTnVtID0gMl5sZWFkaW5nWmVyb3MgLSAxICsgR2V0Qml0cyhsZWFkaW5nWmVyb3MpCisKKyAgICAgICAgICAgIE5vcm1hbCBkZWNvZGVkIHN5bWJvbHMgYXJlIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdLiBTeW1ib2wKKyAgICAgICAgICAgIDJeMzItMSBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlIEhBTlRST19PSworICAgICAgICAgICAgd2hpbGUgc3ltYm9sIDJeMzIgIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIEhBTlRST19OT0suICBUaGVzZSB0d28gc3ltYm9scyBhcmUgc3BlY2lhbCBjYXNlcyB3aXRoIGNvZGUgbGVuZ3RoCisgICAgICAgICAgICBvZiA2NSwgaS5lLiAgMzIgJzAnIGJpdHMsIGEgJzEnIGJpdCwgYW5kIGVpdGhlciAwIG9yIDEgcmVwcmVzZW50ZWQKKyAgICAgICAgICAgIGJ5IDMyIGJpdHMuCisKKyAgICAgICAgICAgIFN5bWJvbCAyXjMyIGlzIG91dCBvZiB1bnNpZ25lZCAzMi1iaXQgcmFuZ2UgYnV0IGlzIG5lZWRlZCBmb3IKKyAgICAgICAgICAgIERlY29kZUV4cEdvbG9tYlNpZ25lZCB0byBleHByZXNzIHZhbHVlIC0yXjMxLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjb2RlTnVtICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQsIG5vdGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCSUdfQ09ERV9OVU0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqY29kZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYml0cywgbnVtWmVyb3M7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChjb2RlTnVtKTsKKworICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworCisgICAgLyogZmlyc3QgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMSAqLworICAgIGlmIChiaXRzID49IDB4ODAwMDAwMDApCisgICAgeworICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICpjb2RlTnVtID0gMDsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIHNlY29uZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAzICovCisgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDAwMDAwKQorICAgIHsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAqY29kZU51bSA9IDEgKyAoKGJpdHMgPj4gMjkpICYgMHgxKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIC8qIHRoaXJkIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDUgKi8KKyAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMDAwMDApCisgICAgeworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDUpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICpjb2RlTnVtID0gMyArICgoYml0cyA+PiAyNykgJiAweDMpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogZm91cnRoIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDcgKi8KKyAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMDAwMDApCisgICAgeworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDcpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICpjb2RlTnVtID0gNyArICgoYml0cyA+PiAyNSkgJiAweDcpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogb3RoZXIgY29kZSBsZW5ndGhzICovCisgICAgZWxzZQorICAgIHsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgIG51bVplcm9zID0gNCArIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzLCAyOCk7CisjZWxzZQorICAgICAgICBudW1aZXJvcyA9IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzKTsKKyNlbmRpZgorICAgICAgICAvKiBhbGwgMzIgYml0cyBhcmUgemVybyAqLworICAgICAgICBpZiAobnVtWmVyb3MgPT0gMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgICpjb2RlTnVtID0gMDsKKyAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKTsKKyAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgLyogY2hlY2sgMzNyZCBiaXQsIG11c3QgYmUgMSAqLworICAgICAgICAgICAgaWYgKGJpdHMgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBjYW5ub3QgdXNlIGgyNjRic2RHZXRCaXRzLCBsaW1pdGVkIHRvIDMxIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiAtIDEsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZyAqLworICAgICAgICAgICAgICAgIGlmIChiaXRzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZworICAgICAgICAgICAgICAgICAqIChyZXN1bHRzIGluIC0yXjMxKSAqLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgbW9yZSB6ZXJvcyB0aGFuIDMyLCBpdCBpcyBhbiBlcnJvciAqLworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLG51bVplcm9zKzEpOworCisgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIG51bVplcm9zKTsKKyAgICAgICAgaWYgKGJpdHMgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAqY29kZU51bSA9ICgxIDw8IG51bVplcm9zKSAtIDEgKyBiaXRzOworCisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBzaWduZWQKKyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGFzCisKKyAgICAgICAgICAgICAgICBzeW1ib2wgPSAoLTEpXihjb2RlTnVtKzEpICogKGNvZGVOdW0rMSkvMgorCisgICAgICAgICAgICBTaWduZWQgc3ltYm9scyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2UgWy0yXjMxLCAyXjMxIC0gMV0uIFN5bWJvbAorICAgICAgICAgICAgLTJeMzEgaXMgb2J0YWluZWQgd2hlbiBjb2RlTnVtIGlzIDJeMzIsIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQKKyAgICAgICAgICAgIGJ5IHVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gVGhpcyBpcyBzaWduYWxlZCBhcyBhIHNwZWNpYWwgY2FzZSBmcm9tCisgICAgICAgICAgICB0aGUgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGJ5IHNldHRpbmcgY29kZU51bSB0bworICAgICAgICAgICAgQklHX0NPREVfTlVNIGFuZCByZXR1cm5pbmcgSEFOVFJPX05PSyBzdGF0dXMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHN0YXR1cywgY29kZU51bSA9IDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVCh2YWx1ZSk7CisKKyAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7CisKKyAgICBpZiAoY29kZU51bSA9PSBCSUdfQ09ERV9OVU0pCisgICAgeworICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyLTEgd2hpY2ggd291bGQKKyAgICAgICAgICogcmVzdWx0IGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAyXjMxIChpLmUuIG91dCBvZiAzMi1iaXQgc2lnbmVkCisgICAgICAgICAqIGludGVnZXIgcmFuZ2UpICovCisgICAgICAgIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19OT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMiB3aGljaCByZXN1bHRzCisgICAgICAgICAqIGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAtMl4zMSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICp2YWx1ZSA9IChpMzIpKDIxNDc0ODM2NDhVKTsKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQorICAgIHsKKyAgICAgICAgLyogKC0xKV4oY29kZU51bSsxKSByZXN1bHRzIGluIHBvc2l0aXZlIHNpZ24gaWYgY29kZU51bSBpcyBvZGQsCisgICAgICAgICAqIG5lZ2F0aXZlIHdoZW4gaXQgaXMgZXZlbi4gKGNvZGVOdW0rMSkvMiBpcyBvYnRhaW5lZCBhcworICAgICAgICAgKiAoY29kZU51bSsxKT4+MSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGFuZCBhcyAoLWNvZGVOdW0pPj4xIGZvcgorICAgICAgICAgKiBuZWdhdGl2ZSB2YWx1ZSAqLworICAgICAgICAvKmxpbnQgLWU3MDIgKi8KKyAgICAgICAgKnZhbHVlID0gKGNvZGVOdW0gJiAweDEpID8gKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpMzIpKChjb2RlTnVtICsgMSkgPj4gMSk7CisgICAgICAgIC8qbGludCArZTcwMiAqLworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgbWFwcGVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBjb2RlZEJsb2NrUGF0dGVybgorICAgICAgICAgICAgZWl0aGVyIGZvciBpbnRyYSBvciBpbnRlciBtYWNyb2Jsb2NrLiBUaGUgbWFwcGluZyBpcyBpbXBsZW1lbnRlZCBieQorICAgICAgICAgICAgbG9vay11cCB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgaXNJbnRyYSAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgaW50cmEgb3IgaW50ZXIgbWFwcGluZyBpcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgaXNJbnRyYSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgc3RhdHVzLCBjb2RlTnVtOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQodmFsdWUpOworCisgICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmFuZ2Ugb2YgdmFsaWQgY29kZU51bXMgWzAsNDddICovCisgICAgICAgIGlmIChjb2RlTnVtID4gNDcpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICBpZiAoaXNJbnRyYSkKKyAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbY29kZU51bV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbY29kZU51bV07CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2RlLiBncmVhdGVyVGhhbk9uZSBmbGFnIGluZGljYXRlcworICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wgdG8gYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIEZBTFNFICAgLT4gIFswLDFdCisgICAgICAgICAgICAgICAgVFJVRSAgICAtPiAgWzAsMl4zMi0xXQorCisgICAgICAgICAgICBJZiBmbGFnIGlzIGZhbHNlIHRoZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgYnkgcmVhZGluZyBvbmUgYml0CisgICAgICAgICAgICBmcm9tIHRoZSBzdHJlYW0gd2l0aCBoMjY0YnNkR2V0Qml0cyBhbmQgbWFwcGluZyB0aGlzIHRvIGRlY29kZWQKKyAgICAgICAgICAgIHN5bWJvbCBhcworICAgICAgICAgICAgICAgIHN5bWJvbCA9IGJpdCA/IDAgOiAxCisKKyAgICAgICAgICAgIE90aGVyd2lzZSwgaS5lLiB3aGVuIGZsYWcgaXMgVFJVRSwgY29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGlzIGlzIHVzZWQgYXMgdGhlIGRlY29kZWQKKyAgICAgICAgICAgIHN5bWJvbC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGdyZWF0ZXJUaGFuT25lICBmbGFnIHRvIGluZGljYXRlIGlmIHJhbmdlIGlzIHdpZGVyIHRoYW4gWzAsMV0KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiAqdmFsdWUsCisgIHUzMiBncmVhdGVyVGhhbk9uZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVCh2YWx1ZSk7CisKKyAgICBpZiAoZ3JlYXRlclRoYW5PbmUpCisgICAgeworICAgICAgICByZXR1cm4oaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgdmFsdWUpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDEpOworICAgICAgICBpZiAoKnZhbHVlID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICAqdmFsdWUgXj0gMHgxOworICAgIH0KKworICAgIHJldHVybiAoSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGMxNjc3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1ZMQ19ICisjZGVmaW5lIEgyNjRTV0RFQ19WTENfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgaTMyICp2YWx1ZSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgaXNJbnRyYSk7CisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKKyAgICB1MzIgZ3JlYXRlclRoYW5PbmUpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WTENfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGE5MzM1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYwpAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzCisgICAgICAgICAgRGVjb2RlSHJkUGFyYW1ldGVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX0RQQl9TSVpFIDE2CisjZGVmaW5lIE1BWF9CUiAgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLworI2RlZmluZSBNQVhfQ1BCICAgICAgMjQwMDAwIC8qIGZvciBsZXZlbCA1LjEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIFZVSSBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBWdWlQYXJhbWV0ZXJzKTsKKworICAgIEgyNjRTd0RlY01lbXNldChwVnVpUGFyYW1ldGVycywgMCwgc2l6ZW9mKHZ1aVBhcmFtZXRlcnNfdCkpOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjID0gdG1wOworCisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPT0gQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FySGVpZ2h0ID0gdG1wOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5BcHByb3ByaWF0ZUZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAzKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9Gb3JtYXQgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9GdWxsUmFuZ2VGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IHRtcDsKKworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzID0gdG1wOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzICAgICAgPSAyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCAgICAgICAgICAgICA9IDU7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgICAgICAgICA9IDI7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+Y2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQgPiA1KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCA+IDUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+dGltaW5nSW5mb1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAodG1wID09IDApCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1Vbml0c0luVGljayA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAodG1wID09IDApCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1lU2NhbGUgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+Zml4ZWRGcmFtZVJhdGVGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IERlY29kZUhyZFBhcmFtZXRlcnMocFN0cm1EYXRhLCAmcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJDbnQgICAgICAgICAgPSAxOworICAgICAgICAvKiBNYXhCUiBhbmQgTWF4Q1BCIHNob3VsZCBiZSB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpZyB0byB0aGUgbGV2ZWxJZGMKKyAgICAgICAgICogaW4gdGhlIFNQUyBjb250YWluaW5nIHRoZXNlIFZVSSBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKKyAgICAgICAgICogYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBtYXhpbXVtIGZvciBhbnkgbGV2ZWwgd2lsbCBiZSB1c2VkIGhlcmUgKi8KKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuYml0UmF0ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9CUiArIDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlNpemVWYWx1ZVswXSA9IDEyMDAgKiBNQVhfQ1BCICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJSZW1vdmFsRGVsYXlMZW5ndGggICAgICAgID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmRwYk91dHB1dERlbGF5TGVuZ3RoICAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMudGltZU9mZnNldExlbmd0aCAgICAgICAgICAgICA9IDI0OworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7CisgICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYworICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcworICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMDAwICogTUFYX0JSICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTAwMCAqIE1BWF9DUEIgKyAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7CisgICAgfQorCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgfHwKKyAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb3dEZWxheUhyZEZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnID0KKyAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwgPiAxNikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20gICAgICAgPSAyOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gICAgICAgICA9IDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID0gMTY7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCAgID0gMTY7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzICAgICAgICAgID0gTUFYX0RQQl9TSVpFOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgICAgICA9IE1BWF9EUEJfU0laRTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUhyZFBhcmFtZXRlcnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIEhSRCBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwSHJkUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVIcmRQYXJhbWV0ZXJzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIGhyZFBhcmFtZXRlcnNfdCAqcEhyZFBhcmFtZXRlcnMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBIcmRQYXJhbWV0ZXJzKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICAvKiBjcGJDb3VudCA9IGNwYl9jbnRfbWludXMxICsgMSAqLworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQrKzsKKyAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmNwYkNudCA+IE1BWF9DUEJfQ05UKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUgPSB0bXA7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUgPSB0bXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEhyZFBhcmFtZXRlcnMtPmNwYkNudDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogYml0X3JhdGVfdmFsdWVfbWludXMxIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSA+IDQyOTQ5NjcyOTRVKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldKys7CisgICAgICAgIC8qIHRoaXMgbWF5IHJlc3VsdCBpbiBvdmVyZmxvdywgYnV0IHRoaXMgdmFsdWUgaXMgbm90IHVzZWQgZm9yCisgICAgICAgICAqIGFueXRoaW5nICovCisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0gKj0KKyAgICAgICAgICAgIDEgPDwgKDYgKyBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVNjYWxlKTsKKworICAgICAgICAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0rKzsKKyAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKKyAgICAgICAgICogYW55dGhpbmcgKi8KKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSAqPQorICAgICAgICAgICAgMSA8PCAoNCArIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUpOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNickZsYWdbaV0gPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+aW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJSZW1vdmFsRGVsYXlMZW5ndGggPSB0bXAgKyAxOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+ZHBiT3V0cHV0RGVsYXlMZW5ndGggPSB0bXAgKyAxOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwSHJkUGFyYW1ldGVycy0+dGltZU9mZnNldExlbmd0aCA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWQ1MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1ZVSV9ICisjZGVmaW5lIEgyNjRTV0RFQ19WVUlfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfQ1BCX0NOVCAzMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVudW1lcmF0ZWQgc2FtcGxlIGFzcGVjdCByYXRpb3MsIEFTUEVDVF9SQVRJT19NX04gbWVhbnMgTTpOICovCitlbnVtCit7CisgICAgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEID0gMCwKKyAgICBBU1BFQ1RfUkFUSU9fMV8xLAorICAgIEFTUEVDVF9SQVRJT18xMl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTBfMTEsCisgICAgQVNQRUNUX1JBVElPXzE2XzExLAorICAgIEFTUEVDVF9SQVRJT180MF8zMywKKyAgICBBU1BFQ1RfUkFUSU9fMjRfMTEsCisgICAgQVNQRUNUX1JBVElPXzIwXzExLAorICAgIEFTUEVDVF9SQVRJT18zMl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fODBfMzMsCisgICAgQVNQRUNUX1JBVElPXzE4XzExLAorICAgIEFTUEVDVF9SQVRJT18xNV8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fNjRfMzMsCisgICAgQVNQRUNUX1JBVElPXzE2MF85OSwKKyAgICBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSID0gMjU1Cit9OworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgSHlwb3RoZXRpY2FsIFJlZmVyZW5jZSBEZWNvZGVyIChIUkQpIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGNwYkNudDsKKyAgICB1MzIgYml0UmF0ZVNjYWxlOworICAgIHUzMiBjcGJTaXplU2NhbGU7CisgICAgdTMyIGJpdFJhdGVWYWx1ZVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGNwYlNpemVWYWx1ZVtNQVhfQ1BCX0NOVF07CisgICAgdTMyIGNickZsYWdbTUFYX0NQQl9DTlRdOworICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoOworICAgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGg7CisgICAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoOworICAgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoOworfSBocmRQYXJhbWV0ZXJzX3Q7CisKKy8qIHN0b3JhZ2UgZm9yIFZVSSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBhc3BlY3RSYXRpb1ByZXNlbnRGbGFnOworICAgIHUzMiBhc3BlY3RSYXRpb0lkYzsKKyAgICB1MzIgc2FyV2lkdGg7CisgICAgdTMyIHNhckhlaWdodDsKKyAgICB1MzIgb3ZlcnNjYW5JbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIG92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnOworICAgIHUzMiB2aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZzsKKyAgICB1MzIgdmlkZW9Gb3JtYXQ7CisgICAgdTMyIHZpZGVvRnVsbFJhbmdlRmxhZzsKKyAgICB1MzIgY29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZzsKKyAgICB1MzIgY29sb3VyUHJpbWFyaWVzOworICAgIHUzMiB0cmFuc2ZlckNoYXJhY3RlcmlzdGljczsKKyAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOworICAgIHUzMiBjaHJvbWFMb2NJbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZDsKKyAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkOworICAgIHUzMiB0aW1pbmdJbmZvUHJlc2VudEZsYWc7CisgICAgdTMyIG51bVVuaXRzSW5UaWNrOworICAgIHUzMiB0aW1lU2NhbGU7CisgICAgdTMyIGZpeGVkRnJhbWVSYXRlRmxhZzsKKyAgICB1MzIgbmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOworICAgIGhyZFBhcmFtZXRlcnNfdCBuYWxIcmRQYXJhbWV0ZXJzOworICAgIHUzMiB2Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7CisgICAgaHJkUGFyYW1ldGVyc190IHZjbEhyZFBhcmFtZXRlcnM7CisgICAgdTMyIGxvd0RlbGF5SHJkRmxhZzsKKyAgICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWc7CisgICAgdTMyIGJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZzsKKyAgICB1MzIgbW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZzsKKyAgICB1MzIgbWF4Qnl0ZXNQZXJQaWNEZW5vbTsKKyAgICB1MzIgbWF4Qml0c1Blck1iRGVub207CisgICAgdTMyIGxvZzJNYXhNdkxlbmd0aEhvcml6b250YWw7CisgICAgdTMyIGxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsOworICAgIHUzMiBudW1SZW9yZGVyRnJhbWVzOworICAgIHUzMiBtYXhEZWNGcmFtZUJ1ZmZlcmluZzsKK30gdnVpUGFyYW1ldGVyc190OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycyk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZVSV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCmluZGV4IDVjNzY4YzguLjkyNTEyMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawpAQCAtNiw4ICs2LDMzIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGV4dGVybmFsL3RyZW1vbG8KKyAgICAgICAgZXh0ZXJuYWwvdHJlbW9sbyBcCiAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF92b3JiaXNkZWMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgU29mdFZvcmJpcy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGV4dGVybmFsL3RyZW1vbG8gXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdm9yYmlzZGVjCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJ2b3JiaXNpZGVjIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MTExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0Vm9yYmlzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdFZvcmJpcy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdFZvcmJpczo6U29mdFZvcmJpcygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1TdGF0ZShOVUxMKSwKKyAgICAgIG1WaShOVUxMKSwKKyAgICAgIG1BbmNob3JUaW1lVXMoMCksCisgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAorICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UoLTEpLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdFZvcmJpczo6flNvZnRWb3JiaXMoKSB7CisgICAgaWYgKG1TdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobVZpICE9IE5VTEwpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdFZvcmJpczo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQUFDOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBzaXplb2YoaW50MTZfdCk7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0Vm9yYmlzOjppbml0RGVjb2RlcigpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICp2b3JiaXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHZvcmJpc1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5NaW5CaXRSYXRlID0gMDsKKyAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bk1heEJpdFJhdGUgPSAwOworICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uQXVkaW9CYW5kV2lkdGggPSAwOworICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uUXVhbGl0eSA9IDM7CisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPmJNYW5hZ2VkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5iRG93bm1peCA9IE9NWF9GQUxTRTsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bkNoYW5uZWxzID0gbVZpLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVZpLT5yYXRlOworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bkJpdFJhdGUgPSBtVmktPmJpdHJhdGVfbm9taW5hbDsKKyAgICAgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5NaW5CaXRSYXRlID0gbVZpLT5iaXRyYXRlX2xvd2VyOworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bk1heEJpdFJhdGUgPSBtVmktPmJpdHJhdGVfdXBwZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1WaS0+cmF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0Vm9yYmlzOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICp2b3JiaXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHZvcmJpc1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0Vm9yYmlzOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID49IDI7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VCaXRSZWFkZXIoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBvZ2dfYnVmZmVyICpidWYsIG9nZ19yZWZlcmVuY2UgKnJlZiwgb2dncGFja19idWZmZXIgKmJpdHMpIHsKKyAgICBidWYtPmRhdGEgPSAodWludDhfdCAqKWRhdGE7CisgICAgYnVmLT5zaXplID0gc2l6ZTsKKyAgICBidWYtPnJlZmNvdW50ID0gMTsKKyAgICBidWYtPnB0ci5vd25lciA9IE5VTEw7CisKKyAgICByZWYtPmJ1ZmZlciA9IGJ1ZjsKKyAgICByZWYtPmJlZ2luID0gMDsKKyAgICByZWYtPmxlbmd0aCA9IHNpemU7CisgICAgcmVmLT5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfcmVhZGluaXQoYml0cywgcmVmKTsKK30KKwordm9pZCBTb2Z0Vm9yYmlzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUlucHV0QnVmZmVyQ291bnQgPCAyKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gaW5mby0+bUhlYWRlcjsKKworICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywKKyAgICAgICAgICAgICAgICAmYnVmLCAmcmVmLCAmYml0cyk7CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIENIRUNLKG1WaSA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mbzsKKyAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgX3ZvcmJpc191bnBhY2tfaW5mbyhtVmksICZiaXRzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19FUSgwLCBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSk7CisKKyAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBOVUxMKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRlOworICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgdm9yYmlzX2RzcF9pbml0KG1TdGF0ZSwgbVZpKSk7CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKKyAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKKyAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyCisgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKKyAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworCisgICAgICAgIGlmIChudW1QYWdlU2FtcGxlcyA+PSAwKSB7CisgICAgICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VTYW1wbGVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTs7CisKKyAgICAgICAgb2dnX2J1ZmZlciBidWY7CisgICAgICAgIGJ1Zi5kYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgYnVmLnNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICAgICAgYnVmLnB0ci5vd25lciA9IE5VTEw7CisKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgICAgICByZWYuYmVnaW4gPSAwOworICAgICAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgICAgICBvZ2dfcGFja2V0IHBhY2s7CisgICAgICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICAgICAgcGFjay5ieXRlcyA9IHJlZi5sZW5ndGg7CisgICAgICAgIHBhY2suYl9vX3MgPSAwOworICAgICAgICBwYWNrLmVfb19zID0gMDsKKyAgICAgICAgcGFjay5ncmFudWxlcG9zID0gMDsKKyAgICAgICAgcGFjay5wYWNrZXRubyA9IDA7CisKKyAgICAgICAgaW50IG51bUZyYW1lcyA9IDA7CisKKyAgICAgICAgaW50IGVyciA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIExPR1coInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlcik7CisKKyAgICAgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgidm9yYmlzX2RzcF9wY21vdXQgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICAgICAgaWYgKG51bUZyYW1lcyA+IG1OdW1GcmFtZXNMZWZ0T25QYWdlKSB7CisgICAgICAgICAgICAgICAgTE9HVigiZGlzY2FyZGluZyAlZCBmcmFtZXMgYXQgZW5kIG9mIHBhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOworICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgLT0gbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKyAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzCisgICAgICAgICAgICAgICAgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtVmktPnJhdGU7CisKKyAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBudW1GcmFtZXM7CisKKyAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgfQorfQorCit2b2lkIFNvZnRWb3JiaXM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1TdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICB2b3JiaXNfZHNwX3Jlc3RhcnQobVN0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdFZvcmJpczo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRWb3JiaXMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTJmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9WT1JCSVNfSF8KKworI2RlZmluZSBTT0ZUX1ZPUkJJU19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3Qgdm9yYmlzX2RzcF9zdGF0ZTsKK3N0cnVjdCB2b3JiaXNfaW5mbzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdFZvcmJpcyA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0Vm9yYmlzKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0Vm9yYmlzKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDQsCisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyID0gODE5MiAqIDIKKyAgICB9OworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7CisgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OworICAgIGludDMyX3QgbU51bUZyYW1lc0xlZnRPblBhZ2U7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWb3JiaXMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX1ZPUkJJU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCAzYjkyZTVkLi5iMjhkOTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKQEAgLTE4Nyw4ICsxODUsNyBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hcigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7Ci0gICAgaWYgKCEoKGRzdC5tV2lkdGggJiAxKSA9PSAwCi0gICAgICAgICAgICAmJiAoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKKyAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKICAgICAgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKICAgICAgICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMTk2LDggKzE5Myw4IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQzMl90ICpkc3RfcHRyID0gKHVpbnQzMl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgKGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0KSAvIDI7CisgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKQEAgLTI2MCw3ICsyNTcsMTEgQEAKICAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKIAotICAgICAgICAgICAgZHN0X3B0clt4IC8gMl0gPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICAgICAgaWYgKHggKyAxIDwgc3JjLmNyb3BXaWR0aCgpKSB7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKSgmZHN0X3B0clt4XSkgPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RfcHRyW3hdID0gcmdiMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CkBAIC0yNzAsNyArMjcxLDcgQEAKICAgICAgICAgICAgIHNyY192ICs9IHNyYy5tV2lkdGggLyAyOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoIC8gMjsKKyAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCAzMWFmYzQzLi5hNGU4ZWU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC01Niw5ICs1NiwyMSBAQAogICAgIH0KIAogICAgIGludCBoYWxGb3JtYXQ7CisgICAgc2l6ZV90IGJ1ZldpZHRoLCBidWZIZWlnaHQ7CisKICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1XaWR0aCArIDEpICYgfjE7CisgICAgICAgICAgICBidWZIZWlnaHQgPSAobUhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgICAgICBidWZXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgICAgIGJ1ZkhlaWdodCA9IG1IZWlnaHQ7CiAKICAgICAgICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoCiAgICAgICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKQEAgLTc3LDEzICs4OSwxMSBAQAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgogICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApKTsKIAotICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtTmF0aXZlV2luZG93LmdldCgpLCAyKSk7Ci0KICAgICAvLyBXaWR0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDMyPz8/CiAgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIG1Dcm9wUmlnaHQgLSBtQ3JvcExlZnQgKyAxLAotICAgICAgICAgICAgICAgIG1Dcm9wQm90dG9tIC0gbUNyb3BUb3AgKyAxLAorICAgICAgICAgICAgICAgIGJ1ZldpZHRoLAorICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCwKICAgICAgICAgICAgICAgICBoYWxGb3JtYXQpKTsKIAogICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKQEAgLTk5LDYgKzEwOSwxNCBAQAogICAgICAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiAgICAgfQorCisgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNyb3A7CisgICAgY3JvcC5sZWZ0ID0gbUNyb3BMZWZ0OworICAgIGNyb3AudG9wID0gbUNyb3BUb3A7CisgICAgY3JvcC5yaWdodCA9IG1Dcm9wUmlnaHQgKyAxOworICAgIGNyb3AuYm90dG9tID0gbUNyb3BCb3R0b20gKyAxOworCisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtTmF0aXZlV2luZG93LmdldCgpLCAmY3JvcCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKQEAgLTEwNiw5ICsxMjQsMTQgQEAKICAgICBtQ29udmVydGVyID0gTlVMTDsKIH0KIAorc3RhdGljIGludCBBTElHTihpbnQgeCwgaW50IHkpIHsKKyAgICAvLyB5IG11c3QgYmUgYSBwb3dlciBvZiAyLgorICAgIHJldHVybiAoeCArIHkgLSAxKSAmIH4oeSAtIDEpOworfQorCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICpidWY7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwogICAgIGludCBlcnI7CiAgICAgaWYgKChlcnIgPSBtTmF0aXZlV2luZG93LT5kZXF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYpKSAhPSAwKSB7CiAgICAgICAgIExPR1coIlN1cmZhY2U6OmRlcXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwpAQCAtMTI5LDE0ICsxNTIsNDAgQEAKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKLSAgICAgICAgICAgICAgICBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbSwKKyAgICAgICAgICAgICAgICAwLCAwLCBtV2lkdGggLSAxLCBtSGVpZ2h0IC0gMSwKICAgICAgICAgICAgICAgICBkc3QsCiAgICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LAotICAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAgbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCwKLSAgICAgICAgICAgICAgICBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wKTsKKyAgICAgICAgICAgICAgICAwLCAwLCBtV2lkdGggLSAxLCBtSGVpZ2h0IC0gMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgQ0hFQ0tfRVEobUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7CisKKyAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKKyAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OworICAgICAgICBzaXplX3QgZHN0X2Nfc3RyaWRlID0gQUxJR04oYnVmLT5zdHJpZGUgLyAyLCAxNik7CisgICAgICAgIHNpemVfdCBkc3RfY19zaXplID0gZHN0X2Nfc3RyaWRlICogYnVmLT5oZWlnaHQgLyAyOworICAgICAgICB1aW50OF90ICpkc3RfdiA9IGRzdF95ICsgZHN0X3lfc2l6ZTsKKyAgICAgICAgdWludDhfdCAqZHN0X3UgPSBkc3RfdiArIGRzdF9jX3NpemU7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RfeSwgc3JjX3ksIG1XaWR0aCk7CisKKyAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0X3UsIHNyY191LCAobVdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgICAgIG1lbWNweShkc3Rfdiwgc3JjX3YsIChtV2lkdGggKyAxKSAvIDIpOworCisgICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKKyAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2soYnVmLT5oYW5kbGUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IGI3MDg3ZjguLmE1YjMxNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtMzMsMTggKzMzLDMwIEBACiBzdHJ1Y3QgQUxvb3Blcjo6TG9vcGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CiAgICAgTG9vcGVyVGhyZWFkKEFMb29wZXIgKmxvb3BlciwgYm9vbCBjYW5DYWxsSmF2YSkKICAgICAgICAgOiBUaHJlYWQoY2FuQ2FsbEphdmEpLAotICAgICAgICAgIG1Mb29wZXIobG9vcGVyKSB7CisgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICAgIG1UaHJlYWRJZChOVUxMKSB7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkeVRvUnVuKCkgeworICAgICAgICBtVGhyZWFkSWQgPSBhbmRyb2lkR2V0VGhyZWFkSWQoKTsKKworICAgICAgICByZXR1cm4gVGhyZWFkOjpyZWFkeVRvUnVuKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CiAgICAgICAgIHJldHVybiBtTG9vcGVyLT5sb29wKCk7CiAgICAgfQogCisgICAgYm9vbCBpc0N1cnJlbnRUaHJlYWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGhyZWFkSWQgPT0gYW5kcm9pZEdldFRocmVhZElkKCk7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TG9vcGVyVGhyZWFkKCkge30KIAogcHJpdmF0ZToKICAgICBBTG9vcGVyICptTG9vcGVyOworICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgbVRocmVhZElkOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9vcGVyVGhyZWFkKTsKIH07CkBAIC0xMzYsNyArMTQ4LDkgQEAKIAogICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICBpZiAoIXJ1bm5pbmdMb2NhbGx5KSB7CisgICAgaWYgKCFydW5uaW5nTG9jYWxseSAmJiAhdGhyZWFkLT5pc0N1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAvLyBJZiBub3QgcnVubmluZyBsb2NhbGx5IGFuZCB0aGlzIHRocmVhZCBfaXNfIHRoZSBsb29wZXIgdGhyZWFkLAorICAgICAgICAvLyB0aGUgbG9vcCgpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuZCBuZXZlciBiZSBjYWxsZWQgYWdhaW4uCiAgICAgICAgIHRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgfQogCkBAIC0xOTcsNiArMjExLDExIEBACiAKICAgICBnTG9vcGVyUm9zdGVyLmRlbGl2ZXJNZXNzYWdlKGV2ZW50Lm1NZXNzYWdlKTsKIAorICAgIC8vIE5PVEU6IEl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IG91ciAiQUxvb3BlciIgb2JqZWN0CisgICAgLy8gbWF5IG5vIGxvbmdlciBleGlzdCAoaXRzIGZpbmFsIHJlZmVyZW5jZSBtYXkgaGF2ZSBnb25lIGF3YXkgd2hpbGUKKyAgICAvLyBkZWxpdmVyaW5nIHRoZSBtZXNzYWdlKS4gV2UgaGF2ZSBtYWRlIHN1cmUsIGhvd2V2ZXIsIHRoYXQgbG9vcCgpCisgICAgLy8gd29uJ3QgYmUgY2FsbGVkIGFnYWluLgorCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawppbmRleCA0ZTA3ZjZmLi5kNTAyNWExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC0yNSw2ICsyNSw2IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAotTE9DQUxfUFJFTElOS19NT0RVTEU6PSBmYWxzZQorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCBmMGNkNmEwLi4wMTJkOWFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKIAogI2luY2x1ZGUgImluY2x1ZGUvTTNVUGFyc2VyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KQEAgLTQ1LDkgKzQ1LDkgQEAKICAgICA6IG1GbGFncyhmbGFncyksCiAgICAgICBtRGF0YVNvdXJjZShuZXcgTGl2ZURhdGFTb3VyY2UpLAogICAgICAgbUhUVFBEYXRhU291cmNlKAotICAgICAgICAgICAgICBuZXcgTnVIVFRQRGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBOdUhUVFBEYXRhU291cmNlOjprRmxhZ0luY29nbml0bworICAgICAgICAgICAgICAgICAgICA/IEhUVFBCYXNlOjprRmxhZ0luY29nbml0bwogICAgICAgICAgICAgICAgICAgICA6IDApKSwKICAgICAgIG1QcmV2QmFuZHdpZHRoSW5kZXgoLTEpLAogICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xKSwKQEAgLTY3LDkgKzY3LDE3IEBACiAgICAgcmV0dXJuIG1EYXRhU291cmNlOwogfQogCi12b2lkIExpdmVTZXNzaW9uOjpjb25uZWN0KGNvbnN0IGNoYXIgKnVybCkgewordm9pZCBMaXZlU2Vzc2lvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCBpZCgpKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKKworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKAorICAgICAgICAgICAgICAgICJoZWFkZXJzIiwKKyAgICAgICAgICAgICAgICBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4oKmhlYWRlcnMpKTsKKyAgICB9CisKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMTQ0LDYgKzE1MiwxNiBAQAogICAgIEFTdHJpbmcgdXJsOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJsIiwgJnVybCkpOwogCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOworICAgIGlmICghbXNnLT5maW5kUG9pbnRlcigiaGVhZGVycyIsICh2b2lkICoqKSZoZWFkZXJzKSkgeworICAgICAgICBtRXh0cmFIZWFkZXJzLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUV4dHJhSGVhZGVycyA9ICpoZWFkZXJzOworCisgICAgICAgIGRlbGV0ZSBoZWFkZXJzOworICAgICAgICBoZWFkZXJzID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKICAgICAgICAgTE9HSSgib25Db25uZWN0ICclcyciLCB1cmwuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTIxMCw3ICsyMjgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCgKKyAgICAgICAgICAgICAgICB1cmwsIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNjI1LDcgKzY0NCwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGtleSA9IG5ldyBBQnVmZmVyKDE2KTsKIAotICAgICAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBrZXlTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgc3A8SFRUUEJhc2U+IGtleVNvdXJjZSA9CisgICAgICAgICAgICAgIEhUVFBCYXNlOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pCisgICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCisgICAgICAgICAgICAgICAgICAgIDogMCk7CisKICAgICAgICAgc3RhdHVzX3QgZXJyID0ga2V5U291cmNlLT5jb25uZWN0KGtleVVSSS5jX3N0cigpKTsKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWSUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVklFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzVhOTRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVklFeHRyYWN0b3IuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVZJX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIEFWSV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFWSUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisgICAgQVZJRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFWSUV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBBVklTb3VyY2U7CisKKyAgICBzdHJ1Y3QgU2FtcGxlSW5mbyB7CisgICAgICAgIHVpbnQzMl90IG1PZmZzZXQ7CisgICAgICAgIGJvb2wgbUlzS2V5OworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2sgeworICAgICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgICAgIFZlY3RvcjxTYW1wbGVJbmZvPiBtU2FtcGxlczsKKyAgICAgICAgdWludDMyX3QgbVJhdGU7CisgICAgICAgIHVpbnQzMl90IG1TY2FsZTsKKworICAgICAgICBlbnVtIEtpbmQgeworICAgICAgICAgICAgQVVESU8sCisgICAgICAgICAgICBWSURFTywKKyAgICAgICAgICAgIE9USEVSCisKKyAgICAgICAgfSBtS2luZDsKKworICAgICAgICBzaXplX3QgbU51bVN5bmNTYW1wbGVzOworICAgICAgICBzaXplX3QgbVRodW1ibmFpbFNhbXBsZVNpemU7CisgICAgICAgIHNzaXplX3QgbVRodW1ibmFpbFNhbXBsZUluZGV4OworICAgICAgICBzaXplX3QgbU1heFNhbXBsZVNpemU7CisgICAgfTsKKworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgVmVjdG9yPFRyYWNrPiBtVHJhY2tzOworCisgICAgb2ZmNjRfdCBtTW92aWVPZmZzZXQ7CisgICAgYm9vbCBtRm91bmRJbmRleDsKKyAgICBib29sIG1PZmZzZXRzQXJlQWJzb2x1dGU7CisKKyAgICBzc2l6ZV90IHBhcnNlQ2h1bmsob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSwgaW50IGRlcHRoID0gMCk7CisgICAgc3RhdHVzX3QgcGFyc2VTdHJlYW1IZWFkZXIob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVN0cmVhbUZvcm1hdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSW5kZXgob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHN0YXR1c190IHBhcnNlSGVhZGVycygpOworCisgICAgc3RhdHVzX3QgZ2V0U2FtcGxlSW5mbygKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsCisgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgYm9vbCAqaXNLZXkpOworCisgICAgc3RhdHVzX3QgZ2V0U2FtcGxlSW5kZXhBdFRpbWUoCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUsCisgICAgICAgICAgICBzaXplX3QgKnNhbXBsZUluZGV4KSBjb25zdDsKKworICAgIHN0YXR1c190IGFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoc2l6ZV90IHRyYWNrSW5kZXgpOworCisgICAgc3RhdGljIGJvb2wgSXNDb3JyZWN0Q2h1bmtUeXBlKAorICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsIFRyYWNrOjpLaW5kIGtpbmQsIHVpbnQzMl90IGNodW5rVHlwZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBVklFeHRyYWN0b3IpOworfTsKKworY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBBTWVzc2FnZTsKKworYm9vbCBTbmlmZkFWSSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVZJX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCAzYTIxZjI1Li5mNmRmMzgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIEFXRVNPTUVfUExBWUVSX0hfCiAKLSNpbmNsdWRlICJOdUhUVFBEYXRhU291cmNlLmgiCisjaW5jbHVkZSAiSFRUUEJhc2UuaCIKICNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CkBAIC00NCw2ICs0NCw3IEBACiBjbGFzcyBEcm1NYW5hZ2VyQ2xpbmV0OwogY2xhc3MgRGVjcnlwdEhhbmRsZTsKIAorY2xhc3MgVGltZWRUZXh0UGxheWVyOwogc3RydWN0IFdWTUV4dHJhY3RvcjsKIAogc3RydWN0IEF3ZXNvbWVSZW5kZXJlciA6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTkwLDQ4ICs5MSw2MCBAQAogICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHN0YXR1c190IGdldFBvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uVXMpOwogCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwogCiAgICAgLy8gVGhpcyBpcyBhIG1hc2sgb2YgTWVkaWFFeHRyYWN0b3I6OkZsYWdzLgogICAgIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKLSAgICB2b2lkIHBvc3RBdWRpb0VPUygpOworICAgIHZvaWQgcG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcyA9IDBsbCk7CiAgICAgdm9pZCBwb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKIAorICAgIHN0YXR1c190IHNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW50MzJfdCBpbmRleCk7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBBd2Vzb21lRXZlbnQ7CiAgICAgZnJpZW5kIHN0cnVjdCBQcmV2aWV3UGxheWVyOwogCiAgICAgZW51bSB7Ci0gICAgICAgIFBMQVlJTkcgICAgICAgICAgICAgPSAxLAotICAgICAgICBMT09QSU5HICAgICAgICAgICAgID0gMiwKLSAgICAgICAgRklSU1RfRlJBTUUgICAgICAgICA9IDQsCi0gICAgICAgIFBSRVBBUklORyAgICAgICAgICAgPSA4LAotICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCi0gICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKLSAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAotICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAotICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAotICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAotICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKKyAgICAgICAgUExBWUlORyAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIExPT1BJTkcgICAgICAgICAgICAgPSAweDAyLAorICAgICAgICBGSVJTVF9GUkFNRSAgICAgICAgID0gMHgwNCwKKyAgICAgICAgUFJFUEFSSU5HICAgICAgICAgICA9IDB4MDgsCisgICAgICAgIFBSRVBBUkVEICAgICAgICAgICAgPSAweDEwLAorICAgICAgICBBVF9FT1MgICAgICAgICAgICAgID0gMHgyMCwKKyAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDB4NDAsCisgICAgICAgIENBQ0hFX1VOREVSUlVOICAgICAgPSAweDgwLAorICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMHgwMTAwLAorICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gMHgwMjAwLAorICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMHgwNDAwLAogCiAgICAgICAgIC8vIFdlIGFyZSBiYXNpY2FsbHkgZG9uZSBwcmVwYXJpbmcgYnV0IGFyZSBjdXJyZW50bHkgYnVmZmVyaW5nCiAgICAgICAgIC8vIHN1ZmZpY2llbnQgZGF0YSB0byBiZWdpbiBwbGF5YmFjayBhbmQgZmluaXNoIHRoZSBwcmVwYXJhdGlvbiBwaGFzZQogICAgICAgICAvLyBmb3IgZ29vZC4KLSAgICAgICAgUFJFUEFSSU5HX0NPTk5FQ1RFRCA9IDIwNDgsCisgICAgICAgIFBSRVBBUklOR19DT05ORUNURUQgPSAweDA4MDAsCiAKICAgICAgICAgLy8gV2UncmUgdHJpZ2dlcmluZyBhIHNpbmdsZSB2aWRlbyBldmVudCB0byBkaXNwbGF5IHRoZSBmaXJzdCBmcmFtZQogICAgICAgICAvLyBhZnRlciB0aGUgc2Vla3BvaW50LgotICAgICAgICBTRUVLX1BSRVZJRVcgICAgICAgID0gNDA5NiwKKyAgICAgICAgU0VFS19QUkVWSUVXICAgICAgICA9IDB4MTAwMCwKIAotICAgICAgICBBVURJT19SVU5OSU5HICAgICAgID0gODE5MiwKLSAgICAgICAgQVVESU9QTEFZRVJfU1RBUlRFRCA9IDE2Mzg0LAorICAgICAgICBBVURJT19SVU5OSU5HICAgICAgID0gMHgyMDAwLAorICAgICAgICBBVURJT1BMQVlFUl9TVEFSVEVEID0gMHg0MDAwLAogCi0gICAgICAgIElOQ09HTklUTyAgICAgICAgICAgPSAzMjc2OCwKKyAgICAgICAgSU5DT0dOSVRPICAgICAgICAgICA9IDB4ODAwMCwKKworICAgICAgICBURVhUX1JVTk5JTkcgICAgICAgID0gMHgxMDAwMCwKKyAgICAgICAgVEVYVFBMQVlFUl9TVEFSVEVEICA9IDB4MjAwMDAsCiAgICAgfTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAgICAgTXV0ZXggbU1pc2NTdGF0ZUxvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtU3RhdHNMb2NrOwogCiAgICAgT01YQ2xpZW50IG1DbGllbnQ7CiAgICAgVGltZWRFdmVudFF1ZXVlIG1RdWV1ZTsKQEAgLTE2NSw3ICsxNzgsNiBAQAogCiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIHVpbnQzMl90IG1FeHRyYWN0b3JGbGFnczsKLSAgICB1aW50MzJfdCBtU2luY2VMYXN0RHJvcHBlZDsKIAogICAgIGludDY0X3QgbVRpbWVTb3VyY2VEZWx0YVVzOwogICAgIGludDY0X3QgbVZpZGVvVGltZVVzOwpAQCAtMjA1LDEzICsyMTcsMTMgQEAKICAgICB2b2lkIHBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzID0gLTEpOwogICAgIHZvaWQgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKICAgICB2b2lkIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChzdGF0dXNfdCBzdGF0dXMpOwotICAgIHZvaWQgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7CisgICAgdm9pZCBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKTsKICAgICB2b2lkIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKICAgICBzdGF0dXNfdCBwbGF5X2woKTsKIAogICAgIE1lZGlhQnVmZmVyICptVmlkZW9CdWZmZXI7CiAKLSAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtQ29ubmVjdGluZ0RhdGFTb3VyY2U7CisgICAgc3A8SFRUUEJhc2U+IG1Db25uZWN0aW5nRGF0YVNvdXJjZTsKICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwpAQCAtMjE5LDcgKzIzMSwxMSBAQAogICAgIHNwPEFSVFNQQ29udHJvbGxlcj4gbUNvbm5lY3RpbmdSVFNQQ29udHJvbGxlcjsKIAogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworCisgICAgaW50NjRfdCBtTGFzdFZpZGVvVGltZVVzOworICAgIFRpbWVkVGV4dFBsYXllciAqbVRleHRQbGF5ZXI7CisgICAgbXV0YWJsZSBNdXRleCBtVGltZWRUZXh0TG9jazsKIAogICAgIHNwPFdWTUV4dHJhY3Rvcj4gbVdWTUV4dHJhY3RvcjsKIApAQCAtMjQ0LDYgKzI2MCw4IEBACiAgICAgdm9pZCBzZXRWaWRlb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKTsKICAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyKHVpbnQzMl90IGZsYWdzID0gMCk7CiAKKyAgICB2b2lkIGFkZFRleHRTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSk7CisKICAgICB2b2lkIG9uU3RyZWFtRG9uZSgpOwogCiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwKTsKQEAgLTI3MSw4ICsyODksNDAgQEAKICAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CiAKICAgICBzdGF0dXNfdCBzdGFydEF1ZGlvUGxheWVyX2woKTsKKyAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZV9sKCk7CisKKyAgICB2b2lkIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKKyAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwogCiAgICAgYm9vbCBpc1N0cmVhbWluZ0hUVFAoKSBjb25zdDsKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBlbnVtIEZsYWdNb2RlIHsKKyAgICAgICAgU0VULAorICAgICAgICBDTEVBUiwKKyAgICAgICAgQVNTSUdOCisgICAgfTsKKyAgICB2b2lkIG1vZGlmeUZsYWdzKHVuc2lnbmVkIHZhbHVlLCBGbGFnTW9kZSBtb2RlKTsKKworICAgIHN0cnVjdCBUcmFja1N0YXQgeworICAgICAgICBTdHJpbmc4IG1NSU1FOworICAgICAgICBTdHJpbmc4IG1EZWNvZGVyTmFtZTsKKyAgICB9OworCisgICAgLy8gcHJvdGVjdGVkIGJ5IG1TdGF0c0xvY2sKKyAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICBpbnQgbUZkOworICAgICAgICBTdHJpbmc4IG1VUkk7CisgICAgICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgICAgIHNzaXplX3QgbUF1ZGlvVHJhY2tJbmRleDsKKyAgICAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OworICAgICAgICBpbnQ2NF90IG1OdW1WaWRlb0ZyYW1lc0RlY29kZWQ7CisgICAgICAgIGludDY0X3QgbU51bVZpZGVvRnJhbWVzRHJvcHBlZDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgVmVjdG9yPFRyYWNrU3RhdD4gbVRyYWNrczsKKyAgICB9IG1TdGF0czsKIAogICAgIEF3ZXNvbWVQbGF5ZXIoY29uc3QgQXdlc29tZVBsYXllciAmKTsKICAgICBBd2Vzb21lUGxheWVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZVBsYXllciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzM2UyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXworCisjZGVmaW5lIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJIVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTZkRlbGVnYXRlOworCitzdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgU2ZEZWxlZ2F0ZTsKKworICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRCwKKyAgICAgICAgUkVBRElORywKKyAgICAgICAgRElTQ09OTkVDVElORworICAgIH07CisKKyAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworCisgICAgU3RhdGUgbVN0YXRlOworCisgICAgU2ZEZWxlZ2F0ZSAqbURlbGVnYXRlOworCisgICAgQVN0cmluZyBtVVJJOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1IZWFkZXJzOworCisgICAgb2ZmNjRfdCBtQ3VycmVudE9mZnNldDsKKworICAgIC8vIEFueSBjb25uZWN0aW9uIGVycm9yIG9yIHRoZSByZXN1bHQgb2YgYSByZWFkIG9wZXJhdGlvbgorICAgIC8vIChmb3IgdGhlIGxhdHR0ZXIgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIGlmIHN1Y2Nlc3NmdWwpLgorICAgIHNzaXplX3QgbUlPUmVzdWx0OworCisgICAgaW50NjRfdCBtQ29udGVudFNpemU7CisKKyAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBkaXNjb25uZWN0X2woKTsKKworICAgIHN0YXR1c190IGNvbm5lY3RfbCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgc3RhdGljIHZvaWQgSW5pdGlhdGVSZWFkKAorICAgICAgICAgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgaW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCisgICAgICAgICAgICBpbnQ2NF90IGNvbnRlbnRTaXplLCBjb25zdCBjaGFyICpjb250ZW50VHlwZSk7CisKKyAgICB2b2lkIG9uQ29ubmVjdGlvbkZhaWxlZChzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgb25SZWFkQ29tcGxldGVkKHNzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENocm9taXVtSFRUUERhdGFTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgKaW5kZXggOTg4MWNjMS4uYjRlNGFmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCkBAIC00NSw3ICs0NSw3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAKICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gbU9yaWdpbmFsRXh0cmFjdG9yOwotICAgIERlY3J5cHRIYW5kbGUqIG1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQqIG1Ecm1NYW5hZ2VyQ2xpZW50OwogCiAgICAgRFJNRXh0cmFjdG9yKGNvbnN0IERSTUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdmYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEhUVFBfQkFTRV9IXworCisjZGVmaW5lIEhUVFBfQkFTRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSFRUUEJhc2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxCisgICAgfTsKKworICAgIEhUVFBCYXNlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IDApID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGJhbmR3aWR0aCBjb3VsZCBzdWNjZXNzZnVsbHkgYmUgZXN0aW1hdGVkLAorICAgIC8vIGZhbHNlIG90aGVyd2lzZS4KKyAgICB2aXJ0dWFsIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2Jwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2Jwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7CisKKyAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisKK3ByaXZhdGU6CisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgeworICAgICAgICBpbnQ2NF90IG1EZWxheVVzOworICAgICAgICBzaXplX3QgbU51bUJ5dGVzOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OworICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7CisgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga01pbkJhbmR3aWR0aENvbGxlY3RGcmVxTXMgPSAxMDAwLCAgIC8vIDEgc2Vjb25kCisgICAgICAgIGtNYXhCYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gNjAwMDAsICAvLyBvbmUgbWludXRlCisgICAgfTsKKworICAgIGludDY0X3QgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzOworICAgIGludDMyX3QgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzOworICAgIGludDMyX3QgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXM7CisKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSFRUUF9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0xpdmVTZXNzaW9uLmgKaW5kZXggM2ZlNWQ0ZS4uOTlhYmU2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTGl2ZVNlc3Npb24uaApAQCAtMjAsMTMgKzIwLDE1IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKIHN0cnVjdCBMaXZlRGF0YVNvdXJjZTsKIHN0cnVjdCBNM1VQYXJzZXI7Ci1zdHJ1Y3QgTnVIVFRQRGF0YVNvdXJjZTsKK3N0cnVjdCBIVFRQQmFzZTsKIAogc3RydWN0IExpdmVTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM3LDcgKzM5LDEwIEBACiAKICAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CiAKLSAgICB2b2lkIGNvbm5lY3QoY29uc3QgY2hhciAqdXJsKTsKKyAgICB2b2lkIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOworCiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICAvLyBCbG9ja3MgdW50aWwgc2VlayBpcyBjb21wbGV0ZS4KQEAgLTc1LDkgKzgwLDExIEBACiAKICAgICBzcDxMaXZlRGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAKLSAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtSFRUUERhdGFTb3VyY2U7CisgICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKIAogICAgIEFTdHJpbmcgbU1hc3RlclVSTDsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOworCiAgICAgVmVjdG9yPEJhbmR3aWR0aEl0ZW0+IG1CYW5kd2lkdGhJdGVtczsKIAogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPEFCdWZmZXI+ID4gbUFFU0tleUZvclVSSTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCmluZGV4IGVmNzFiOGYuLmM4M2Q5ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaApAQCAtMzksMTEgKzM5LDYgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKLSAgICBzdGF0aWMgYm9vbCBnZXRfbXAzX2ZyYW1lX3NpemUoCi0gICAgICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBOVUxMLCBpbnQgKm91dF9jaGFubmVscyA9IE5VTEwsCi0gICAgICAgICAgICBpbnQgKm91dF9iaXRyYXRlID0gTlVMTCk7Ci0KIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDA0ZThhNmEuLjNiZDRjN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTU3LDcgKzU3LDcgQEAKICAgICB9OwogCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgYm9vbCBtSGF2ZU1ldGFkYXRhOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSGFzVmlkZW87CiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwpAQCAtOTAsNiArOTAsOCBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0hlYWRlcihvZmY2NF90IGRhdGFfb2Zmc2V0LCBvZmY2NF90IGRhdGFfc2l6ZSk7CiAKKyAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOworCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiAgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCAwMjI4MDRjLi4yZDZjYjg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTM3LDkgKzM3LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogRHJtSW5pdGlhbGl6YXRpb24oKTsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgICBzaXplX3QgY2FjaGVkU2l6ZSgpOwpAQCAtNDcsNiArNTAsMTIgQEAKIAogICAgIHZvaWQgcmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwogCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgb25seSBpZiB0aGUKKyAgICAvLyBkYXRhIHNvdXJjZSBpcyBIVFRQLWJhc2VkOyBvdGhlcndpc2UsIEVSUk9SX1VOU1VQUE9SVEVECisgICAgLy8gaXMgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKKyAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdUNhY2hlZFNvdXJjZTIoKTsKIApAQCAtOTMsNyArMTAyLDkgQEAKICAgICBzdGF0dXNfdCBzZWVrSW50ZXJuYWxfbChvZmY2NF90IG9mZnNldCk7CiAKICAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cyk7Ci0gICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCA9IGZhbHNlKTsKKworICAgIHZvaWQgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKAorICAgICAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCA9IGZhbHNlLCBib29sIGZvcmNlID0gZmFsc2UpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVDYWNoZWRTb3VyY2UyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCmluZGV4IDBkNjgyMzQuLmMyNjViM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCkBAIC0xOCwyOCArMTgsMjQgQEAKIAogI2RlZmluZSBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlICJIVFRQU3RyZWFtLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBOdUhUVFBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotICAgIGVudW0gRmxhZ3MgewotICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCi0gICAgICAgIGtGbGFnSW5jb2duaXRvID0gMQotICAgIH07CitzdHJ1Y3QgTnVIVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7CiAgICAgTnVIVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOwogCi0gICAgc3RhdHVzX3QgY29ubmVjdCgKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IDApOwogCi0gICAgdm9pZCBkaXNjb25uZWN0KCk7CisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKQEAgLTQ3LDE0ICs0MywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCi0gICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICAgIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2Jwcyk7Ci0KLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKCk7Ci0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKIAorICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVIVFRQRGF0YVNvdXJjZSgpOwogCkBAIC02NSwxMSArNTksNiBAQAogICAgICAgICBDT05ORUNURUQKICAgICB9OwogCi0gICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKLSAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKLSAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKLSAgICB9OwotCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICB1aW50MzJfdCBtRmxhZ3M7CkBAIC04OSwxNyArNzgsMTMgQEAKICAgICBib29sIG1Db250ZW50TGVuZ3RoVmFsaWQ7CiAgICAgYm9vbCBtSGFzQ2h1bmtlZFRyYW5zZmVyRW5jb2Rpbmc7CiAKKyAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKKwogICAgIC8vIFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgY3VycmVudCBjaHVuayBiZWZvcmUgYW55IHN1YnNlcXVlbnQKICAgICAvLyBjaHVuayBoZWFkZXIgKG9yIC0xIGlmIG5vIG1vcmUgY2h1bmtzKS4KICAgICBzc2l6ZV90IG1DaHVua0RhdGFCeXRlc0xlZnQ7CiAKLSAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKLSAgICBzaXplX3QgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKLSAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOwotICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOwotICAgIGludDY0X3QgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzOwotCi0gICAgRGVjcnlwdEhhbmRsZSAqbURlY3J5cHRIYW5kbGU7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAKICAgICBzdGF0dXNfdCBjb25uZWN0KApAQCAtMTE1LDcgKzEwMCw2IEBACiAgICAgc3NpemVfdCBpbnRlcm5hbFJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwotICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CiAKICAgICBzdGF0aWMgdm9pZCBNYWtlRnVsbEhlYWRlcnMoCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmluZGV4IDJmOTVkZTkuLmY0NGUwYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICAgICAgdWludDMyX3QgKmRlY29kaW5nVGltZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMKTsKIAogICAgIGVudW0gewpAQCAtMTA3LDYgKzEwNywxMiBAQAogICAgIHVpbnQzMl90IG1UaW1lVG9TYW1wbGVDb3VudDsKICAgICB1aW50MzJfdCAqbVRpbWVUb1NhbXBsZTsKIAorICAgIHN0cnVjdCBTYW1wbGVUaW1lRW50cnkgeworICAgICAgICB1aW50MzJfdCBtU2FtcGxlSW5kZXg7CisgICAgICAgIHVpbnQzMl90IG1Db21wb3NpdGlvblRpbWU7CisgICAgfTsKKyAgICBTYW1wbGVUaW1lRW50cnkgKm1TYW1wbGVUaW1lRW50cmllczsKKwogICAgIHVpbnQzMl90ICptQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOwogICAgIHNpemVfdCBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOwogCkBAIC0xMzAsNiArMTM2LDEwIEBACiAKICAgICB1aW50MzJfdCBnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpIGNvbnN0OwogCisgICAgc3RhdGljIGludCBDb21wYXJlSW5jcmVhc2luZ1RpbWUoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworCisgICAgdm9pZCBidWlsZFNhbXBsZUVudHJpZXNUYWJsZSgpOworCiAgICAgU2FtcGxlVGFibGUoY29uc3QgU2FtcGxlVGFibGUgJik7CiAgICAgU2FtcGxlVGFibGUgJm9wZXJhdG9yPShjb25zdCBTYW1wbGVUYWJsZSAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2QyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX1NPRlRfT01YX0NPTVBPTkVOVF9IXworCisjZGVmaW5lIFNJTVBMRV9TT0ZUX09NWF9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgIlNvZnRPTVhDb21wb25lbnQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyOworCitzdHJ1Y3QgU2ltcGxlU29mdE9NWENvbXBvbmVudCA6IHB1YmxpYyBTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKTsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IEJ1ZmZlckluZm8geworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUhlYWRlcjsKKyAgICAgICAgYm9vbCBtT3duZWRCeVVzOworICAgIH07CisKKyAgICBzdHJ1Y3QgUG9ydEluZm8geworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIG1EZWY7CisgICAgICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVyczsKKyAgICAgICAgTGlzdDxCdWZmZXJJbmZvICo+IG1RdWV1ZTsKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIE5PTkUsCisgICAgICAgICAgICBESVNBQkxJTkcsCisgICAgICAgICAgICBFTkFCTElORywKKyAgICAgICAgfSBtVHJhbnNpdGlvbjsKKyAgICB9OworCisgICAgdm9pZCBhZGRQb3J0KGNvbnN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgJmRlZik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZnZXRQb3J0UXVldWUoT01YX1UzMiBwb3J0SW5kZXgpOworCisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCisgICAgUG9ydEluZm8gKmVkaXRQb3J0SW5mbyhPTVhfVTMyIHBvcnRJbmRleCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2VuZENvbW1hbmQsCisgICAgICAgIGtXaGF0RW1wdHlUaGlzQnVmZmVyLAorICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyLAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8U2ltcGxlU29mdE9NWENvbXBvbmVudD4gPiBtSGFuZGxlcjsKKworICAgIE9NWF9TVEFURVRZUEUgbVN0YXRlOworICAgIE9NWF9TVEFURVRZUEUgbVRhcmdldFN0YXRlOworCisgICAgVmVjdG9yPFBvcnRJbmZvPiBtUG9ydHM7CisKKyAgICBib29sIGlzU2V0UGFyYW1ldGVyQWxsb3dlZCgKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSBjb25zdDsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZW5kQ29tbWFuZCgKKyAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX1UzMiBzaXplLAorICAgICAgICAgICAgT01YX1U4ICpwdHIpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGFsbG9jYXRlQnVmZmVyKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9VMzIgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZnJlZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZmlsbFRoaXNCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRTdGF0ZShPTVhfU1RBVEVUWVBFICpzdGF0ZSk7CisKKyAgICB2b2lkIG9uU2VuZENvbW1hbmQoT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSk7CisgICAgdm9pZCBvbkNoYW5nZVN0YXRlKE9NWF9TVEFURVRZUEUgc3RhdGUpOworICAgIHZvaWQgb25Qb3J0RW5hYmxlKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZSk7CisgICAgdm9pZCBvblBvcnRGbHVzaChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBzZW5kRmx1c2hDb21wbGV0ZSk7CisKKyAgICB2b2lkIGNoZWNrVHJhbnNpdGlvbnMoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNpbXBsZVNvZnRPTVhDb21wb25lbnQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfU09GVF9PTVhfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDg2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9PTVhfQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgU09GVF9PTVhfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0T01YQ29tcG9uZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIFNvZnRPTVhDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdm9pZCBzZXRMaWJIYW5kbGUodm9pZCAqbGliSGFuZGxlKTsKKyAgICB2b2lkICpsaWJIYW5kbGUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdE9NWENvbXBvbmVudCgpOworCisgICAgY29uc3QgY2hhciAqbmFtZSgpIGNvbnN0OworCisgICAgdm9pZCBub3RpZnkoCisgICAgICAgICAgICBPTVhfRVZFTlRUWVBFIGV2ZW50LAorICAgICAgICAgICAgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMiwgT01YX1BUUiBkYXRhKTsKKworICAgIHZvaWQgbm90aWZ5RW1wdHlCdWZmZXJEb25lKE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpOworICAgIHZvaWQgbm90aWZ5RmlsbEJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2VuZENvbW1hbmQoCisgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfVTMyIHBhcmFtLCBPTVhfUFRSIGRhdGEpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX1UzMiBzaXplLAorICAgICAgICAgICAgT01YX1U4ICpwdHIpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGFsbG9jYXRlQnVmZmVyKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9VMzIgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZnJlZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZmlsbFRoaXNCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRTdGF0ZShPTVhfU1RBVEVUWVBFICpzdGF0ZSk7CisKK3ByaXZhdGU6CisgICAgQVN0cmluZyBtTmFtZTsKKyAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICptQ2FsbGJhY2tzOworICAgIE9NWF9DT01QT05FTlRUWVBFICptQ29tcG9uZW50OworCisgICAgdm9pZCAqbUxpYkhhbmRsZTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIFNlbmRDb21tYW5kV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsCisgICAgICAgICAgICBPTVhfVTMyIHBhcmFtLAorICAgICAgICAgICAgT01YX1BUUiBkYXRhKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEdldFBhcmFtZXRlcldyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBwYXJhbXMpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgU2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBHZXRDb25maWdXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwKKyAgICAgICAgICAgIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIFNldENvbmZpZ1dyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBwYXJhbXMpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgR2V0RXh0ZW5zaW9uSW5kZXhXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgVXNlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfVTMyIHNpemUsCisgICAgICAgICAgICBPTVhfVTggKnB0cik7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBBbGxvY2F0ZUJ1ZmZlcldyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX1UzMiBzaXplKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEZyZWVCdWZmZXJXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEVtcHR5VGhpc0J1ZmZlcldyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEZpbGxUaGlzQnVmZmVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgR2V0U3RhdGVXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX1NUQVRFVFlQRSAqc3RhdGUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9NWENvbXBvbmVudCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfT01YX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCAwN2IxZWM4Li5iMDJlZDBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzIsNyArMzIsMTAgQEAKICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCk7CiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgVmlkZW9GcmFtZSAqZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKaW5kZXggYWZmZjgyNC4uMTVjZDRkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCkBAIC01Nyw2ICs1NywxNiBAQAogICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAogICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogCisvLyBHaXZlbiBhbiBNUEVHNCB2aWRlbyBWT0wtaGVhZGVyIGNodW5rIChzdGFydGluZyB3aXRoIDB4MDAgMHgwMCAweDAxIDB4Mj8pCisvLyBwYXJzZSBpdCBhbmQgZmlsbCBpbiBkaW1lbnNpb25zLCByZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCitib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworCitib29sIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBOVUxMLCBpbnQgKm91dF9jaGFubmVscyA9IE5VTEwsCisgICAgICAgIGludCAqb3V0X2JpdHJhdGUgPSBOVUxMLCBpbnQgKm91dF9udW1fc2FtcGxlcyA9IE5VTEwpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFWQ19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IDY0MjgzNWEuLmUxYjk5OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTYwLDcgKzYwLDEwIEBACiAgICAgdmlydHVhbCBpbnQgTGVuZ3RoKGxvbmcgbG9uZyogdG90YWwsIGxvbmcgbG9uZyogYXZhaWxhYmxlKSB7CiAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgICphdmFpbGFibGUgPSAobG9uZyBsb25nKSgoMXVsbCA8PCA2MykgLSAxKTsKKworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAodG90YWwpIHsKQEAgLTg0LDcgKzg3LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0cnVjdCBCbG9ja0l0ZXJhdG9yIHsKLSAgICBCbG9ja0l0ZXJhdG9yKG1rdnBhcnNlcjo6U2VnbWVudCAqc2VnbWVudCwgdW5zaWduZWQgbG9uZyB0cmFja051bSk7CisgICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKTsKIAogICAgIGJvb2wgZW9zKCkgY29uc3Q7CiAKQEAgLTk2LDExICs5OSwxNCBAQAogICAgIGludDY0X3QgYmxvY2tUaW1lVXMoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OworICAgIE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwogICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOwogCi0gICAgbWt2cGFyc2VyOjpDbHVzdGVyICptQ2x1c3RlcjsKKyAgICBjb25zdCBta3ZwYXJzZXI6OkNsdXN0ZXIgKm1DbHVzdGVyOwogICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2tFbnRyeSAqbUJsb2NrRW50cnk7CisgICAgbG9uZyBtQmxvY2tFbnRyeUluZGV4OworCisgICAgdm9pZCBhZHZhbmNlX2woKTsKIAogICAgIEJsb2NrSXRlcmF0b3IoY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKICAgICBCbG9ja0l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKQEAgLTE1MCw3ICsxNTYsNyBAQAogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrSW5kZXgoaW5kZXgpLAogICAgICAgbVR5cGUoT1RIRVIpLAotICAgICAgbUJsb2NrSXRlcihtRXh0cmFjdG9yLT5tU2VnbWVudCwKKyAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci5nZXQoKSwKICAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSksCiAgICAgICBtTkFMU2l6ZUxlbigwKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CkBAIC0xOTksMTEgKzIwNSwxMiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogQmxvY2tJdGVyYXRvcjo6QmxvY2tJdGVyYXRvcigKLSAgICAgICAgbWt2cGFyc2VyOjpTZWdtZW50ICpzZWdtZW50LCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKQotICAgIDogbVNlZ21lbnQoc2VnbWVudCksCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtVHJhY2tOdW0odHJhY2tOdW0pLAogICAgICAgbUNsdXN0ZXIoTlVMTCksCi0gICAgICBtQmxvY2tFbnRyeShOVUxMKSB7CisgICAgICBtQmxvY2tFbnRyeShOVUxMKSwKKyAgICAgIG1CbG9ja0VudHJ5SW5kZXgoMCkgewogICAgIHJlc2V0KCk7CiB9CiAKQEAgLTIxMiw0NSArMjE5LDEwMCBAQAogfQogCiB2b2lkIEJsb2NrSXRlcmF0b3I6OmFkdmFuY2UoKSB7Ci0gICAgd2hpbGUgKCFlb3MoKSkgewotICAgICAgICBpZiAobUJsb2NrRW50cnkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUJsb2NrRW50cnkgPSBtQ2x1c3Rlci0+R2V0TmV4dChtQmxvY2tFbnRyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUNsdXN0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUNsdXN0ZXIgPSBtU2VnbWVudC0+R2V0TmV4dChtQ2x1c3Rlcik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FeHRyYWN0b3ItPm1Mb2NrKTsKKyAgICBhZHZhbmNlX2woKTsKK30KIAotICAgICAgICAgICAgaWYgKGVvcygpKSB7Cit2b2lkIEJsb2NrSXRlcmF0b3I6OmFkdmFuY2VfbCgpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxvbmcgcmVzID0gbUNsdXN0ZXItPkdldEVudHJ5KG1CbG9ja0VudHJ5SW5kZXgsIG1CbG9ja0VudHJ5KTsKKyAgICAgICAgTE9HVigiR2V0RW50cnkgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICBsb25nIGxvbmcgcG9zOworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gcGFyc2UgdGhpcyBjbHVzdGVyIHNvbWUgbW9yZQorCisgICAgICAgICAgICBDSEVDS19FUShyZXMsIG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEwpOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgTE9HVigiUGFyc2UgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJL08gZXJyb3IKKworICAgICAgICAgICAgICAgIExPR0UoIkNsdXN0ZXI6OlBhcnNlIHJldHVybmVkIHJlc3VsdCAlbGQiLCByZXMpOworCisgICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyLT5HZXRGaXJzdCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocmVzID09IDApIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIGNsdXN0ZXIKKworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDbHVzdGVyICpuZXh0Q2x1c3RlcjsKKyAgICAgICAgICAgIHJlcyA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5QYXJzZU5leHQoCisgICAgICAgICAgICAgICAgICAgIG1DbHVzdGVyLCBuZXh0Q2x1c3RlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgTE9HVigiUGFyc2VOZXh0IHJldHVybmVkICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRU9GCisKKyAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlcywgMCk7CisgICAgICAgICAgICBDSEVDSyhuZXh0Q2x1c3RlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKCFuZXh0Q2x1c3Rlci0+RU9TKCkpOworCisgICAgICAgICAgICBtQ2x1c3RlciA9IG5leHRDbHVzdGVyOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgTE9HVigiUGFyc2UgKDIpIHJldHVybmVkICVsZCIsIHJlcyk7CisgICAgICAgICAgICBDSEVDS19HRShyZXMsIDApOworCisgICAgICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1CbG9ja0VudHJ5ICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSA9PSBtVHJhY2tOdW0pIHsKKyAgICAgICAgQ0hFQ0sobUJsb2NrRW50cnkgIT0gTlVMTCk7CisgICAgICAgIENIRUNLKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpICE9IE5VTEwpOworICAgICAgICArK21CbG9ja0VudHJ5SW5kZXg7CisKKyAgICAgICAgaWYgKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUcmFja051bWJlcigpID09IG1UcmFja051bSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQmxvY2tJdGVyYXRvcjo6cmVzZXQoKSB7Ci0gICAgbUNsdXN0ZXIgPSBtU2VnbWVudC0+R2V0Rmlyc3QoKTsKLSAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyLT5HZXRGaXJzdCgpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CiAKLSAgICB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB7Ci0gICAgICAgIGFkdmFuY2UoKTsKLSAgICB9CisgICAgbUNsdXN0ZXIgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0Rmlyc3QoKTsKKyAgICBtQmxvY2tFbnRyeSA9IE5VTEw7CisgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGFkdmFuY2VfbCgpOworICAgIH0gd2hpbGUgKCFlb3MoKSAmJiBibG9jaygpLT5HZXRUcmFja051bWJlcigpICE9IG1UcmFja051bSk7CiB9CiAKIHZvaWQgQmxvY2tJdGVyYXRvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBtQ2x1c3RlciA9IG1TZWdtZW50LT5GaW5kQ2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKLSAgICBtQmxvY2tFbnRyeSA9IG1DbHVzdGVyICE9IE5VTEwgPyBtQ2x1c3Rlci0+R2V0Rmlyc3QoKSA6IE5VTEw7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FeHRyYWN0b3ItPm1Mb2NrKTsKIAotICAgIHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pIHsKLSAgICAgICAgYWR2YW5jZSgpOworICAgIG1DbHVzdGVyID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkZpbmRDbHVzdGVyKHNlZWtUaW1lVXMgKiAxMDAwbGwpOworICAgIG1CbG9ja0VudHJ5ID0gTlVMTDsKKyAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgYWR2YW5jZV9sKCk7CiAgICAgfQorICAgIHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pOwogCiAgICAgd2hpbGUgKCFlb3MoKSAmJiAhbUJsb2NrRW50cnktPkdldEJsb2NrKCktPklzS2V5KCkpIHsKLSAgICAgICAgYWR2YW5jZSgpOworICAgICAgICBhZHZhbmNlX2woKTsKICAgICB9CiB9CiAKQEAgLTI5MSwxNiArMzUzLDYgQEAKICAgICB9CiB9CiAKLSNkZWZpbmUgQkFJTChlcnIpIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoYmlnYnVmKSB7ICAgICAgICAgICBcCi0gICAgICAgICAgICBiaWdidWYtPnJlbGVhc2UoKTsgIFwKLSAgICAgICAgICAgIGJpZ2J1ZiA9IE5VTEw7ICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCi0KIHN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CiAgICAgQ0hFQ0sobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSk7CiAKQEAgLTMxMCwxODEgKzM2MiwzOSBAQAogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CiAKLSAgICBzaXplX3Qgc2l6ZSA9IGJsb2NrLT5HZXRTaXplKCk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBtQmxvY2tJdGVyLmJsb2NrVGltZVVzKCk7Ci0gICAgaW50MzJfdCBpc1N5bmMgPSBibG9jay0+SXNLZXkoKTsKIAotICAgIE1lZGlhQnVmZmVyICpiaWdidWYgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9jay0+R2V0RnJhbWVDb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKGkpOwogCi0gICAgbG9uZyByZXMgPSBibG9jay0+UmVhZCgKLSAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1SZWFkZXIsICh1bnNpZ25lZCBjaGFyICopYmlnYnVmLT5kYXRhKCkpOworICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihmcmFtZS5sZW4pOworICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKIAotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBiaWdidWYtPnJlbGVhc2UoKTsKLSAgICAgICAgYmlnYnVmID0gTlVMTDsKKyAgICAgICAgbG9uZyBuID0gZnJhbWUuUmVhZChtRXh0cmFjdG9yLT5tUmVhZGVyLCAodW5zaWduZWQgY2hhciAqKW1idWYtPmRhdGEoKSk7CisgICAgICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmNsZWFyKCk7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhtYnVmKTsKICAgICB9CiAKICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKIAotICAgIGJpZ2J1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgIGJpZ2J1Zi0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKLQotICAgIHVuc2lnbmVkIGxhY2luZyA9IChibG9jay0+RmxhZ3MoKSA+PiAxKSAmIDM7Ci0KLSAgICBpZiAobGFjaW5nID09IDApIHsKLSAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKGJpZ2J1Zik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBMT0dWKCJsYWNpbmcgPSAldSwgc2l6ZSA9ICVkIiwgbGFjaW5nLCBzaXplKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKWJpZ2J1Zi0+ZGF0YSgpOwotICAgIC8vIGhleGR1bXAoZGF0YSwgc2l6ZSk7Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIEJBSUwoRVJST1JfTUFMRk9STUVEKTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBudW1GcmFtZXMgPSAodW5zaWduZWQpZGF0YVswXSArIDE7Ci0gICAgKytkYXRhOwotICAgIC0tc2l6ZTsKLQotICAgIFZlY3Rvcjx1aW50NjRfdD4gZnJhbWVTaXplczsKLQotICAgIHN3aXRjaCAobGFjaW5nKSB7Ci0gICAgICAgIGNhc2UgMTogIC8vIFhpcGgKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GcmFtZXMgLSAxOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICB1aW50OF90IGJ5dGU7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCQUlMKEVSUk9SX01BTEZPUk1FRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZSA9IGRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICsrZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgLS1zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSArPSBieXRlOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGUgPT0gMHhmZik7Ci0KLSAgICAgICAgICAgICAgICBmcmFtZVNpemVzLnB1c2goZnJhbWVTaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDI6ICAvLyBmaXhlZC1zaXplCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoc2l6ZSAlIG51bUZyYW1lcykgIT0gMCkgewotICAgICAgICAgICAgICAgIEJBSUwoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IHNpemUgLyBudW1GcmFtZXM7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUZyYW1lcyAtIDE7ICsraSkgewotICAgICAgICAgICAgICAgIGZyYW1lU2l6ZXMucHVzaChmcmFtZVNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMzogIC8vIEVCTUwKLSAgICAgICAgewotICAgICAgICAgICAgdWludDY0X3QgbGFzdEZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUZyYW1lcyAtIDE7ICsraSkgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZTsKLQotICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQkFJTChFUlJPUl9NQUxGT1JNRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlID0gZGF0YVswXTsKLSAgICAgICAgICAgICAgICArK2RhdGE7Ci0gICAgICAgICAgICAgICAgLS1zaXplOwotCi0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUxlYWRpbmdaZXJvZXMgPSBjbHooYnl0ZSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZVNpemUgPSBieXRlICYgfigweDgwID4+IG51bUxlYWRpbmdaZXJvZXMpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnVtTGVhZGluZ1plcm9lczsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJBSUwoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IGZyYW1lU2l6ZSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgfD0gZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgKytkYXRhOwotICAgICAgICAgICAgICAgICAgICAtLXNpemU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemVzLnB1c2goZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2hpZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgNyAtIG51bUxlYWRpbmdaZXJvZXMgKyA4ICogbnVtTGVhZGluZ1plcm9lczsKLQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KWZyYW1lU2l6ZSAtICgxbGwgPDwgKHNoaWZ0IC0gMSkpICsgMTsKLQotICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSBsYXN0RnJhbWVTaXplICsgZGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplcy5wdXNoKGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdEZyYW1lU2l6ZSA9IGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0jaWYgMAotICAgIEFTdHJpbmcgb3V0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVTaXplcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LmFwcGVuZChTdHJpbmdQcmludGYoIiVsbHUiLCBmcmFtZVNpemVzLml0ZW1BdChpKSkpOwotICAgIH0KLSAgICBMT0dWKCJzaXplcyA9IFslc10iLCBvdXQuY19zdHIoKSk7Ci0jZW5kaWYKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVTaXplcy5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50NjRfdCBmcmFtZVNpemUgPSBmcmFtZVNpemVzLml0ZW1BdChpKTsKLQotICAgICAgICBpZiAoc2l6ZSA8IGZyYW1lU2l6ZSkgewotICAgICAgICAgICAgQkFJTChFUlJPUl9NQUxGT1JNRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWVTaXplKTsKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOwotICAgICAgICBtZW1jcHkobWJ1Zi0+ZGF0YSgpLCBkYXRhLCBmcmFtZVNpemUpOwotICAgICAgICBtUGVuZGluZ0ZyYW1lcy5wdXNoX2JhY2sobWJ1Zik7Ci0KLSAgICAgICAgZGF0YSArPSBmcmFtZVNpemU7Ci0gICAgICAgIHNpemUgLT0gZnJhbWVTaXplOwotICAgIH0KLQotICAgIHNpemVfdCBvZmZzZXQgPSBiaWdidWYtPnJhbmdlX2xlbmd0aCgpIC0gc2l6ZTsKLSAgICBiaWdidWYtPnNldF9yYW5nZShvZmZzZXQsIHNpemUpOwotCi0gICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKGJpZ2J1Zik7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKLSN1bmRlZiBCQUlMCi0KIHN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpCisgICAgICAgICAgICAmJiAhbUV4dHJhY3Rvci0+aXNMaXZlU3RyZWFtaW5nKCkpIHsKICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAgICAgICAgIG1CbG9ja0l0ZXIuc2VlayhzZWVrVGltZVVzKTsKICAgICB9CkBAIC01ODQsNiArNDk0LDEzIEBACiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSB7CisgICAgb2ZmNjRfdCBzaXplOworICAgIG1Jc0xpdmVTdHJlYW1pbmcgPQorICAgICAgICAobURhdGFTb3VyY2UtPmZsYWdzKCkKKyAgICAgICAgICAgICYgKERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nCisgICAgICAgICAgICAgICAgfCBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkpCisgICAgICAgICYmIG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSzsKKwogICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOwogICAgIGxvbmcgbG9uZyBwb3M7CiAgICAgaWYgKGVibWxIZWFkZXIuUGFyc2UobVJlYWRlciwgcG9zKSA8IDApIHsKQEAgLTU5OCw3ICs1MTUsMTYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkKCk7CisgICAgaWYgKGlzTGl2ZVN0cmVhbWluZygpKSB7CisgICAgICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKKyAgICAgICAgQ0hFQ0tfRVEocmV0LCAwKTsKKworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgQ0hFQ0tfRVEocmV0LCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtU2VnbWVudC0+TG9hZCgpOworICAgIH0KIAogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKQEAgLTYzNSw3ICs1NjEsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzKSB7CisgICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscworICAgICAgICAgICAgJiYgIWlzTGl2ZVN0cmVhbWluZygpKSB7CiAgICAgICAgIGZpbmRUaHVtYm5haWxzKCk7CiAgICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKICAgICB9CkBAIC02NDMsNiArNTcwLDEwIEBACiAgICAgcmV0dXJuIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKIH0KIAorYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtSXNMaXZlU3RyZWFtaW5nOworfQorCiBzdGF0aWMgdm9pZCBhZGRFU0RTRnJvbUF1ZGlvU3BlY2lmaWNJbmZvKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIGNvbnN0IHZvaWQgKmFzaSwgc2l6ZV90IGFzaVNpemUpIHsKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewpAQCAtODAwLDcgKzczMSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcihtU2VnbWVudCwgaW5mby0+bVRyYWNrTnVtKTsKKyAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSk7CiAgICAgICAgIGludDMyX3QgaSA9IDA7CiAgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0gMDsKICAgICAgICAgc2l6ZV90IG1heEJsb2NrU2l6ZSA9IDA7CkBAIC04MDgsNyArNzM5LDExIEBACiAgICAgICAgICAgICBpZiAoaXRlci5ibG9jaygpLT5Jc0tleSgpKSB7CiAgICAgICAgICAgICAgICAgKytpOwogCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IGl0ZXIuYmxvY2soKS0+R2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlci5ibG9jaygpLT5HZXRGcmFtZUNvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUgKz0gaXRlci5ibG9jaygpLT5HZXRGcmFtZShpKS5sZW47CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2l6ZSA+IG1heEJsb2NrU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBtYXhCbG9ja1NpemUgPSBibG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbFRpbWVVcyA9IGl0ZXIuYmxvY2tUaW1lVXMoKTsKQEAgLTgyNyw2ICs3NjIsMTUgQEAKICAgICByZXR1cm4gbWV0YTsKIH0KIAordWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHVpbnQzMl90IHggPSBDQU5fUEFVU0U7CisgICAgaWYgKCFpc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICB4IHw9IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCiBib29sIFNuaWZmTWF0cm9za2EoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IGZhMjBiODQuLjM4ZWJkNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBta3ZwYXJzZXIgewogc3RydWN0IFNlZ21lbnQ7CkBAIC00NSwyNiArNDYsMzQgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NYXRyb3NrYUV4dHJhY3RvcigpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CisgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOwogICAgICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CiAgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOwogICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CiAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKICAgICBEYXRhU291cmNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKKyAgICBib29sIG1Jc0xpdmVTdHJlYW1pbmc7CiAKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKIAorICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CisKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKICAgICBNYXRyb3NrYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA3ZDRiYzZlLi41YmJjMmI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlByb2dyYW0gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CisgICAgUHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CiAKICAgICBib29sIHBhcnNlUElEKAogICAgICAgICAgICAgdW5zaWduZWQgcGlkLCB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLApAQCAtNjMsOCArNjMsMTUgQEAKICAgICAgICAgcmV0dXJuIG1GaXJzdFBUU1ZhbGlkOwogICAgIH0KIAorICAgIHVuc2lnbmVkIG51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1Qcm9ncmFtTnVtYmVyOyB9CisKKyAgICB2b2lkIHVwZGF0ZVByb2dyYW1NYXBQSUQodW5zaWduZWQgcHJvZ3JhbU1hcFBJRCkgeworICAgICAgICBtUHJvZ3JhbU1hcFBJRCA9IHByb2dyYW1NYXBQSUQ7CisgICAgfQorCiBwcml2YXRlOgogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKKyAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CkBAIC0xMDcsNyArMTE0LDcgQEAKICAgICBEaXNjb250aW51aXR5VHlwZSBtUGVuZGluZ0Rpc2NvbnRpbnVpdHk7CiAgICAgc3A8QU1lc3NhZ2U+IG1QZW5kaW5nRGlzY29udGludWl0eUV4dHJhOwogCi0gICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlIG1RdWV1ZTsKKyAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgKm1RdWV1ZTsKIAogICAgIHZvaWQgZmx1c2goKTsKICAgICB2b2lkIHBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKTsKQEAgLTEyNiwxMSArMTMzLDE0IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUFUU1BhcnNlcjo6UHJvZ3JhbTo6UHJvZ3JhbShBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCkKK0FUU1BhcnNlcjo6UHJvZ3JhbTo6UHJvZ3JhbSgKKyAgICAgICAgQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCiAgICAgOiBtUGFyc2VyKHBhcnNlciksCisgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAogICAgICAgbUZpcnN0UFRTKDApIHsKKyAgICBMT0dWKCJuZXcgcHJvZ3JhbSBudW1iZXIgJXUiLCBwcm9ncmFtTnVtYmVyKTsKIH0KIAogYm9vbCBBVFNQYXJzZXI6OlByb2dyYW06OnBhcnNlUElEKApAQCAtMjk5LDcgKzMwOSw3IEBACiB9CiAKIHNwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OlByb2dyYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKLSAgICBzaXplX3QgaW5kZXggPSAodHlwZSA9PSBNUEVHMkFEVFNfQVVESU8pID8gMCA6IDA7CisgICAgc2l6ZV90IGluZGV4ID0gKHR5cGUgPT0gQVVESU8pID8gMCA6IDA7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+Z2V0U291cmNlKHR5cGUpOwpAQCAtMzM4LDE0ICszNDgsNDMgQEAKICAgICAgIG1CdWZmZXIobmV3IEFCdWZmZXIoMTkyICogMTAyNCkpLAogICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKICAgICAgIG1QZW5kaW5nRGlzY29udGludWl0eShESVNDT05USU5VSVRZX05PTkUpLAotICAgICAgbVF1ZXVlKHN0cmVhbVR5cGUgPT0gMHgxYgotICAgICAgICAgICAgICA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6SDI2NCA6IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUFDKSB7CisgICAgICBtUXVldWUoTlVMTCkgewogICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogCisgICAgc3dpdGNoIChtU3RyZWFtVHlwZSkgeworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfSDI2NDoKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpIMjY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQVREUzoKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQUMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMV9BVURJTzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPOgorICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHX0FVRElPKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMV9WSURFTzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX1ZJREVPOgorICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHX1ZJREVPKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHNF9WSURFTzoKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFRzRfVklERU8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKwogICAgIExPR1YoIm5ldyBzdHJlYW0gUElEIDB4JTAyeCwgdHlwZSAweCUwMngiLCBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKIH0KIAogQVRTUGFyc2VyOjpTdHJlYW06On5TdHJlYW0oKSB7CisgICAgZGVsZXRlIG1RdWV1ZTsKKyAgICBtUXVldWUgPSBOVUxMOwogfQogCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKQEAgLTM5Nyw3ICs0MzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBib29sIGlzQVNlZWsgPSAodHlwZSA9PSBESVNDT05USU5VSVRZX1NFRUspOwogCi0gICAgICAgICAgICBtUXVldWUuY2xlYXIoIWlzQVNlZWspOworICAgICAgICAgICAgbVF1ZXVlLT5jbGVhcighaXNBU2Vlayk7CiAKICAgICAgICAgICAgIHVpbnQ2NF90IHJlc3VtZUF0UFRTOwogICAgICAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwKQEAgLTQ0NCw2ICs0ODMsMTIgQEAKIAogICAgIExPR1YoInBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gMHglMDh4IiwgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgpOwogCisgICAgaWYgKHBhY2tldF9zdGFydGNvZGVfcHJlZml4ICE9IDEpIHsKKyAgICAgICAgTE9HVigiU3VwcG9zZWRseSBwYXlsb2FkX3VuaXRfc3RhcnQ9MSB1bml0IGRvZXMgbm90IHN0YXJ0ICIKKyAgICAgICAgICAgICAid2l0aCBzdGFydGNvZGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBDSEVDS19FUShwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCwgMHgwMDAwMDF1KTsKIAogICAgIHVuc2lnbmVkIHN0cmVhbV9pZCA9IGJyLT5nZXRCaXRzKDgpOwpAQCAtNjExLDIyICs2NTYsMjggQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBMT0dWKCJvblBheWxvYWREYXRhIG1TdHJlYW1UeXBlPTB4JTAyeCIsIG1TdHJlYW1UeXBlKTsKIAorICAgIGlmIChtUXVldWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgQ0hFQ0soUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMyk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBtUHJvZ3JhbS0+Y29udmVydFBUU1RvVGltZXN0YW1wKFBUUyk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtUXVldWUuYXBwZW5kRGF0YShkYXRhLCBzaXplLCB0aW1lVXMpOworICAgIHN0YXR1c190IGVyciA9IG1RdWV1ZS0+YXBwZW5kRGF0YShkYXRhLCBzaXplLCB0aW1lVXMpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKLSAgICB3aGlsZSAoKGFjY2Vzc1VuaXQgPSBtUXVldWUuZGVxdWV1ZUFjY2Vzc1VuaXQoKSkgIT0gTlVMTCkgeworICAgIHdoaWxlICgoYWNjZXNzVW5pdCA9IG1RdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoKSkgIT0gTlVMTCkgewogICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1RdWV1ZS5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVF1ZXVlLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR1YoImNyZWF0ZWQgc291cmNlISIpOworICAgICAgICAgICAgICAgIExPR1YoIlN0cmVhbSBQSUQgMHglMDh4IG9mIHR5cGUgMHglMDJ4IG5vdyBoYXMgZGF0YS4iLAorICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKKwogICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKIAogICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ0Rpc2NvbnRpbnVpdHkgIT0gRElTQ09OVElOVUlUWV9OT05FKSB7CkBAIC02MzgsMTMgKzY4OSwxMyBAQAogCiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1RdWV1ZS5nZXRGb3JtYXQoKSAhPSBOVUxMKSB7CisgICAgICAgIH0gZWxzZSBpZiAobVF1ZXVlLT5nZXRGb3JtYXQoKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBBZnRlciBhIGRpc2NvbnRpbnVpdHkgd2UgaW52YWxpZGF0ZSB0aGUgcXVldWUncyBmb3JtYXQKICAgICAgICAgICAgIC8vIGFuZCB3b24ndCBlbnF1ZXVlIGFueSBhY2Nlc3MgdW5pdHMgdG8gdGhlIHNvdXJjZSB1bnRpbAogICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGhhcyByZWVzdGFibGlzaGVkIHRoZSBuZXcgZm9ybWF0LgogCiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUuZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQpAQCAtNjUyLDkgKzcwMywzMCBAQAogfQogCiBzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpTdHJlYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKLSAgICBpZiAoKHR5cGUgPT0gQVZDX1ZJREVPICYmIG1TdHJlYW1UeXBlID09IDB4MWIpCi0gICAgICAgIHx8ICh0eXBlID09IE1QRUcyQURUU19BVURJTyAmJiBtU3RyZWFtVHlwZSA9PSAweDBmKSkgewotICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBWSURFTzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NAorICAgICAgICAgICAgICAgICAgICB8fCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX01QRUcxX1ZJREVPCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfTVBFRzJfVklERU8KKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NUEVHNF9WSURFTykgeworICAgICAgICAgICAgICAgIHJldHVybiBtU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFVRElPOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NUEVHMV9BVURJTworICAgICAgICAgICAgICAgICAgICB8fCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX01QRUcyX0FVRElPCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQVREUykgeworICAgICAgICAgICAgICAgIHJldHVybiBtU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmV0dXJuIE5VTEw7CkBAIC03MjksNyArODAxLDIxIEBACiAKICAgICAgICAgICAgIExPR1YoIiAgICBwcm9ncmFtX21hcF9QSUQgPSAweCUwNHgiLCBwcm9ncmFtTWFwUElEKTsKIAotICAgICAgICAgICAgbVByb2dyYW1zLnB1c2gobmV3IFByb2dyYW0odGhpcywgcHJvZ3JhbU1hcFBJRCkpOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1Qcm9ncmFtcy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxQcm9ncmFtPiAmcHJvZ3JhbSA9IG1Qcm9ncmFtcy5pdGVtQXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0tPm51bWJlcigpID09IHByb2dyYW1fbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW0tPnVwZGF0ZVByb2dyYW1NYXBQSUQocHJvZ3JhbU1hcFBJRCk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1zLnB1c2goCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvZ3JhbSh0aGlzLCBwcm9ncmFtX251bWJlciwgcHJvZ3JhbU1hcFBJRCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04MDUsOCArODkxLDE2IEBACiB9CiAKIHNwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKKyAgICBpbnQgd2hpY2ggPSAtMTsgIC8vIGFueQorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpLT5nZXRTb3VyY2UodHlwZSk7CisgICAgICAgIGNvbnN0IHNwPFByb2dyYW0+ICZwcm9ncmFtID0gbVByb2dyYW1zLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKHdoaWNoID49IDAgJiYgKGludClwcm9ncmFtLT5udW1iZXIoKSAhPSB3aGljaCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gcHJvZ3JhbS0+Z2V0U291cmNlKHR5cGUpOwogCiAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDM5MzZmMDUuLjFlNjQ1MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtNDgsOCArNDgsOCBAQAogICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IGZpbmFsUmVzdWx0KTsKIAogICAgIGVudW0gU291cmNlVHlwZSB7Ci0gICAgICAgIEFWQ19WSURFTywKLSAgICAgICAgTVBFRzJBRFRTX0FVRElPCisgICAgICAgIFZJREVPLAorICAgICAgICBBVURJTwogICAgIH07CiAgICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOwogCkBAIC01OSw2ICs1OSwxNyBAQAogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCiBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICAvLyBGcm9tIElTTy9JRUMgMTM4MTgtMTogMjAwMCAoRSksIFRhYmxlIDItMjkKKyAgICAgICAgU1RSRUFNVFlQRV9NUEVHMV9WSURFTyAgICAgICAgICA9IDB4MDEsCisgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfVklERU8gICAgICAgICAgPSAweDAyLAorICAgICAgICBTVFJFQU1UWVBFX01QRUcxX0FVRElPICAgICAgICAgID0gMHgwMywKKyAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJTyAgICAgICAgICA9IDB4MDQsCisgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQVREUyAgICAgPSAweDBmLAorICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKKyAgICAgICAgU1RSRUFNVFlQRV9IMjY0ICAgICAgICAgICAgICAgICA9IDB4MWIsCisgICAgfTsKKwogICAgIHN0cnVjdCBQcm9ncmFtOwogICAgIHN0cnVjdCBTdHJlYW07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IGRjYWY5ZjcuLmY4YTFkODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIApAQCAtNzksMTEgKzgwLDQ5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRNUEVHQXVkaW9IZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMykgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gdmVyaWZ5IGhlYWRlci4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwdHJbMF0gIT0gMHhmZiB8fCAocHRyWzFdID4+IDUpICE9IDB4MDcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIElEID0gKHB0clsxXSA+PiAzKSAmIDM7CisKKyAgICBpZiAoSUQgPT0gMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyByZXNlcnZlZAorICAgIH0KKworICAgIHVuc2lnbmVkIGxheWVyID0gKHB0clsxXSA+PiAxKSAmIDM7CisKKyAgICBpZiAobGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyByZXNlcnZlZAorICAgIH0KKworICAgIHVuc2lnbmVkIGJpdHJhdGVJbmRleCA9IChwdHJbMl0gPj4gNCk7CisKKyAgICBpZiAoYml0cmF0ZUluZGV4ID09IDB4MGYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gcmVzZXJ2ZWQKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGVJbmRleCA9IChwdHJbMl0gPj4gMikgJiAzOworCisgICAgaWYgKHNhbXBsaW5nUmF0ZUluZGV4ID09IDMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gcmVzZXJ2ZWQKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lVXMpIHsKICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKICAgICAgICAgICAgIHsKICNpZiAwCiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA0IHx8IG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7CkBAIC0xMDUsNyArMTQ0LDQwIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIExPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICZwdHJbc3RhcnRPZmZzZXRdOworICAgICAgICAgICAgICAgIHNpemUgLT0gc3RhcnRPZmZzZXQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKKyAgICAgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAzIHx8IG1lbWNtcCgiXHgwMFx4MDBceDAxIiwgZGF0YSwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSArIDIgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZwdHJbaV0sIDMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQ4LDYgKzIyMCwzMyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkTVBFR0F1ZGlvSGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBNUEVHIGF1ZGlvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3luY3dvcmQgYXQgb2Zmc2V0ICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTAsMTEgKzI4OSwxOCBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbU1vZGUsICh1bnNpZ25lZClBQUMpOwotICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKKyAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKKyAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKKyAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CisgICAgICAgIGNhc2UgTVBFRzRfVklERU86CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpbU1vZGUsICh1bnNpZ25lZClNUEVHX0FVRElPKTsKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIH0KIH0KIApAQCAtNDU1LDQgKzU2MSwzNzEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVChkYXRhKTsKKworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgaW50IHNhbXBsaW5nUmF0ZSwgbnVtQ2hhbm5lbHMsIGJpdHJhdGUsIG51bVNhbXBsZXM7CisgICAgQ0hFQ0soR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsaW5nUmF0ZSwgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtU2FtcGxlcykpOworCisgICAgaWYgKHNpemUgPCBmcmFtZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGZyYW1lU2l6ZSk7CisgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgZGF0YSwgZnJhbWVTaXplKTsKKworICAgIG1lbW1vdmUobUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgZnJhbWVTaXplLAorICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gZnJhbWVTaXplKTsKKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIGZyYW1lU2l6ZSk7CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKGZyYW1lU2l6ZSk7CisgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgIH0KKworICAgIHJldHVybiBhY2Nlc3NVbml0OworfQorCitzdGF0aWMgdm9pZCBFbmNvZGVTaXplMTQodWludDhfdCAqKl9wdHIsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0tfTEUoc2l6ZSwgMHgzZmZmKTsKKworICAgIHVpbnQ4X3QgKnB0ciA9ICpfcHRyOworCisgICAgKnB0cisrID0gMHg4MCB8IChzaXplID4+IDcpOworICAgICpwdHIrKyA9IHNpemUgJiAweDdmOworCisgICAgKl9wdHIgPSBwdHI7Cit9CisKK3N0YXRpYyBzcDxBQnVmZmVyPiBNYWtlTVBFR1ZpZGVvRVNEUyhjb25zdCBzcDxBQnVmZmVyPiAmY3NkKSB7CisgICAgc3A8QUJ1ZmZlcj4gZXNkcyA9IG5ldyBBQnVmZmVyKGNzZC0+c2l6ZSgpICsgMjUpOworCisgICAgdWludDhfdCAqcHRyID0gZXNkcy0+ZGF0YSgpOworICAgICpwdHIrKyA9IDB4MDM7CisgICAgRW5jb2RlU2l6ZTE0KCZwdHIsIDIyICsgY3NkLT5zaXplKCkpOworCisgICAgKnB0cisrID0gMHgwMDsgIC8vIEVTX0lECisgICAgKnB0cisrID0gMHgwMDsKKworICAgICpwdHIrKyA9IDB4MDA7ICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICpwdHIrKyA9IDB4MDQ7CisgICAgRW5jb2RlU2l6ZTE0KCZwdHIsIDE2ICsgY3NkLT5zaXplKCkpOworCisgICAgKnB0cisrID0gMHg0MDsgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMjsgKytpKSB7CisgICAgICAgICpwdHIrKyA9IDB4MDA7CisgICAgfQorCisgICAgKnB0cisrID0gMHgwNTsKKyAgICBFbmNvZGVTaXplMTQoJnB0ciwgY3NkLT5zaXplKCkpOworCisgICAgbWVtY3B5KHB0ciwgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBlc2RzOworfQorCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCk7CisKKyAgICBib29sIHNhd1BpY3R1cmVTdGFydCA9IGZhbHNlOworICAgIGludCBwcHJldlN0YXJ0Q29kZSA9IC0xOworICAgIGludCBwcmV2U3RhcnRDb2RlID0gLTE7CisgICAgaW50IGN1cnJlbnRTdGFydENvZGUgPSAtMTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgKyAzIDwgc2l6ZSkgeworICAgICAgICBpZiAobWVtY21wKCZkYXRhW29mZnNldF0sICJceDAwXHgwMFx4MDEiLCAzKSkgeworICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHBwcmV2U3RhcnRDb2RlID0gcHJldlN0YXJ0Q29kZTsKKyAgICAgICAgcHJldlN0YXJ0Q29kZSA9IGN1cnJlbnRTdGFydENvZGU7CisgICAgICAgIGN1cnJlbnRTdGFydENvZGUgPSBkYXRhW29mZnNldCArIDNdOworCisgICAgICAgIGlmIChjdXJyZW50U3RhcnRDb2RlID09IDB4YjMgJiYgbUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgIHNpemUgLT0gb2Zmc2V0OworICAgICAgICAgICAgKHZvaWQpZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocHJldlN0YXJ0Q29kZSA9PSAweGIzICYmIGN1cnJlbnRTdGFydENvZGUgIT0gMHhiNSkKKyAgICAgICAgICAgICAgICB8fCAocHByZXZTdGFydENvZGUgPT0gMHhiMyAmJiBwcmV2U3RhcnRDb2RlID09IDB4YjUpKSB7CisgICAgICAgICAgICAvLyBzZXFIZWFkZXIgd2l0aG91dC93aXRoIGV4dGVuc2lvbgorCisgICAgICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfR0Uoc2l6ZSwgN3UpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgd2lkdGggPQorICAgICAgICAgICAgICAgICAgICAoZGF0YVs0XSA8PCA0KSB8IGRhdGFbNV0gPj4gNDsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICgoZGF0YVs1XSAmIDB4MGYpIDw8IDgpIHwgZGF0YVs2XTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworCisgICAgICAgICAgICAgICAgTE9HSSgiZm91bmQgTVBFRzIgdmlkZW8gY29kZWMgY29uZmlnICglZCB4ICVkKSIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksIGRhdGEsIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOworICAgICAgICAgICAgICAgIHNpemUgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgICh2b2lkKWZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGVzZHMgPSBNYWtlTVBFR1ZpZGVvRVNEUyhjc2QpOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RVNEUywga1R5cGVFU0RTLCBlc2RzLT5kYXRhKCksIGVzZHMtPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRm9ybWF0ICE9IE5VTEwgJiYgY3VycmVudFN0YXJ0Q29kZSA9PSAweDAwKSB7CisgICAgICAgICAgICAvLyBQaWN0dXJlIHN0YXJ0CisKKyAgICAgICAgICAgIGlmICghc2F3UGljdHVyZVN0YXJ0KSB7CisgICAgICAgICAgICAgICAgc2F3UGljdHVyZVN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgZGF0YSwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIG1lbW1vdmUobUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJyZXR1cm5pbmcgTVBFRyB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NVbml0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldE5leHRDaHVua1NpemUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0YXJ0Q29kZVtdID0gIlx4MDBceDAwXHgwMSI7CisKKyAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgaWYgKG1lbWNtcChrU3RhcnRDb2RlLCBkYXRhLCAzKSkgeworICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIHNpemVfdCBvZmZzZXQgPSAzOworICAgIHdoaWxlIChvZmZzZXQgKyAyIDwgc2l6ZSkgeworICAgICAgICBpZiAoIW1lbWNtcCgmZGF0YVtvZmZzZXRdLCBrU3RhcnRDb2RlLCAzKSkgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiAtRUFHQUlOOworfQorCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpIHsKKyAgICB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgZW51bSB7CisgICAgICAgIFNLSVBfVE9fVklTVUFMX09CSkVDVF9TRVFfU1RBUlQsCisgICAgICAgIEVYUEVDVF9WSVNVQUxfT0JKRUNUX1NUQVJULAorICAgICAgICBFWFBFQ1RfVk9fU1RBUlQsCisgICAgICAgIEVYUEVDVF9WT0xfU1RBUlQsCisgICAgICAgIFdBSVRfRk9SX1ZPUF9TVEFSVCwKKyAgICAgICAgU0tJUF9UT19WT1BfU1RBUlQsCisKKyAgICB9IHN0YXRlOworCisgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBzdGF0ZSA9IFNLSVBfVE9fVklTVUFMX09CSkVDVF9TRVFfU1RBUlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGUgPSBTS0lQX1RPX1ZPUF9TVEFSVDsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoID0gLTEsIGhlaWdodCA9IC0xOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgc3NpemVfdCBjaHVua1NpemU7CisgICAgd2hpbGUgKChjaHVua1NpemUgPSBnZXROZXh0Q2h1bmtTaXplKAorICAgICAgICAgICAgICAgICAgICAmZGF0YVtvZmZzZXRdLCBzaXplIC0gb2Zmc2V0KSkgPiAwKSB7CisgICAgICAgIGJvb2wgZGlzY2FyZCA9IGZhbHNlOworCisgICAgICAgIHVuc2lnbmVkIGNodW5rVHlwZSA9IGRhdGFbb2Zmc2V0ICsgM107CisKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTS0lQX1RPX1ZJU1VBTF9PQkpFQ1RfU0VRX1NUQVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT0gMHhiMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGFueXRoaW5nIGJlZm9yZSB0aGlzIG1hcmtlci4KKworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVYUEVDVF9WSVNVQUxfT0JKRUNUX1NUQVJUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVklTVUFMX09CSkVDVF9TVEFSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShjaHVua1R5cGUsIDB4YjUpOworICAgICAgICAgICAgICAgIHN0YXRlID0gRVhQRUNUX1ZPX1NUQVJUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEVYUEVDVF9WT19TVEFSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MRShjaHVua1R5cGUsIDB4MWYpOworICAgICAgICAgICAgICAgIHN0YXRlID0gRVhQRUNUX1ZPTF9TVEFSVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVk9MX1NUQVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENIRUNLKChjaHVua1R5cGUgJiAweGYwKSA9PSAweDIwKTsKKworICAgICAgICAgICAgICAgIENIRUNLKEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVtvZmZzZXRdLCBjaHVua1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLCAmaGVpZ2h0KSk7CisKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IFdBSVRfRk9SX1ZPUF9TVEFSVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBXQUlUX0ZPUl9WT1BfU1RBUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rVHlwZSA9PSAweGIzIHx8IGNodW5rVHlwZSA9PSAweGI2KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIG9mIFZPUCBvciBWT1Agc3RhcnQuCisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICBMT0dJKCJmb3VuZCBNUEVHNCB2aWRlbyBjb2RlYyBjb25maWcgKCVkIHggJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksIGRhdGEsIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGVzZHMgPSBNYWtlTVBFR1ZpZGVvRVNEUyhjc2QpOworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNkcy0+ZGF0YSgpLCBlc2RzLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNLSVBfVE9fVk9QX1NUQVJUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFNLSVBfVE9fVk9QX1NUQVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT0gMHhiNikgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBkYXRhLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZGF0YSwgJmRhdGFbb2Zmc2V0XSwgc2l6ZSAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgTE9HVigicmV0dXJuaW5nIE1QRUc0IHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rVHlwZSAhPSAweGIzKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjaHVua1NpemU7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlzY2FyZCkgeworICAgICAgICAgICAgKHZvaWQpZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKKyAgICAgICAgICAgIG1lbW1vdmUoZGF0YSwgJmRhdGFbb2Zmc2V0XSwgc2l6ZSAtIG9mZnNldCk7CisgICAgICAgICAgICBzaXplIC09IG9mZnNldDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBjaHVua1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKaW5kZXggMTUzY2ZlNi4uNDAzNWVkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKQEAgLTMxLDcgKzMxLDEwIEBACiBzdHJ1Y3QgRWxlbWVudGFyeVN0cmVhbVF1ZXVlIHsKICAgICBlbnVtIE1vZGUgewogICAgICAgICBIMjY0LAotICAgICAgICBBQUMKKyAgICAgICAgQUFDLAorICAgICAgICBNUEVHX0FVRElPLAorICAgICAgICBNUEVHX1ZJREVPLAorICAgICAgICBNUEVHNF9WSURFTywKICAgICB9OwogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZShNb2RlIG1vZGUpOwogCkBAIC01Nyw2ICs2MCw5IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR0F1ZGlvKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKKyAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUc0VmlkZW8oKTsKIAogICAgIC8vIGNvbnN1bWUgYSBsb2dpY2FsIChjb21wcmVzc2VkKSBhY2Nlc3MgdW5pdCBvZiBzaXplICJzaXplIiwKICAgICAvLyByZXR1cm5zIGl0cyB0aW1lc3RhbXAgaW4gdXMgKG9yIC0xIGlmIG5vIHRpbWUgaW5mb3JtYXRpb24pLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggZGZlYzQ3Zi4uODI1MGFkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPQogICAgICAgICAgICAgICAgIChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpBVkNfVklERU8pLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpWSURFTykuZ2V0KCk7CiAKICAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgIGlmICghaGF2ZUF1ZGlvKSB7CiAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0KICAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6TVBFRzJBRFRTX0FVRElPKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6QVVESU8pLmdldCgpOwogCiAgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCsrbnVtUGFja2V0c1BhcnNlZCA+IDI1MDApIHsKKyAgICAgICAgaWYgKCsrbnVtUGFja2V0c1BhcnNlZCA+IDEwMDAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKaW5kZXggNmUwNjljOC4uMDhhZDZmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKQEAgLTEsNDEgKzEsMjggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLWlmbmVxICgkKEJVSUxEX1dJVEhPVVRfUFYpLHRydWUpCi0jIFNldCB1cCB0aGUgT3BlbkNvcmUgdmFyaWFibGVzLgotaW5jbHVkZSBleHRlcm5hbC9vcGVuY29yZS9Db25maWcubWsKLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChQVl9JTkNMVURFUykKLUxPQ0FMX0NGTEFHUyA6PSAkKFBWX0NGTEFHU19NSU5VU19WSVNJQklMSVRZKQotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUyArPSAkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgXAotCU9NWC5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT01YLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPTVhDb21wb25lbnRCYXNlLmNwcCAgICAgICAgICBcCisgICAgICAgIE9NWE1hc3Rlci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgT01YTm9kZUluc3RhbmNlLmNwcCAgICAgICAgICAgXAotICAgICAgICBPTVhNYXN0ZXIuY3BwCisgICAgICAgIFNpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwICAgIFwKKyAgICAgICAgU29mdE9NWENvbXBvbmVudC5jcHAgICAgICAgICAgXAorICAgICAgICBTb2Z0T01YUGx1Z2luLmNwcCAgICAgICAgICAgICBcCiAKLWlmbmVxICgkKEJVSUxEX1dJVEhPVVRfUFYpLHRydWUpCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICAgICBPTVhQVkNvZGVjc1BsdWdpbi5jcHAKLWVsc2UKLUxPQ0FMX0NGTEFHUyArPSAtRE5PX09QRU5DT1JFCi1lbmRpZgorTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CiAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGlibWVkaWEgICAgICAgICAgICAgICAgXAotICAgICAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICBcCi0gICAgICAgIGxpYnVpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGliY3V0aWxzICAgICAgICAgICAgICAgXAotCi1pZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgICAgIGxpYm9wZW5jb3JlX2NvbW1vbgotZW5kaWYKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgICAgICAgICBcCisgICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYnVpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiAgICAgICBcCiAKIGlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCiAgICAgICAgIExPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQgLWxkbApAQCAtNDksNSArMzYsNiBAQAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKaW5kZXggNTZiMTY5YS4uNTQ1ZTZkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKQEAgLTIwLDIzICsyMCwxOCBAQAogCiAjaW5jbHVkZSAiT01YTWFzdGVyLmgiCiAKKyNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCisKICNpbmNsdWRlIDxkbGZjbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogCi0jaWZuZGVmIE5PX09QRU5DT1JFCi0jaW5jbHVkZSAiT01YUFZDb2RlY3NQbHVnaW4uaCIKLSNlbmRpZgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKICAgICA6IG1WZW5kb3JMaWJIYW5kbGUoTlVMTCkgewogICAgIGFkZFZlbmRvclBsdWdpbigpOwotCi0jaWZuZGVmIE5PX09QRU5DT1JFCi0gICAgYWRkUGx1Z2luKG5ldyBPTVhQVkNvZGVjc1BsdWdpbik7Ci0jZW5kaWYKKyAgICBhZGRQbHVnaW4obmV3IFNvZnRPTVhQbHVnaW4pOwogfQogCiBPTVhNYXN0ZXI6On5PTVhNYXN0ZXIoKSB7CkBAIC00OSw3ICs0NCwxMSBAQAogfQogCiB2b2lkIE9NWE1hc3Rlcjo6YWRkVmVuZG9yUGx1Z2luKCkgewotICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iLCBSVExEX05PVyk7CisgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodGh3LnNvIik7Cit9CisKK3ZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgeworICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBkbG9wZW4obGlibmFtZSwgUlRMRF9OT1cpOwogCiAgICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggN2JhOGQxOC4uZmVlZTFmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtNTgsNiArNTgsNyBAQAogICAgIHZvaWQgKm1WZW5kb3JMaWJIYW5kbGU7CiAKICAgICB2b2lkIGFkZFZlbmRvclBsdWdpbigpOworICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOwogICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CiAgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCA2Y2JkNTk5Li44NDYyOTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YTm9kZUluc3RhbmNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yMzQsNiArMjM0LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCBwYXJhbXMpOworCiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFBWQ29kZWNzUGx1Z2luLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNWJlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiT01YUFZDb2RlY3NQbHVnaW4uaCIKLQotI2luY2x1ZGUgInB2X29teGNvcmUuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1PTVhQVkNvZGVjc1BsdWdpbjo6T01YUFZDb2RlY3NQbHVnaW4oKSB7Ci0gICAgT01YX01hc3RlckluaXQoKTsKLX0KLQotT01YUFZDb2RlY3NQbHVnaW46On5PTVhQVkNvZGVjc1BsdWdpbigpIHsKLSAgICBPTVhfTWFzdGVyRGVpbml0KCk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgT01YUFZDb2RlY3NQbHVnaW46Om1ha2VDb21wb25lbnRJbnN0YW5jZSgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7Ci0gICAgcmV0dXJuIE9NWF9NYXN0ZXJHZXRIYW5kbGUoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9IQU5ETEVUWVBFICo+KGNvbXBvbmVudCksCi0gICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4obmFtZSksCi0gICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfQ0FMTEJBQ0tUWVBFICo+KGNhbGxiYWNrcykpOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWFBWQ29kZWNzUGx1Z2luOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKLSAgICByZXR1cm4gT01YX01hc3RlckZyZWVIYW5kbGUoY29tcG9uZW50KTsKLX0KLQotT01YX0VSUk9SVFlQRSBPTVhQVkNvZGVjc1BsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgT01YX1UzMiBpbmRleCkgewotICAgIHJldHVybiBPTVhfTWFzdGVyQ29tcG9uZW50TmFtZUVudW0obmFtZSwgc2l6ZSwgaW5kZXgpOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWFBWQ29kZWNzUGx1Z2luOjpnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7Ci0gICAgcm9sZXMtPmNsZWFyKCk7Ci0KLSAgICBPTVhfVTMyIG51bVJvbGVzOwotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgT01YX01hc3RlckdldFJvbGVzT2ZDb21wb25lbnQoCi0gICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KG5hbWUpLAotICAgICAgICAgICAgICAgICZudW1Sb2xlcywKLSAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChudW1Sb2xlcyA+IDApIHsKLSAgICAgICAgT01YX1U4ICoqYXJyYXkgPSBuZXcgT01YX1U4ICpbbnVtUm9sZXNdOwotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7Ci0gICAgICAgICAgICBhcnJheVtpXSA9IG5ldyBPTVhfVThbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX1UzMiBudW1Sb2xlczI7Ci0gICAgICAgIGVyciA9IE9NWF9NYXN0ZXJHZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihuYW1lKSwgJm51bVJvbGVzMiwgYXJyYXkpOwotCi0gICAgICAgIENIRUNLX0VRKGVyciwgT01YX0Vycm9yTm9uZSk7Ci0gICAgICAgIENIRUNLX0VRKG51bVJvbGVzLCBudW1Sb2xlczIpOwotCi0gICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IG51bVJvbGVzOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZzggcygoY29uc3QgY2hhciAqKWFycmF5W2ldKTsKLSAgICAgICAgICAgIHJvbGVzLT5wdXNoKHMpOwotCi0gICAgICAgICAgICBkZWxldGVbXSBhcnJheVtpXTsKLSAgICAgICAgICAgIGFycmF5W2ldID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbGV0ZVtdIGFycmF5OwotICAgICAgICBhcnJheSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhQVkNvZGVjc1BsdWdpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMzMjMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhQVkNvZGVjc1BsdWdpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgT01YX1BWX0NPREVDU19QTFVHSU5fSF8KLQotI2RlZmluZSBPTVhfUFZfQ09ERUNTX1BMVUdJTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhQVkNvZGVjc1BsdWdpbiA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKLSAgICBPTVhQVkNvZGVjc1BsdWdpbigpOwotICAgIHZpcnR1YWwgfk9NWFBWQ29kZWNzUGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAotICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOwotCi1wcml2YXRlOgotICAgIE9NWFBWQ29kZWNzUGx1Z2luKGNvbnN0IE9NWFBWQ29kZWNzUGx1Z2luICYpOwotICAgIE9NWFBWQ29kZWNzUGx1Z2luICZvcGVyYXRvcj0oY29uc3QgT01YUFZDb2RlY3NQbHVnaW4gJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9NWF9QVl9DT0RFQ1NfUExVR0lOX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMzBmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDY0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlU29mdE9NWENvbXBvbmVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2ltcGxlU29mdE9NWENvbXBvbmVudDo6U2ltcGxlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxTaW1wbGVTb2Z0T01YQ29tcG9uZW50Pih0aGlzKSksCisgICAgICBtU3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICBtTG9vcGVyLT5zZXROYW1lKG5hbWUpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBtTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworfQorCit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpIHsKKyAgICAvLyBUaGUgbG9vcGVyJ3MgcXVldWUgbWF5IHN0aWxsIGNvbnRhaW4gbWVzc2FnZXMgcmVmZXJlbmNpbmcgdGhpcworICAgIC8vIG9iamVjdC4gTWFrZSBzdXJlIHRob3NlIGFyZSBmbHVzaGVkIGJlZm9yZSByZXR1cm5pbmcgc28gdGhhdAorICAgIC8vIGEgc3Vic2VxdWVudCBkbHVubG9hZCgpIGRvZXMgbm90IHB1bGwgb3V0IHRoZSBydWcgZnJvbSB1bmRlciB1cy4KKworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2VuZENvbW1hbmQoCisgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSkgeworICAgIENIRUNLKGRhdGEgPT0gTlVMTCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJjbWQiLCBjbWQpOworICAgIG1zZy0+c2V0SW50MzIoInBhcmFtIiwgcGFyYW0pOworICAgIG1zZy0+cG9zdCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK2Jvb2wgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3QgeworICAgIGlmIChtU3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIE9NWF9VMzIgcG9ydEluZGV4OworCisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnRJbmRleCA9ICgoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtcyktPm5Qb3J0SW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKKyAgICAgICAgeworICAgICAgICAgICAgcG9ydEluZGV4ID0gKChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXMpLT5uUG9ydEluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnRJbmRleCA9ICgoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zKS0+blBvcnRJbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDSyhwb3J0SW5kZXggPCBtUG9ydHMuc2l6ZSgpKTsKKworICAgIHJldHVybiAhbVBvcnRzLml0ZW1BdChwb3J0SW5kZXgpLm1EZWYuYkVuYWJsZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0soaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKGluZGV4LCBwYXJhbXMpKTsKKworICAgIHJldHVybiBpbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA+PSBtUG9ydHMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGRlZlBhcmFtcy0+blNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBQb3J0SW5mbyAqcG9ydCA9CisgICAgICAgICAgICAgICAgJm1Qb3J0cy5pdGVtQXQoZGVmUGFyYW1zLT5uUG9ydEluZGV4KTsKKworICAgICAgICAgICAgbWVtY3B5KGRlZlBhcmFtcywgJnBvcnQtPm1EZWYsIHNpemVvZihwb3J0LT5tRGVmKSk7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA+PSBtUG9ydHMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGRlZlBhcmFtcy0+blNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQb3J0SW5mbyAqcG9ydCA9CisgICAgICAgICAgICAgICAgJm1Qb3J0cy5lZGl0SXRlbUF0KGRlZlBhcmFtcy0+blBvcnRJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChkZWZQYXJhbXMtPm5CdWZmZXJTaXplICE9IHBvcnQtPm1EZWYubkJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShkZWZQYXJhbXMtPm5CdWZmZXJTaXplLCBwb3J0LT5tRGVmLm5CdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBwb3J0LT5tRGVmLm5CdWZmZXJTaXplID0gZGVmUGFyYW1zLT5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+bkJ1ZmZlckNvdW50QWN0dWFsCisgICAgICAgICAgICAgICAgICAgICE9IHBvcnQtPm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfR0UoZGVmUGFyYW1zLT5uQnVmZmVyQ291bnRBY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bURlZi5uQnVmZmVyQ291bnRNaW4pOworCisgICAgICAgICAgICAgICAgcG9ydC0+bURlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWZQYXJhbXMtPm5CdWZmZXJDb3VudEFjdHVhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOworICAgICgqaGVhZGVyKS0+blNpemUgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICgqaGVhZGVyKS0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICAoKmhlYWRlciktPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgKCpoZWFkZXIpLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgKCpoZWFkZXIpLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKyAgICAoKmhlYWRlciktPnBCdWZmZXIgPSBwdHI7CisgICAgKCpoZWFkZXIpLT5uQWxsb2NMZW4gPSBzaXplOworICAgICgqaGVhZGVyKS0+bkZpbGxlZExlbiA9IDA7CisgICAgKCpoZWFkZXIpLT5uT2Zmc2V0ID0gMDsKKyAgICAoKmhlYWRlciktPnBBcHBQcml2YXRlID0gYXBwUHJpdmF0ZTsKKyAgICAoKmhlYWRlciktPnBQbGF0Zm9ybVByaXZhdGUgPSBOVUxMOworICAgICgqaGVhZGVyKS0+cElucHV0UG9ydFByaXZhdGUgPSBOVUxMOworICAgICgqaGVhZGVyKS0+cE91dHB1dFBvcnRQcml2YXRlID0gTlVMTDsKKyAgICAoKmhlYWRlciktPmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gTlVMTDsKKyAgICAoKmhlYWRlciktPnBNYXJrRGF0YSA9IE5VTEw7CisgICAgKCpoZWFkZXIpLT5uVGlja0NvdW50ID0gMDsKKyAgICAoKmhlYWRlciktPm5UaW1lU3RhbXAgPSAwOworICAgICgqaGVhZGVyKS0+bkZsYWdzID0gMDsKKyAgICAoKmhlYWRlciktPm5PdXRwdXRQb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgKCpoZWFkZXIpLT5uSW5wdXRQb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworCisgICAgQ0hFQ0sobVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCB8fCBwb3J0LT5tRGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSk7CisKKyAgICBDSEVDS19MVChwb3J0LT5tQnVmZmVycy5zaXplKCksIHBvcnQtPm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKworICAgIHBvcnQtPm1CdWZmZXJzLnB1c2goKTsKKworICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9CisgICAgICAgICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KHBvcnQtPm1CdWZmZXJzLnNpemUoKSAtIDEpOworCisgICAgYnVmZmVyLT5tSGVhZGVyID0gKmhlYWRlcjsKKyAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKworICAgIGlmIChwb3J0LT5tQnVmZmVycy5zaXplKCkgPT0gcG9ydC0+bURlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgcG9ydC0+bURlZi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgIGNoZWNrVHJhbnNpdGlvbnMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjphbGxvY2F0ZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSkgeworICAgIE9NWF9VOCAqcHRyID0gbmV3IE9NWF9VOFtzaXplXTsKKworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KKyAgICAgICAgdXNlQnVmZmVyKGhlYWRlciwgcG9ydEluZGV4LCBhcHBQcml2YXRlLCBzaXplLCBwdHIpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGRlbGV0ZVtdIHB0cjsKKyAgICAgICAgcHRyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIENIRUNLKCgqaGVhZGVyKS0+cFBsYXRmb3JtUHJpdmF0ZSA9PSBOVUxMKTsKKyAgICAoKmhlYWRlciktPnBQbGF0Zm9ybVByaXZhdGUgPSBwdHI7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpmcmVlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDS19MVChwb3J0SW5kZXgsIG1Qb3J0cy5zaXplKCkpOworCisgICAgUG9ydEluZm8gKnBvcnQgPSAmbVBvcnRzLmVkaXRJdGVtQXQocG9ydEluZGV4KTsKKworI2lmIDAgLy8gWFhYCisgICAgQ0hFQ0soKG1TdGF0ZSA9PSBPTVhfU3RhdGVJZGxlICYmIG1UYXJnZXRTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpCisgICAgICAgICAgICB8fCBwb3J0LT5tRGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSk7CisjZW5kaWYKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChidWZmZXItPm1IZWFkZXIgPT0gaGVhZGVyKSB7CisgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlci0+cFBsYXRmb3JtUHJpdmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBidWZmZXIncyBkYXRhIHdhcyBhbGxvY2F0ZWQgYnkgdXMuCisgICAgICAgICAgICAgICAgQ0hFQ0soaGVhZGVyLT5wUGxhdGZvcm1Qcml2YXRlID09IGhlYWRlci0+cEJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBoZWFkZXItPnBCdWZmZXI7CisgICAgICAgICAgICAgICAgaGVhZGVyLT5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgICAgIGhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHBvcnQtPm1CdWZmZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgcG9ydC0+bURlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICBjaGVja1RyYW5zaXRpb25zKCk7CisKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soZm91bmQpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXItPmlkKCkpOworICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmZpbGxUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZpbGxUaGlzQnVmZmVyLCBtSGFuZGxlci0+aWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKnN0YXRlID0gbVN0YXRlOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2VuZENvbW1hbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgY21kLCBwYXJhbTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjbWQiLCAmY21kKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGFyYW0iLCAmcGFyYW0pKTsKKworICAgICAgICAgICAgb25TZW5kQ29tbWFuZCgoT01YX0NPTU1BTkRUWVBFKWNtZCwgKE9NWF9VMzIpcGFyYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RW1wdHlUaGlzQnVmZmVyOgorICAgICAgICBjYXNlIGtXaGF0RmlsbFRoaXNCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJoZWFkZXIiLCAodm9pZCAqKikmaGVhZGVyKSk7CisKKyAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CisKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgUG9ydEluZm8gKnBvcnQgPSAmbVBvcnRzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGopOworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXItPm1IZWFkZXIgPT0gaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soKG1zZy0+d2hhdCgpID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJPdXRwdXQpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb25RdWV1ZUZpbGxlZChpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGZvdW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25TZW5kQ29tbWFuZCgKKyAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSkgeworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKKyAgICAgICAgeworICAgICAgICAgICAgb25DaGFuZ2VTdGF0ZSgoT01YX1NUQVRFVFlQRSlwYXJhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgorICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydERpc2FibGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUG9ydEVuYWJsZShwYXJhbSwgY21kID09IE9NWF9Db21tYW5kUG9ydEVuYWJsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3J0Rmx1c2gocGFyYW0sIHRydWUgLyogc2VuZEZsdXNoQ29tcGxldGUgKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvbkNoYW5nZVN0YXRlKE9NWF9TVEFURVRZUEUgc3RhdGUpIHsKKyAgICAvLyBXZSBzaG91bGRuJ3QgYmUgaW4gYSBzdGF0ZSB0cmFuc2l0aW9uIGFscmVhZHkuCisgICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpbVRhcmdldFN0YXRlKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClzdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgICAgICBDSEVDSyhzdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgfHwgc3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUV4ZWN1dGluZzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClzdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvblBvcnRGbHVzaChpLCBmYWxzZSAvKiBzZW5kRmx1c2hDb21wbGV0ZSAqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIHN0YXRlLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgbVRhcmdldFN0YXRlID0gc3RhdGU7CisKKyAgICBjaGVja1RyYW5zaXRpb25zKCk7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25Qb3J0RW5hYmxlKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZSkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworICAgIENIRUNLKHBvcnQtPm1EZWYuYkVuYWJsZWQgPT0gIWVuYWJsZSk7CisKKyAgICBpZiAoIWVuYWJsZSkgeworICAgICAgICBwb3J0LT5tRGVmLmJFbmFibGVkID0gT01YX0ZBTFNFOworICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpESVNBQkxJTkc7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqYnVmZmVyID0gJnBvcnQtPm1CdWZmZXJzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1Pd25lZEJ5VXMpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShidWZmZXItPm1IZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKHBvcnQtPm1EZWYuZURpciwgT01YX0Rpck91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKGJ1ZmZlci0+bUhlYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcG9ydC0+bVF1ZXVlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9ydC0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6RU5BQkxJTkc7CisgICAgfQorCisgICAgY2hlY2tUcmFuc2l0aW9ucygpOworfQorCit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEZsdXNoKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBzZW5kRmx1c2hDb21wbGV0ZSkgeworICAgIGlmIChwb3J0SW5kZXggPT0gT01YX0FMTCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qb3J0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgb25Qb3J0Rmx1c2goaSwgc2VuZEZsdXNoQ29tcGxldGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbmRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kRmx1c2gsIE9NWF9BTEwsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICpidWZmZXIgPSAmcG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoIWJ1ZmZlci0+bU93bmVkQnlVcykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHBvcnQtPm1EZWYuZURpciA9PSBPTVhfRGlySW5wdXQpIHsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShidWZmZXItPm1IZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfRVEocG9ydC0+bURlZi5lRGlyLCBPTVhfRGlyT3V0cHV0KTsKKworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUoYnVmZmVyLT5tSGVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvcnQtPm1RdWV1ZS5jbGVhcigpOworCisgICAgaWYgKHNlbmRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRGbHVzaCwgcG9ydEluZGV4LCBOVUxMKTsKKworICAgICAgICBvblBvcnRGbHVzaENvbXBsZXRlZChwb3J0SW5kZXgpOworICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpjaGVja1RyYW5zaXRpb25zKCkgeworICAgIGlmIChtU3RhdGUgIT0gbVRhcmdldFN0YXRlKSB7CisgICAgICAgIGJvb2wgdHJhbnNpdGlvbkNvbXBsZXRlID0gdHJ1ZTsKKworICAgICAgICBpZiAobVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltVGFyZ2V0U3RhdGUsIChpbnQpT01YX1N0YXRlSWRsZSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgUG9ydEluZm8gJnBvcnQgPSBtUG9ydHMuaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChwb3J0Lm1EZWYuYkVuYWJsZWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwb3J0Lm1EZWYuYlBvcHVsYXRlZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVGFyZ2V0U3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBQb3J0SW5mbyAmcG9ydCA9IG1Qb3J0cy5pdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHBvcnQubURlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZV90IG4gPSBwb3J0Lm1CdWZmZXJzLnNpemUoKTsKKworICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19MRShuLCBwb3J0Lm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBwb3J0Lm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KXBvcnQubURlZi5iUG9wdWxhdGVkLCAoaW50KU9NWF9UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpcG9ydC5tRGVmLmJQb3B1bGF0ZWQsIChpbnQpT01YX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Db21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNpdGlvbkNvbXBsZXRlKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBtVGFyZ2V0U3RhdGU7CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgbVN0YXRlLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBvcnRJbmZvICpwb3J0ID0gJm1Qb3J0cy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChwb3J0LT5tVHJhbnNpdGlvbiA9PSBQb3J0SW5mbzo6RElTQUJMSU5HKSB7CisgICAgICAgICAgICBpZiAocG9ydC0+bUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExPR1YoIlBvcnQgJWQgbm93IGRpc2FibGVkLiIsIGkpOworCisgICAgICAgICAgICAgICAgcG9ydC0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIGksIE5VTEwpOworCisgICAgICAgICAgICAgICAgb25Qb3J0RW5hYmxlQ29tcGxldGVkKGksIGZhbHNlIC8qIGVuYWJsZWQgKi8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBvcnQtPm1UcmFuc2l0aW9uID09IFBvcnRJbmZvOjpFTkFCTElORykgeworICAgICAgICAgICAgaWYgKHBvcnQtPm1EZWYuYlBvcHVsYXRlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIExPR1YoIlBvcnQgJWQgbm93IGVuYWJsZWQuIiwgaSk7CisKKyAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOworICAgICAgICAgICAgICAgIHBvcnQtPm1EZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgaSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBvblBvcnRFbmFibGVDb21wbGV0ZWQoaSwgdHJ1ZSAvKiBlbmFibGVkICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjphZGRQb3J0KGNvbnN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgJmRlZikgeworICAgIENIRUNLX0VRKGRlZi5uUG9ydEluZGV4LCBtUG9ydHMuc2l6ZSgpKTsKKworICAgIG1Qb3J0cy5wdXNoKCk7CisgICAgUG9ydEluZm8gKmluZm8gPSAmbVBvcnRzLmVkaXRJdGVtQXQobVBvcnRzLnNpemUoKSAtIDEpOworICAgIGluZm8tPm1EZWYgPSBkZWY7CisgICAgaW5mby0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRFbmFibGVDb21wbGV0ZWQoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKK30KKworTGlzdDxTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpCdWZmZXJJbmZvICo+ICYKK1NpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldFBvcnRRdWV1ZShPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisgICAgcmV0dXJuIG1Qb3J0cy5lZGl0SXRlbUF0KHBvcnRJbmRleCkubVF1ZXVlOworfQorCitTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpQb3J0SW5mbyAqU2ltcGxlU29mdE9NWENvbXBvbmVudDo6ZWRpdFBvcnRJbmZvKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisgICAgcmV0dXJuICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhDb21wb25lbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU29mdE9NWENvbXBvbmVudDo6U29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogbU5hbWUobmFtZSksCisgICAgICBtQ2FsbGJhY2tzKGNhbGxiYWNrcyksCisgICAgICBtQ29tcG9uZW50KG5ldyBPTVhfQ09NUE9ORU5UVFlQRSksCisgICAgICBtTGliSGFuZGxlKE5VTEwpIHsKKyAgICBtQ29tcG9uZW50LT5uU2l6ZSA9IHNpemVvZigqbUNvbXBvbmVudCk7CisgICAgbUNvbXBvbmVudC0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBtQ29tcG9uZW50LT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIG1Db21wb25lbnQtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBtQ29tcG9uZW50LT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKyAgICBtQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9IHRoaXM7CisgICAgbUNvbXBvbmVudC0+cEFwcGxpY2F0aW9uUHJpdmF0ZSA9IGFwcERhdGE7CisKKyAgICBtQ29tcG9uZW50LT5HZXRDb21wb25lbnRWZXJzaW9uID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5TZW5kQ29tbWFuZCA9IFNlbmRDb21tYW5kV3JhcHBlcjsKKyAgICBtQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgPSBHZXRQYXJhbWV0ZXJXcmFwcGVyOworICAgIG1Db21wb25lbnQtPlNldFBhcmFtZXRlciA9IFNldFBhcmFtZXRlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+R2V0Q29uZmlnID0gR2V0Q29uZmlnV3JhcHBlcjsKKyAgICBtQ29tcG9uZW50LT5TZXRDb25maWcgPSBTZXRDb25maWdXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ID0gR2V0RXh0ZW5zaW9uSW5kZXhXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkdldFN0YXRlID0gR2V0U3RhdGVXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkNvbXBvbmVudFR1bm5lbFJlcXVlc3QgPSBOVUxMOworICAgIG1Db21wb25lbnQtPlVzZUJ1ZmZlciA9IFVzZUJ1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+QWxsb2NhdGVCdWZmZXIgPSBBbGxvY2F0ZUJ1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+RnJlZUJ1ZmZlciA9IEZyZWVCdWZmZXJXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkVtcHR5VGhpc0J1ZmZlciA9IEVtcHR5VGhpc0J1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+RmlsbFRoaXNCdWZmZXIgPSBGaWxsVGhpc0J1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+U2V0Q2FsbGJhY2tzID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgPSBOVUxMOworICAgIG1Db21wb25lbnQtPlVzZUVHTEltYWdlID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5Db21wb25lbnRSb2xlRW51bSA9IE5VTEw7CisKKyAgICAqY29tcG9uZW50ID0gbUNvbXBvbmVudDsKK30KKworU29mdE9NWENvbXBvbmVudDo6flNvZnRPTVhDb21wb25lbnQoKSB7CisgICAgZGVsZXRlIG1Db21wb25lbnQ7CisgICAgbUNvbXBvbmVudCA9IE5VTEw7Cit9CisKK3ZvaWQgU29mdE9NWENvbXBvbmVudDo6c2V0TGliSGFuZGxlKHZvaWQgKmxpYkhhbmRsZSkgeworICAgIENIRUNLKGxpYkhhbmRsZSAhPSBOVUxMKTsKKyAgICBtTGliSGFuZGxlID0gbGliSGFuZGxlOworfQorCit2b2lkICpTb2Z0T01YQ29tcG9uZW50OjpsaWJIYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaWJIYW5kbGU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitjb25zdCBjaGFyICpTb2Z0T01YQ29tcG9uZW50OjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtTmFtZS5jX3N0cigpOworfQorCit2b2lkIFNvZnRPTVhDb21wb25lbnQ6Om5vdGlmeSgKKyAgICAgICAgT01YX0VWRU5UVFlQRSBldmVudCwKKyAgICAgICAgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMiwgT01YX1BUUiBkYXRhKSB7CisgICAgKCptQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnBBcHBsaWNhdGlvblByaXZhdGUsCisgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgIGRhdGExLAorICAgICAgICAgICAgZGF0YTIsCisgICAgICAgICAgICBkYXRhKTsKK30KKwordm9pZCBTb2Z0T01YQ29tcG9uZW50Ojpub3RpZnlFbXB0eUJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgICgqbUNhbGxiYWNrcy0+RW1wdHlCdWZmZXJEb25lKSgKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1Db21wb25lbnQtPnBBcHBsaWNhdGlvblByaXZhdGUsIGhlYWRlcik7Cit9CisKK3ZvaWQgU29mdE9NWENvbXBvbmVudDo6bm90aWZ5RmlsbEJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgICgqbUNhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUpKAorICAgICAgICAgICAgbUNvbXBvbmVudCwgbUNvbXBvbmVudC0+cEFwcGxpY2F0aW9uUHJpdmF0ZSwgaGVhZGVyKTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OlNlbmRDb21tYW5kV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLAorICAgICAgICBPTVhfVTMyIHBhcmFtLAorICAgICAgICBPTVhfUFRSIGRhdGEpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPnNlbmRDb21tYW5kKGNtZCwgcGFyYW0sIGRhdGEpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+Z2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6U2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+c2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0Q29uZmlnV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+Z2V0Q29uZmlnKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6U2V0Q29uZmlnV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+c2V0Q29uZmlnKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0RXh0ZW5zaW9uSW5kZXhXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKKyAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OlVzZUJ1ZmZlcldyYXBwZXIoCisgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPnVzZUJ1ZmZlcihidWZmZXIsIHBvcnRJbmRleCwgYXBwUHJpdmF0ZSwgc2l6ZSwgcHRyKTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OkFsbG9jYXRlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgT01YX1UzMiBzaXplKSB7CisgICAgU29mdE9NWENvbXBvbmVudCAqbWUgPQorICAgICAgICAoU29mdE9NWENvbXBvbmVudCAqKQorICAgICAgICAgICAgKChPTVhfQ09NUE9ORU5UVFlQRSAqKWNvbXBvbmVudCktPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcmV0dXJuIG1lLT5hbGxvY2F0ZUJ1ZmZlcihidWZmZXIsIHBvcnRJbmRleCwgYXBwUHJpdmF0ZSwgc2l6ZSk7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpGcmVlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+ZnJlZUJ1ZmZlcihwb3J0SW5kZXgsIGJ1ZmZlcik7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpFbXB0eVRoaXNCdWZmZXJXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmVtcHR5VGhpc0J1ZmZlcihidWZmZXIpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6RmlsbFRoaXNCdWZmZXJXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmZpbGxUaGlzQnVmZmVyKGJ1ZmZlcik7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpHZXRTdGF0ZVdyYXBwZXIoCisgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmdldFN0YXRlKHN0YXRlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZW5kQ29tbWFuZCgKKyAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSwgT01YX1BUUiBkYXRhKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmFsbG9jYXRlQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgT01YX1UzMiBzaXplKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmcmVlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjFjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhQbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICBjb25zdCBjaGFyICptTGliTmFtZVN1ZmZpeDsKKyAgICBjb25zdCBjaGFyICptUm9sZTsKKworfSBrQ29tcG9uZW50c1tdID0geworICAgIHsgIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAiYWFjZGVjIiwgImF1ZGlvX2RlY29kZXIuYWFjIiB9LAorICAgIHsgIk9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIsICJhbXJkZWMiLCAiYXVkaW9fZGVjb2Rlci5hbXJuYiIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1yd2IiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiwgImF2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJtcGVnNGRlYyIsICJ2aWRlb19kZWNvZGVyLmgyNjMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiwgIm1wZWc0ZGVjIiwgInZpZGVvX2RlY29kZXIubXBlZzQiIH0sCisgICAgeyAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIsICJtcDNkZWMiLCAiYXVkaW9fZGVjb2Rlci5tcDMiIH0sCisgICAgeyAiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJ2b3JiaXNkZWMiLCAiYXVkaW9fZGVjb2Rlci52b3JiaXMiIH0sCisgICAgeyAiT01YLmdvb2dsZS52cHguZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cHgiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1Db21wb25lbnRzID0KKyAgICBzaXplb2Yoa0NvbXBvbmVudHMpIC8gc2l6ZW9mKGtDb21wb25lbnRzWzBdKTsKKworU29mdE9NWFBsdWdpbjo6U29mdE9NWFBsdWdpbigpIHsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YUGx1Z2luOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIExPR1YoIm1ha2VDb21wb25lbnRJbnN0YW5jZSAnJXMnIiwgbmFtZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1Db21wb25lbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrQ29tcG9uZW50c1tpXS5tTmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyBsaWJOYW1lID0gImxpYnN0YWdlZnJpZ2h0X3NvZnRfIjsKKyAgICAgICAgbGliTmFtZS5hcHBlbmQoa0NvbXBvbmVudHNbaV0ubUxpYk5hbWVTdWZmaXgpOworICAgICAgICBsaWJOYW1lLmFwcGVuZCgiLnNvIik7CisKKyAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1cpOworCisgICAgICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgidW5hYmxlIHRvIGRsb3BlbiAlcyIsIGxpYk5hbWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgU29mdE9NWENvbXBvbmVudCAqKCpDcmVhdGVTb2Z0T01YQ29tcG9uZW50RnVuYykoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICosCisgICAgICAgICAgICAgICAgT01YX1BUUiwgT01YX0NPTVBPTkVOVFRZUEUgKiopOworCisgICAgICAgIENyZWF0ZVNvZnRPTVhDb21wb25lbnRGdW5jIGNyZWF0ZVNvZnRPTVhDb21wb25lbnQgPQorICAgICAgICAgICAgKENyZWF0ZVNvZnRPTVhDb21wb25lbnRGdW5jKWRsc3ltKAorICAgICAgICAgICAgICAgICAgICBsaWJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICJfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFIgorICAgICAgICAgICAgICAgICAgICAiUHZQUDE3T01YX0NPTVBPTkVOVFRZUEUiKTsKKworICAgICAgICBpZiAoY3JlYXRlU29mdE9NWENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgICAgICBsaWJIYW5kbGUgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxTb2Z0T01YQ29tcG9uZW50PiBjb2RlYyA9CisgICAgICAgICAgICAoKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQpKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKworICAgICAgICBpZiAoY29kZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgICAgICAgICAgbGliSGFuZGxlID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfQorCisgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gY29kZWMtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgIGxpYkhhbmRsZSA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjb2RlYy0+aW5jU3Ryb25nKHRoaXMpOworICAgICAgICBjb2RlYy0+c2V0TGliSGFuZGxlKGxpYkhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhQbHVnaW46OmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIG1lLT5wcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKTsKKworICAgIHZvaWQgKmxpYkhhbmRsZSA9IG1lLT5saWJIYW5kbGUoKTsKKworICAgIENIRUNLX0VRKG1lLT5nZXRTdHJvbmdDb3VudCgpLCAxKTsKKyAgICBtZS0+ZGVjU3Ryb25nKHRoaXMpOworICAgIG1lID0gTlVMTDsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICBsaWJIYW5kbGUgPSBOVUxMOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgT01YX1UzMiBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBrTnVtQ29tcG9uZW50cykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgIH0KKworICAgIHN0cmNweShuYW1lLCBrQ29tcG9uZW50c1tpbmRleF0ubU5hbWUpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bUNvbXBvbmVudHM7ICsraSkgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtDb21wb25lbnRzW2ldLm1OYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByb2xlcy0+Y2xlYXIoKTsKKyAgICAgICAgcm9sZXMtPnB1c2goU3RyaW5nOChrQ29tcG9uZW50c1tpXS5tUm9sZSkpOworCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2MzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfT01YX1BMVUdJTl9IXworCisjZGVmaW5lIFNPRlRfT01YX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdE9NWFBsdWdpbiA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKKyAgICBTb2Z0T01YUGx1Z2luKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRPTVhQbHVnaW4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX09NWF9QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCA0ZjI4ODU1Li5hNDA0ZjFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgpAQCAtNDU0LDYgKzQ1NSw3IEBACiAgICAgICAgIHsgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvL2F2YyIgfSwKICAgICAgICAgeyAidmlkZW9fZGVjb2Rlci5tcGVnNCIsICJ2aWRlby9tcDR2LWVzIiB9LAogICAgICAgICB7ICJ2aWRlb19kZWNvZGVyLmgyNjMiLCAidmlkZW8vM2dwcCIgfSwKKyAgICAgICAgeyAidmlkZW9fZGVjb2Rlci52cHgiLCAidmlkZW8veC12bmQub24yLnZwOCIgfSwKIAogICAgICAgICAvLyB3ZSBhcHBlYXIgdG8gdXNlIHRoaXMgYXMgYSBzeW5vbnltIHRvIGFtcm5iLgogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFtciIsICJhdWRpby8zZ3BwIiB9LApAQCAtNDYxLDcgKzQ2MywxMCBAQAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFtcm5iIiwgImF1ZGlvLzNncHAiIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuYW1yd2IiLCAiYXVkaW8vYW1yLXdiIiB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpby9tcDRhLWxhdG0iIH0sCi0gICAgICAgIHsgImF1ZGlvX2RlY29kZXIubXAzIiwgImF1ZGlvL21wZWciIH0KKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5tcDMiLCAiYXVkaW8vbXBlZyIgfSwKKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW8vdm9yYmlzIiB9LAorICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXIH0sCisgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcgfSwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa1JvbGVUb01pbWUpIC8gc2l6ZW9mKGtSb2xlVG9NaW1lWzBdKTsgKytpKSB7CkBAIC00ODcsMTQgKzQ5MiwyMCBAQAogICAgICAgICB7ICJhdWRpby8zZ3BwIiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjNfNTAwX0FNUk5CXzEyLjNncCIgfSwKICAgICAgICAgeyAiYXVkaW8vYW1yLXdiIiwKLSAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SV0IvIgotICAgICAgICAgICJOSU5fQU1SLVdCXzE1Ljg1a2Jwc18xNmticHMuYW1yIiB9LAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvIgorICAgICAgICAgICJBSV9BTVItV0JfMTIuNjVrYnBzKDEza2JwcylfMTZraHpfbW9ub19OTUMuYXdiIiB9LAogICAgICAgICB7ICJhdWRpby9tcDRhLWxhdG0iLAotICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvIgotICAgICAgICAgICJXQ19BQUNfODBrYnBzXzMya2h6X1N0ZXJlb18xcENCUl9TU0UubXA0IiB9LAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2NF9BQUMuM2dwIiB9LAogICAgICAgICB7ICJhdWRpby9tcGVnIiwKLSAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzLyIKLSAgICAgICAgICAiV0NfMjU2a2Jwc180NC4xa2h6X21vbm9fQ0JSX0RQQS5tcDMiIH0KKyAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM0NCUi5tcDMiIH0sCisgICAgICAgIHsgImF1ZGlvL3ZvcmJpcyIsCisgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvT0dHLyIKKyAgICAgICAgICAiV2hlbiBZb3UgU2F5IE5vdGhpbmcgQXQgQWxsLm9nZyIgfSwKKyAgICAgICAgeyAidmlkZW8veC12bmQub24yLnZwOCIsCisgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS93ZWJtL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibSIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJmaWxlOi8vL3NkY2FyZC9NMUYxLUFsYXctQUZzcC53YXYiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9NMUYxLW11bGF3LUFGc3Aud2F2IiB9LAogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrTWltZVRvVVJMKSAvIHNpemVvZihrTWltZVRvVVJMWzBdKTsgKytpKSB7CkBAIC02MjYsOCArNjM3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTZWVrVGltZVVzLCByZXF1ZXN0ZWRTZWVrVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHJlcXVlc3RlZFNlZWtUaW1lVXMpOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyk7CisKICAgICAgICAgICAgIGlmIChzZWVrU291cmNlLT5yZWFkKCZidWZmZXIsICZvcHRpb25zKSAhPSBPSykgewogICAgICAgICAgICAgICAgIENIRUNLX0VRKGJ1ZmZlciwgTlVMTCk7CiAgICAgICAgICAgICAgICAgYWN0dWFsU2Vla1RpbWVVcyA9IC0xOwpAQCAtNzQ2LDYgKzc1OSwxMCBAQAogICAgICAgICBjb25zdCBJT01YOjpDb21wb25lbnRJbmZvICZpbmZvID0gKml0OwogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lID0gaW5mby5tTmFtZS5zdHJpbmcoKTsKIAorICAgICAgICBpZiAoc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLmdvb2dsZS4iLCAxMSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgZm9yIChMaXN0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciByb2xlX2l0ID0gaW5mby5tUm9sZXMuYmVnaW4oKTsKICAgICAgICAgICAgICByb2xlX2l0ICE9IGluZm8ubVJvbGVzLmVuZCgpOyArK3JvbGVfaXQpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUgPSAoKnJvbGVfaXQpLnN0cmluZygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggNjgxOWZlZi4uYTAyNTkxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0zMjksNyArMzI5LDcgQEAKICAgICByZXR1cm4gZHN0OwogfQogCi1zdGF0aWMgYm9vbCBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCitzdGF0aWMgYm9vbCBFeHRyYWN0RGltZW5zaW9uc01QRUc0Q29uZmlnKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmY29uZmlnLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CiAgICAgKndpZHRoID0gMDsKICAgICAqaGVpZ2h0ID0gMDsKQEAgLTM1Miw4NyArMzUyLDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBBQml0UmVhZGVyIGJyKCZwdHJbb2Zmc2V0ICsgNF0sIGNvbmZpZy0+c2l6ZSgpIC0gb2Zmc2V0IC0gNCk7Ci0gICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByYW5kb21fYWNjZXNzaWJsZV92b2wKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uID0gYnIuZ2V0Qml0cyg4KTsKLQotICAgIENIRUNLX05FKHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24sCi0gICAgICAgICAgICAgMHgyMXUgLyogRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZSAqLyk7Ci0KLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQ7Ci0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5OwotICAgIGlmIChici5nZXRCaXRzKDEpKSB7Ci0gICAgICAgIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSA9IGJyLmdldEJpdHMoMyk7Ci0gICAgfQotICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pbmZvID0gYnIuZ2V0Qml0cyg0KTsKLSAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm8gPT0gMHgwZiAvKiBleHRlbmRlZCBQQVIgKi8pIHsKLSAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfd2lkdGgKLSAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfaGVpZ2h0Ci0gICAgfQotICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2b2xfY29udHJvbF9wYXJhbWV0ZXJzCi0gICAgICAgIGJyLnNraXBCaXRzKDIpOyAgLy8gY2hyb21hX2Zvcm1hdAotICAgICAgICBici5za2lwQml0cygxKTsgIC8vIGxvd19kZWxheQotICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdmJ2X3BhcmFtZXRlcnMKLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGZpcnN0X2hhbGZfYml0X3JhdGUKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gbGF0dGVyX2hhbGZfYml0X3JhdGUKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMyk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUKLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDExKTsgIC8vIGZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5Ci0gICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICAgICAgfQotICAgIH0KLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSBici5nZXRCaXRzKDIpOwotICAgIENIRUNLX0VRKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSwgMHgwMHUgLyogcmVjdGFuZ3VsYXIgKi8pOwotCi0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgdW5zaWduZWQgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSBici5nZXRCaXRzKDE2KTsKLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLQotICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmaXhlZF92b3BfcmF0ZQotICAgICAgICAvLyByYW5nZSBbMC4udm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24pCi0KLSAgICAgICAgLy8gdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24KLSAgICAgICAgLy8gMiA9PiAwLi4xLCAxIGJpdAotICAgICAgICAvLyAzID0+IDAuLjIsIDIgYml0cwotICAgICAgICAvLyA0ID0+IDAuLjMsIDIgYml0cwotICAgICAgICAvLyA1ID0+IDAuLjQsIDMgYml0cwotICAgICAgICAvLyAuLi4KLQotICAgICAgICBDSEVDS19HVCh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiwgMHUpOwotICAgICAgICAtLXZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOwotCi0gICAgICAgIHVuc2lnbmVkIG51bUJpdHMgPSAwOwotICAgICAgICB3aGlsZSAodm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwKSB7Ci0gICAgICAgICAgICArK251bUJpdHM7Ci0gICAgICAgICAgICB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+Pj0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyLnNraXBCaXRzKG51bUJpdHMpOyAgLy8gZml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50Ci0gICAgfQotCi0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoID0gYnIuZ2V0Qml0cygxMyk7Ci0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOwotICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotCi0gICAgdW5zaWduZWQgaW50ZXJsYWNlZCA9IGJyLmdldEJpdHMoMSk7Ci0KLSAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7Ci0gICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7Ci0KLSAgICBMT0dJKCJWT0wgZGltZW5zaW9ucyA9ICVkeCVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKLQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCisgICAgICAgICAgICAmcHRyW29mZnNldF0sIGNvbmZpZy0+c2l6ZSgpIC0gb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0KTsKIH0KIAotc3A8QUJ1ZmZlcj4gTWFrZU1QRUc0VmlkZW9Db2RlY1NwZWNpZmljRGF0YSgKK3N0YXRpYyBzcDxBQnVmZmVyPiBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKAogICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKICAgICAqd2lkdGggPSAwOwogICAgICpoZWlnaHQgPSAwOwpAQCAtNDQzLDEwICszNjcsMTIgQEAKICAgICBzcDxBQnVmZmVyPiBjb25maWcgPSBkZWNvZGVIZXgodmFsKTsKICAgICBDSEVDSyhjb25maWcgIT0gTlVMTCk7CiAKLSAgICBpZiAoIUV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcihjb25maWcsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgaWYgKCFFeHRyYWN0RGltZW5zaW9uc01QRUc0Q29uZmlnKGNvbmZpZywgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgTE9HSSgiVk9MIGRpbWVuc2lvbnMgPSAlZHglZCIsICp3aWR0aCwgKmhlaWdodCk7CisKICAgICBzaXplX3QgbGVuMSA9IGNvbmZpZy0+c2l6ZSgpICsgR2V0U2l6ZVdpZHRoKGNvbmZpZy0+c2l6ZSgpKSArIDE7CiAgICAgc2l6ZV90IGxlbjIgPSBsZW4xICsgR2V0U2l6ZVdpZHRoKGxlbjEpICsgMSArIDEzOwogICAgIHNpemVfdCBsZW4zID0gbGVuMiArIEdldFNpemVXaWR0aChsZW4yKSArIDEgKyAzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDA3NDA1MTUuLmM0ZTBjZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTIwLDYgKzIwLDggQEAKIAogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtNDQsNiArNDYsNyBAQAogICAgICAgbUNvbm5lY3Rpb25JRCgwKSwKICAgICAgIG1OZXh0Q1NlcSgwKSwKICAgICAgIG1SZWNlaXZlUmVzcG9uc2VFdmVudFBlbmRpbmcoZmFsc2UpIHsKKyAgICBNYWtlVXNlckFnZW50KCZtVXNlckFnZW50KTsKIH0KIAogQVJUU1BDb25uZWN0aW9uOjp+QVJUU1BDb25uZWN0aW9uKCkgewpAQCAtMzc4LDYgKzM4MSw3IEBACiAgICAgcmVwbHktPnNldFN0cmluZygib3JpZ2luYWwtcmVxdWVzdCIsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwogCiAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QpOworICAgIGFkZFVzZXJBZ2VudCgmcmVxdWVzdCk7CiAKICAgICAvLyBGaW5kIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGhlYWRlcnMgYW5kIHRoZSBib2R5LgogICAgIHNzaXplX3QgaSA9IHJlcXVlc3QuZmluZCgiXHJcblxyXG4iKTsKQEAgLTk3OSw0ICs5ODMsMjcgQEAKICNlbmRpZgogfQogCisvLyBzdGF0aWMKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpNYWtlVXNlckFnZW50KEFTdHJpbmcgKnVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudC0+Y2xlYXIoKTsKKyAgICB1c2VyQWdlbnQtPnNldFRvKCJVc2VyLUFnZW50OiBzdGFnZWZyaWdodC8xLjEgKExpbnV4O0FuZHJvaWQgIik7CisKKyNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKKyNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKKyNlbmRpZgorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7CisgICAgdXNlckFnZW50LT5hcHBlbmQodmFsdWUpOworICAgIHVzZXJBZ2VudC0+YXBwZW5kKCIpXHJcbiIpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6YWRkVXNlckFnZW50KEFTdHJpbmcgKnJlcXVlc3QpIGNvbnN0IHsKKyAgICAvLyBGaW5kIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGhlYWRlcnMgYW5kIHRoZSBib2R5LgorICAgIHNzaXplX3QgaSA9IHJlcXVlc3QtPmZpbmQoIlxyXG5cclxuIik7CisgICAgQ0hFQ0tfR0UoaSwgMCk7CisKKyAgICByZXF1ZXN0LT5pbnNlcnQobVVzZXJBZ2VudCwgaSArIDIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKaW5kZXggMGZlY2YzYzYuLmFjMmUzYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApAQCAtODcsNiArODcsOCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1PYnNlcnZlQmluYXJ5TWVzc2FnZTsKIAorICAgIEFTdHJpbmcgbVVzZXJBZ2VudDsKKwogICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uRGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNvbXBsZXRlQ29ubmVjdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xMDYsNiArMTA4LDggQEAKICAgICBib29sIHBhcnNlQXV0aE1ldGhvZChjb25zdCBzcDxBUlRTUFJlc3BvbnNlPiAmcmVzcG9uc2UpOwogICAgIHZvaWQgYWRkQXV0aGVudGljYXRpb24oQVN0cmluZyAqcmVxdWVzdCk7CiAKKyAgICB2b2lkIGFkZFVzZXJBZ2VudChBU3RyaW5nICpyZXF1ZXN0KSBjb25zdDsKKwogICAgIHN0YXR1c190IGZpbmRQZW5kaW5nUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSwgc3NpemVfdCAqaW5kZXgpIGNvbnN0OwogCkBAIC0xMTQsNiArMTE4LDggQEAKICAgICBzdGF0aWMgYm9vbCBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgKngpOwogCisgICAgc3RhdGljIHZvaWQgTWFrZVVzZXJBZ2VudChBU3RyaW5nICp1c2VyQWdlbnQpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUU1BDb25uZWN0aW9uKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MDYyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRpbWVkVGV4dFBhcnNlci5jcHAgICAgICAgXAorICAgICAgICBUaW1lZFRleHRQbGF5ZXIuY3BwCisKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ19JTkNMVURFUzo9IFwKKyAgICAgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFkYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBhcnNlci5jcHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGltZWRUZXh0UGFyc2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1RpbWVkVGV4dFBhcnNlcjo6VGltZWRUZXh0UGFyc2VyKCkKKyAgICA6IG1EYXRhU291cmNlKE5VTEwpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1JbmRleCgwKSB7Cit9CisKK1RpbWVkVGV4dFBhcnNlcjo6flRpbWVkVGV4dFBhcnNlcigpIHsKKyAgICByZXNldCgpOworfQorCitzdGF0dXNfdCBUaW1lZFRleHRQYXJzZXI6OmluaXQoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLCBGaWxlVHlwZSBmaWxlVHlwZSkgeworICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICBtRmlsZVR5cGUgPSBmaWxlVHlwZTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHNjYW5GaWxlKCkpICE9IE9LKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFRpbWVkVGV4dFBhcnNlcjo6cmVzZXQoKSB7CisgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICBtVGV4dFZlY3Rvci5jbGVhcigpOworICAgIG1PZmZzZXQgPSAwOworICAgIG1JbmRleCA9IDA7Cit9CisKKy8vIHNjYW4gdGhlIHRleHQgZmlsZSB0byBnZXQgc3RhcnQvc3RvcCB0aW1lIGFuZCB0aGUKKy8vIG9mZnNldCBvZiBlYWNoIHBpZWNlIG9mIHRleHQgY29udGVudAorc3RhdHVzX3QgVGltZWRUZXh0UGFyc2VyOjpzY2FuRmlsZSgpIHsKKyAgICBpZiAobUZpbGVUeXBlICE9IE9VVF9PRl9CQU5EX0ZJTEVfU1JUKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBvZmY2NF90IG9mZnNldCA9IDA7CisgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICBib29sIGVuZE9mRmlsZSA9IGZhbHNlOworCisgICAgd2hpbGUgKCFlbmRPZkZpbGUpIHsKKyAgICAgICAgVGV4dEluZm8gaW5mbzsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0TmV4dEluU3J0RmlsZUZvcm1hdCgmb2Zmc2V0LCAmc3RhcnRUaW1lVXMsICZpbmZvKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBlbmRPZkZpbGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRleHRWZWN0b3IuYWRkKHN0YXJ0VGltZVVzLCBpbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVGV4dFZlY3Rvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyByZWFkIG9uZSBsaW5lIHN0YXJ0ZWQgZnJvbSAqb2Zmc2V0IGFuZCBzdG9yZSBpdCBpbnRvIGRhdGEuCitzdGF0dXNfdCBUaW1lZFRleHRQYXJzZXI6OnJlYWROZXh0TGluZShvZmY2NF90ICpvZmZzZXQsIEFTdHJpbmcgKmRhdGEpIHsKKyAgICBjaGFyIGNoYXJhY3RlcjsKKworICAgIGRhdGEtPmNsZWFyKCk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzc2l6ZV90IGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsICZjaGFyYWN0ZXIsIDEpKSA8IDEpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgKCpvZmZzZXQpICsrOworCisgICAgICAgIC8vIGEgbGluZSBjb3VsZCBlbmQgd2l0aCBDUiwgTEYgb3IgQ1IgKyBMRgorICAgICAgICBpZiAoY2hhcmFjdGVyID09IDEwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT0gMTMpIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmY2hhcmFjdGVyLCAxKSkgPCAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7IC8vIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAoKm9mZnNldCkgKys7CisKKyAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT0gMTApIHsKKyAgICAgICAgICAgICAgICAoKm9mZnNldCkgLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEtPmFwcGVuZChjaGFyYWN0ZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyogU1JUIGZvcm1hdDoKKyAqICBTdWJ0aXRsZSBudW1iZXIKKyAqICBTdGFydCB0aW1lIC0tPiBFbmQgdGltZQorICogIFRleHQgb2Ygc3VidGl0bGUgKG9uZSBvciBtb3JlIGxpbmVzKQorICogIEJsYW5rIGxpbmUKKyAqCisgKiAuc3J0IGZpbGUgZXhhbXBsZToKKyAqICAxCisgKiAgMDA6MDA6MjAsMDAwIC0tPiAwMDowMDoyNCw0MDAKKyAqICBBbHRvY3VtdWx1cyBjbG91ZHMgb2NjdXIgYmV0d2VlbiBzaXggdGhvdXNhbmQKKyAqCisgKiAgMgorICogIDAwOjAwOjI0LDYwMCAtLT4gMDA6MDA6MjcsODAwCisgKiAgYW5kIHR3ZW50eSB0aG91c2FuZCBmZWV0IGFib3ZlIGdyb3VuZCBsZXZlbC4KKyAqLworc3RhdHVzX3QgVGltZWRUZXh0UGFyc2VyOjpnZXROZXh0SW5TcnRGaWxlRm9ybWF0KAorICAgICAgICBvZmY2NF90ICpvZmZzZXQsIGludDY0X3QgKnN0YXJ0VGltZVVzLCBUZXh0SW5mbyAqaW5mbykgeworICAgIEFTdHJpbmcgZGF0YTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSByZWFkTmV4dExpbmUob2Zmc2V0LCAmZGF0YSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gdG8gc2tpcCB0aGUgZmlyc3QgbGluZQorICAgIGlmICgoZXJyID0gcmVhZE5leHRMaW5lKG9mZnNldCwgJmRhdGEpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBob3VyMSwgaG91cjIsIG1pbjEsIG1pbjIsIHNlYzEsIHNlYzIsIG1zZWMxLCBtc2VjMjsKKyAgICAvLyB0aGUgc3RhcnQgdGltZSBmb3JtYXQgaXM6IGhvdXJzOm1pbnV0ZXM6c2Vjb25kcyxtaWxsaXNlY29uZHMKKyAgICAvLyAwMDowMDoyNCw2MDAgLS0+IDAwOjAwOjI3LDgwMAorICAgIGlmIChzc2NhbmYoZGF0YS5jX3N0cigpLCAiJTAyZDolMDJkOiUwMmQsJTAzZCAtLT4gJTAyZDolMDJkOiUwMmQsJTAzZCIsCisgICAgICAgICAgICAgICAgJmhvdXIxLCAmbWluMSwgJnNlYzEsICZtc2VjMSwgJmhvdXIyLCAmbWluMiwgJnNlYzIsICZtc2VjMikgIT0gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICpzdGFydFRpbWVVcyA9ICgoaG91cjEgKiAzNjAwICsgbWluMSAqIDYwICsgc2VjMSkgKiAxMDAwICsgbXNlYzEpICogMTAwMGxsOworICAgIGluZm8tPmVuZFRpbWVVcyA9ICgoaG91cjIgKiAzNjAwICsgbWluMiAqIDYwICsgc2VjMikgKiAxMDAwICsgbXNlYzIpICogMTAwMGxsOworICAgIGlmIChpbmZvLT5lbmRUaW1lVXMgPD0gKnN0YXJ0VGltZVVzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaW5mby0+b2Zmc2V0ID0gKm9mZnNldDsKKworICAgIGJvb2wgbmVlZE1vcmVEYXRhID0gdHJ1ZTsKKyAgICB3aGlsZSAobmVlZE1vcmVEYXRhKSB7CisgICAgICAgIGlmICgoZXJyID0gcmVhZE5leHRMaW5lKG9mZnNldCwgJmRhdGEpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgbmVlZE1vcmVEYXRhID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZE1vcmVEYXRhKSB7CisgICAgICAgICAgICBkYXRhLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpdCdzIGFuIGVtcHR5IGxpbmUgdXNlZCB0byBzZXBhcmF0ZSB0d28gc3VidGl0bGVzCisgICAgICAgICAgICAgICAgbmVlZE1vcmVEYXRhID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvLT50ZXh0TGVuID0gKm9mZnNldCAtIGluZm8tPm9mZnNldDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgVGltZWRUZXh0UGFyc2VyOjpnZXRUZXh0KAorICAgICAgICBBU3RyaW5nICp0ZXh0LCBpbnQ2NF90ICpzdGFydFRpbWVVcywgaW50NjRfdCAqZW5kVGltZVVzLAorICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgdGV4dC0+Y2xlYXIoKTsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaW50NjRfdCBsYXN0RW5kVGltZVVzID0gbVRleHRWZWN0b3IudmFsdWVBdChtVGV4dFZlY3Rvci5zaXplKCkgLSAxKS5lbmRUaW1lVXM7CisgICAgICAgIGludDY0X3QgZmlyc3RTdGFydFRpbWVVcyA9IG1UZXh0VmVjdG9yLmtleUF0KDApOworCisgICAgICAgIGlmIChzZWVrVGltZVVzIDwgMCB8fCBzZWVrVGltZVVzID4gbGFzdEVuZFRpbWVVcykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfSBlbHNlIGlmIChzZWVrVGltZVVzIDwgZmlyc3RTdGFydFRpbWVVcykgeworICAgICAgICAgICAgbUluZGV4ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGJpbmFyeSBzZWFyY2gKKyAgICAgICAgICAgIHNzaXplX3QgbG93ID0gMDsKKyAgICAgICAgICAgIHNzaXplX3QgaGlnaCA9IG1UZXh0VmVjdG9yLnNpemUoKSAtIDE7CisgICAgICAgICAgICBzc2l6ZV90IG1pZCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnJUaW1lVXM7CisKKyAgICAgICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgeworICAgICAgICAgICAgICAgIG1pZCA9IGxvdyArIChoaWdoIC0gbG93KS8yOworICAgICAgICAgICAgICAgIGN1cnJUaW1lVXMgPSBtVGV4dFZlY3Rvci5rZXlBdChtaWQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBkaWZmID0gY3VyclRpbWVVcyAtIHNlZWtUaW1lVXM7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGhpZ2ggPT0gbWlkICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2Vla1RpbWVVcyA8IG1UZXh0VmVjdG9yLmtleUF0KGhpZ2gpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSW5kZXggPSBtaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUZXh0SW5mbyBpbmZvID0gbVRleHRWZWN0b3IudmFsdWVBdChtSW5kZXgpOworICAgICpzdGFydFRpbWVVcyA9IG1UZXh0VmVjdG9yLmtleUF0KG1JbmRleCk7CisgICAgKmVuZFRpbWVVcyA9IGluZm8uZW5kVGltZVVzOworICAgIG1JbmRleCArKzsKKworICAgIGNoYXIgKnN0ciA9IG5ldyBjaGFyW2luZm8udGV4dExlbl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoaW5mby5vZmZzZXQsIHN0ciwgaW5mby50ZXh0TGVuKSA8IGluZm8udGV4dExlbikgeworICAgICAgICBkZWxldGVbXSBzdHI7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICB0ZXh0LT5hcHBlbmQoc3RyLCBpbmZvLnRleHRMZW4pOworICAgIGRlbGV0ZVtdIHN0cjsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3NzRjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQYXJzZXIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSU1FRF9URVhUX1BBUlNFUl9IXworCisjZGVmaW5lIFRJTUVEX1RFWFRfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2U7CisKK2NsYXNzIFRpbWVkVGV4dFBhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBUaW1lZFRleHRQYXJzZXIoKTsKKyAgICB2aXJ0dWFsIH5UaW1lZFRleHRQYXJzZXIoKTsKKworICAgIGVudW0gRmlsZVR5cGUgeworICAgICAgICBPVVRfT0ZfQkFORF9GSUxFX1NSVCA9IDEsCisgICAgfTsKKworICAgIHN0YXR1c190IGdldFRleHQoQVN0cmluZyAqdGV4dCwgaW50NjRfdCAqc3RhcnRUaW1lVXMsIGludDY0X3QgKmVuZFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHN0YXR1c190IGluaXQoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsIEZpbGVUeXBlIGZpbGVUeXBlKTsKKyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisKKyAgICBzdHJ1Y3QgVGV4dEluZm8geworICAgICAgICBpbnQ2NF90IGVuZFRpbWVVczsKKyAgICAgICAgLy8gdGhlIG9mZnNldCBvZiB0aGUgdGV4dCBpbiB0aGUgb3JpZ2luYWwgZmlsZQorICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgaW50IHRleHRMZW47CisgICAgfTsKKworICAgIGludCBtSW5kZXg7CisgICAgRmlsZVR5cGUgbUZpbGVUeXBlOworCisgICAgLy8gdGhlIGtleSBpbmRpY2F0ZWQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHRleHQKKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBUZXh0SW5mbz4gbVRleHRWZWN0b3I7CisKKyAgICBzdGF0dXNfdCBnZXROZXh0SW5TcnRGaWxlRm9ybWF0KAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBpbnQ2NF90ICpzdGFydFRpbWVVcywgVGV4dEluZm8gKmluZm8pOworICAgIHN0YXR1c190IHJlYWROZXh0TGluZShvZmY2NF90ICpvZmZzZXQsIEFTdHJpbmcgKmRhdGEpOworCisgICAgc3RhdHVzX3Qgc2NhbkZpbGUoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRpbWVkVGV4dFBhcnNlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFRJTUVEX1RFWFRfUEFSU0VSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiYjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCkBAIC0wLDAgKzEsMzQ3IEBACisgLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVGltZWRUZXh0UGxheWVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgiCisjaW5jbHVkZSAiVGltZWRUZXh0UGxheWVyLmgiCisjaW5jbHVkZSAiVGltZWRUZXh0UGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFRpbWVkVGV4dEV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgeworICAgIFRpbWVkVGV4dEV2ZW50KAorICAgICAgICAgICAgVGltZWRUZXh0UGxheWVyICpwbGF5ZXIsCisgICAgICAgICAgICB2b2lkIChUaW1lZFRleHRQbGF5ZXI6OiptZXRob2QpKCkpCisgICAgICAgIDogbVBsYXllcihwbGF5ZXIpLAorICAgICAgICAgIG1NZXRob2QobWV0aG9kKSB7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGltZWRUZXh0RXZlbnQoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKKyAgICAgICAgKG1QbGF5ZXItPiptTWV0aG9kKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBUaW1lZFRleHRQbGF5ZXIgKm1QbGF5ZXI7CisgICAgdm9pZCAoVGltZWRUZXh0UGxheWVyOjoqbU1ldGhvZCkoKTsKKworICAgIFRpbWVkVGV4dEV2ZW50KGNvbnN0IFRpbWVkVGV4dEV2ZW50ICYpOworICAgIFRpbWVkVGV4dEV2ZW50ICZvcGVyYXRvcj0oY29uc3QgVGltZWRUZXh0RXZlbnQgJik7Cit9OworCitUaW1lZFRleHRQbGF5ZXI6OlRpbWVkVGV4dFBsYXllcigKKyAgICAgICAgQXdlc29tZVBsYXllciAqb2JzZXJ2ZXIsCisgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICBUaW1lZEV2ZW50UXVldWUgKnF1ZXVlKQorICAgIDogbVNvdXJjZShOVUxMKSwKKyAgICAgIG1PdXRPZkJhbmRTb3VyY2UoTlVMTCksCisgICAgICBtU2Vla1RpbWVVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1UZXh0RXZlbnRQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1RdWV1ZShxdWV1ZSksCisgICAgICBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgbU9ic2VydmVyKG9ic2VydmVyKSwKKyAgICAgIG1UZXh0QnVmZmVyKE5VTEwpLAorICAgICAgbVRleHRQYXJzZXIoTlVMTCksCisgICAgICBtVGV4dFR5cGUoa05vVGV4dCkgeworICAgIG1UZXh0RXZlbnQgPSBuZXcgVGltZWRUZXh0RXZlbnQodGhpcywgJlRpbWVkVGV4dFBsYXllcjo6b25UZXh0RXZlbnQpOworfQorCitUaW1lZFRleHRQbGF5ZXI6On5UaW1lZFRleHRQbGF5ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgbVRleHRUcmFja1ZlY3Rvci5jbGVhcigpOworICAgIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFRpbWVkVGV4dFBsYXllcjo6c3RhcnQodWludDhfdCBpbmRleCkgeworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBpZiAoaW5kZXggPj0KKyAgICAgICAgICAgIG1UZXh0VHJhY2tWZWN0b3Iuc2l6ZSgpICsgbVRleHRPdXRPZkJhbmRWZWN0b3Iuc2l6ZSgpKSB7CisgICAgICAgIExPR0UoIkluY29ycmVjdCB0ZXh0IHRyYWNrIGluZGV4OiAlZCIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5kZXggPCBtVGV4dFRyYWNrVmVjdG9yLnNpemUoKSkgeyAvLyBzdGFydCBhbiBpbi1iYW5kIHRleHQKKyAgICAgICAgbVNvdXJjZSA9IG1UZXh0VHJhY2tWZWN0b3IuaXRlbUF0KGluZGV4KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbVRleHRUeXBlID0ga0luQmFuZFRleHQ7CisgICAgfSBlbHNlIHsgLy8gc3RhcnQgYW4gb3V0LW9mLWJhbmQgdGV4dAorICAgICAgICBPdXRPZkJhbmRUZXh0IHRleHQgPQorICAgICAgICAgICAgbVRleHRPdXRPZkJhbmRWZWN0b3IuaXRlbUF0KGluZGV4IC0gbVRleHRUcmFja1ZlY3Rvci5zaXplKCkpOworCisgICAgICAgIG1PdXRPZkJhbmRTb3VyY2UgPSB0ZXh0LnNvdXJjZTsKKyAgICAgICAgVGltZWRUZXh0UGFyc2VyOjpGaWxlVHlwZSBmaWxlVHlwZSA9IHRleHQudHlwZTsKKworICAgICAgICBpZiAobVRleHRQYXJzZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbVRleHRQYXJzZXIgPSBuZXcgVGltZWRUZXh0UGFyc2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmICgoZXJyID0gbVRleHRQYXJzZXItPmluaXQobU91dE9mQmFuZFNvdXJjZSwgZmlsZVR5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtVGV4dFR5cGUgPSBrT3V0T2ZCYW5kVGV4dDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uVXM7CisgICAgbU9ic2VydmVyLT5nZXRQb3NpdGlvbigmcG9zaXRpb25Vcyk7CisgICAgc2Vla1RvKHBvc2l0aW9uVXMpOworCisgICAgcG9zdFRleHRFdmVudCgpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6cGF1c2UoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgY2FuY2VsVGV4dEV2ZW50KCk7Cit9CisKK3ZvaWQgVGltZWRUZXh0UGxheWVyOjpyZXN1bWUoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgcG9zdFRleHRFdmVudCgpOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6cmVzZXQoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgLy8gc2VuZCBhbiBlbXB0eSB0ZXh0IHRvIGNsZWFyIHRoZSBzY3JlZW4KKyAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhUKTsKKworICAgIGNhbmNlbFRleHRFdmVudCgpOworCisgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgaWYgKG1UZXh0VHlwZSA9PSBrSW5CYW5kVGV4dCkgeworICAgICAgICBpZiAobVRleHRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVRleHRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1UZXh0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1UZXh0UGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UZXh0UGFyc2VyLmNsZWFyKCk7CisgICAgICAgICAgICBtVGV4dFBhcnNlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRPZkJhbmRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbU91dE9mQmFuZFNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgbU91dE9mQmFuZFNvdXJjZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IFRpbWVkVGV4dFBsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZV91cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtU2Vla2luZyA9IHRydWU7CisgICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOworCisgICAgcG9zdFRleHRFdmVudCgpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBUaW1lZFRleHRQbGF5ZXI6OnNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW50MzJfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PQorICAgICAgICAgICAgKGludCkobVRleHRUcmFja1ZlY3Rvci5zaXplKCkgKyBtVGV4dE91dE9mQmFuZFZlY3Rvci5zaXplKCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6b25UZXh0RXZlbnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmICghbVRleHRFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVGV4dEV2ZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgaWYgKG1TZWVraW5nKSB7CisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLAorICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAobVRleHRUeXBlID09IGtJbkJhbmRUZXh0KSB7CisgICAgICAgICAgICBpZiAobVRleHRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UZXh0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbVRleHRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRleHQuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQpOyAvL2VtcHR5IHRleHQgdG8gY2xlYXIgdGhlIHNjcmVlbgorICAgIH0KKworICAgIGludDY0X3QgcG9zaXRpb25VcywgdGltZVVzOworICAgIG1PYnNlcnZlci0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uVXMpOworCisgICAgaWYgKG1UZXh0VHlwZSA9PSBrSW5CYW5kVGV4dCkgeworICAgICAgICBpZiAobVRleHRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgdWludDhfdCAqdG1wID0gKHVpbnQ4X3QgKikobVRleHRCdWZmZXItPmRhdGEoKSk7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gKCp0bXApIDw8IDggfCAoKih0bXAgKyAxKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKworICAgICAgICAgICAgbVRleHRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1UZXh0QnVmZmVyID0gTlVMTDsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Tb3VyY2UtPnJlYWQoJm1UZXh0QnVmZmVyLCAmb3B0aW9ucykgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXh0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVRleHQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dC5zaXplKCkpOworICAgICAgICAgICAgbVRleHQuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgZW5kVGltZVVzOworICAgICAgICBpZiAobVRleHRQYXJzZXItPmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICZtVGV4dCwgJnRpbWVVcywgJmVuZFRpbWVVcywgJm9wdGlvbnMpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3NlbmQgdGhlIHRleHQgbm93CisgICAgaWYgKHRpbWVVcyA8PSBwb3NpdGlvblVzICsgMTAwMDAwbGwpIHsKKyAgICAgICAgcG9zdFRleHRFdmVudCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBvc3RUZXh0RXZlbnQodGltZVVzIC0gcG9zaXRpb25VcyAtIDEwMDAwMGxsKTsKKyAgICB9Cit9CisKK3ZvaWQgVGltZWRUZXh0UGxheWVyOjpwb3N0VGV4dEV2ZW50KGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtVGV4dEV2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVRleHRFdmVudFBlbmRpbmcgPSB0cnVlOworICAgIG1RdWV1ZS0+cG9zdEV2ZW50V2l0aERlbGF5KG1UZXh0RXZlbnQsIGRlbGF5VXMgPCAwID8gMTAwMDAgOiBkZWxheVVzKTsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6OmNhbmNlbFRleHRFdmVudCgpIHsKKyAgICBtUXVldWUtPmNhbmNlbEV2ZW50KG1UZXh0RXZlbnQtPmV2ZW50SUQoKSk7CisgICAgbVRleHRFdmVudFBlbmRpbmcgPSBmYWxzZTsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6OmFkZFRleHRTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVRleHRUcmFja1ZlY3Rvci5hZGQoc291cmNlKTsKK30KKworc3RhdHVzX3QgVGltZWRUZXh0UGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChrZXkgPT0gS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX0FERF9PVVRfT0ZfQkFORF9TT1VSQ0UpIHsKKyAgICAgICAgU3RyaW5nOCB1cmkgPSByZXF1ZXN0LnJlYWRTdHJpbmc4KCk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisKKyAgICAgICAgLy8gVG8gc3VwcG9ydCBsb2NhbCBzdWJ0aXRsZSBmaWxlIG9ubHkgZm9yIG5vdworICAgICAgICBpZiAoc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmkuc3RyaW5nKCksIDcpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSwgJmhlYWRlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhU291cmNlLT5pbml0Q2hlY2soKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgT3V0T2ZCYW5kVGV4dCB0ZXh0OworICAgICAgICB0ZXh0LnNvdXJjZSA9IGRhdGFTb3VyY2U7CisgICAgICAgIGlmICh1cmkuZ2V0UGF0aEV4dGVuc2lvbigpID09IFN0cmluZzgoIi5zcnQiKSkgeworICAgICAgICAgICAgdGV4dC50eXBlID0gVGltZWRUZXh0UGFyc2VyOjpPVVRfT0ZfQkFORF9GSUxFX1NSVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLmFkZCh0ZXh0KTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyKAorICAgICAgICBpbnQgbXNnLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKworICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgbURhdGEuZnJlZURhdGEoKTsKKyAgICAgICAgICAgICAgICBtRGF0YS53cml0ZShkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnLCAwLCAwLCAmbURhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0IHRvIGNsZWFyIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNzYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVElNRURURVhUX1BMQVlFUl9IXworCisjZGVmaW5lIFRJTUVEVEVYVF9QTEFZRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaCIKKyNpbmNsdWRlICJUaW1lZFRleHRQYXJzZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYVNvdXJjZTsKK2NsYXNzIEF3ZXNvbWVQbGF5ZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKKworY2xhc3MgVGltZWRUZXh0UGxheWVyIHsKK3B1YmxpYzoKKyAgICBUaW1lZFRleHRQbGF5ZXIoQXdlc29tZVBsYXllciAqb2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICBUaW1lZEV2ZW50UXVldWUgKnF1ZXVlKTsKKworICAgIHZpcnR1YWwgflRpbWVkVGV4dFBsYXllcigpOworCisgICAgLy8gaW5kZXg6IHRoZSBpbmRleCBvZiB0aGUgdGV4dCB0cmFjayB3aGljaCB3aWxsCisgICAgLy8gYmUgdHVybmVkIG9uCisgICAgc3RhdHVzX3Qgc3RhcnQodWludDhfdCBpbmRleCk7CisKKyAgICB2b2lkIHBhdXNlKCk7CisKKyAgICB2b2lkIHJlc3VtZSgpOworCisgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZV91cyk7CisKKyAgICB2b2lkIGFkZFRleHRTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSk7CisKKyAgICBzdGF0dXNfdCBzZXRUaW1lZFRleHRUcmFja0luZGV4KGludDMyX3QgaW5kZXgpOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworCitwcml2YXRlOgorICAgIGVudW0gVGV4dFR5cGUgeworICAgICAgICBrTm9UZXh0ICAgICAgICA9IDAsCisgICAgICAgIGtJbkJhbmRUZXh0ICAgID0gMSwKKyAgICAgICAga091dE9mQmFuZFRleHQgPSAyLAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPERhdGFTb3VyY2U+IG1PdXRPZkJhbmRTb3VyY2U7CisKKyAgICBib29sIG1TZWVraW5nOworICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisKKyAgICBib29sIG1TdGFydGVkOworCisgICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbVRleHRFdmVudDsKKyAgICBib29sIG1UZXh0RXZlbnRQZW5kaW5nOworCisgICAgVGltZWRFdmVudFF1ZXVlICptUXVldWU7CisKKyAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBBd2Vzb21lUGxheWVyICptT2JzZXJ2ZXI7CisKKyAgICBNZWRpYUJ1ZmZlciAqbVRleHRCdWZmZXI7CisgICAgUGFyY2VsIG1EYXRhOworCisgICAgLy8gZm9yIGluLWJhbmQgdGltZWQgdGV4dAorICAgIFZlY3RvcjxzcDxNZWRpYVNvdXJjZT4gPiBtVGV4dFRyYWNrVmVjdG9yOworCisgICAgLy8gZm9yIG91dC1vZi1iYW5kIHRpbWVkIHRleHQKKyAgICBzdHJ1Y3QgT3V0T2ZCYW5kVGV4dCB7CisgICAgICAgIFRpbWVkVGV4dFBhcnNlcjo6RmlsZVR5cGUgdHlwZTsKKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOworICAgIH07CisgICAgVmVjdG9yPE91dE9mQmFuZFRleHQgPiBtVGV4dE91dE9mQmFuZFZlY3RvcjsKKworICAgIHNwPFRpbWVkVGV4dFBhcnNlcj4gbVRleHRQYXJzZXI7CisgICAgQVN0cmluZyBtVGV4dDsKKworICAgIFRleHRUeXBlIG1UZXh0VHlwZTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgb25UZXh0RXZlbnQoKTsKKyAgICB2b2lkIHBvc3RUZXh0RXZlbnQoaW50NjRfdCBkZWxheVVzID0gLTEpOworICAgIHZvaWQgY2FuY2VsVGV4dEV2ZW50KCk7CisKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IG1zZywgY29uc3Qgdm9pZCAqZGF0YSA9IE5VTEwsIHNpemVfdCBzaXplID0gMCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUaW1lZFRleHRQbGF5ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBUSU1FRFRFWFRfUExBWUVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCmluZGV4IDc2OTdlM2MuLmE0MjUzZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw2IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjZjYjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQTJkcEF1ZGlvSW50ZXJmYWNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIkEyZHBBdWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgImF1ZGlvL2xpYmEyZHAuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqc0EyZHBXYWtlTG9jayA9ICJBMmRwT3V0cHV0U3RyZWFtIjsKLSNkZWZpbmUgTUFYX1dSSVRFX1JFVFJJRVMgIDUKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIEEyZHBBdWRpb0ludGVyZmFjZTo6Y3JlYXRlQTJkcEludGVyZmFjZSgpCi0vL3sKLS8vICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3ID0gMDsKLS8vCi0vLyAgICBodyA9IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmNyZWF0ZSgpOwotLy8gICAgTE9HRCgibmV3IEEyZHBBdWRpb0ludGVyZmFjZShodzogJXApIiwgaHcpOwotLy8gICAgaHcgPSBuZXcgQTJkcEF1ZGlvSW50ZXJmYWNlKGh3KTsKLS8vICAgIHJldHVybiBodzsKLS8vfQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb0ludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykgOgotICAgIG1PdXRwdXQoMCksIG1IYXJkd2FyZUludGVyZmFjZShodyksIG1CbHVldG9vdGhFbmFibGVkKHRydWUpLCBtU3VzcGVuZGVkKGZhbHNlKQotewotfQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6On5BMmRwQXVkaW9JbnRlcmZhY2UoKQotewotICAgIGNsb3NlT3V0cHV0U3RyZWFtKChBdWRpb1N0cmVhbU91dCAqKW1PdXRwdXQpOwotICAgIGRlbGV0ZSBtSGFyZHdhcmVJbnRlcmZhY2U7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6aW5pdENoZWNrKCkKLXsKLSAgICBpZiAobUhhcmR3YXJlSW50ZXJmYWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmluaXRDaGVjaygpOwotfQotCi1BdWRpb1N0cmVhbU91dCogQTJkcEF1ZGlvSW50ZXJmYWNlOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICB1aW50MzJfdCBkZXZpY2VzLCBpbnQgKmZvcm1hdCwgdWludDMyX3QgKmNoYW5uZWxzLCB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKLXsKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZXMpKSB7Ci0gICAgICAgIExPR1YoIkEyZHBBdWRpb0ludGVyZmFjZTo6b3Blbk91dHB1dFN0cmVhbSgpIG9wZW4gSFcgZGV2aWNlOiAleCIsIGRldmljZXMpOwotICAgICAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gMDsKLQotICAgIC8vIG9ubHkgb25lIG91dHB1dCBzdHJlYW0gYWxsb3dlZAotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAqc3RhdHVzID0gLTE7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBuZXcgb3V0cHV0IHN0cmVhbQotICAgIEEyZHBBdWRpb1N0cmVhbU91dCogb3V0ID0gbmV3IEEyZHBBdWRpb1N0cmVhbU91dCgpOwotICAgIGlmICgoZXJyID0gb3V0LT5zZXQoZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSkpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1PdXRwdXQgPSBvdXQ7Ci0gICAgICAgIG1PdXRwdXQtPnNldEJsdWV0b290aEVuYWJsZWQobUJsdWV0b290aEVuYWJsZWQpOwotICAgICAgICBtT3V0cHV0LT5zZXRTdXNwZW5kZWQobVN1c3BlbmRlZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVsZXRlIG91dDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzKQotICAgICAgICAqc3RhdHVzID0gZXJyOwotICAgIHJldHVybiBtT3V0cHV0OwotfQotCi12b2lkIEEyZHBBdWRpb0ludGVyZmFjZTo6Y2xvc2VPdXRwdXRTdHJlYW0oQXVkaW9TdHJlYW1PdXQqIG91dCkgewotICAgIGlmIChtT3V0cHV0ID09IDAgfHwgbU91dHB1dCAhPSBvdXQpIHsKLSAgICAgICAgbUhhcmR3YXJlSW50ZXJmYWNlLT5jbG9zZU91dHB1dFN0cmVhbShvdXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXQ7Ci0gICAgICAgIG1PdXRwdXQgPSAwOwotICAgIH0KLX0KLQotCi1BdWRpb1N0cmVhbUluKiBBMmRwQXVkaW9JbnRlcmZhY2U6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPm9wZW5JbnB1dFN0cmVhbShkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzdGF0dXMsIGFjb3VzdGljcyk7Ci19Ci0KLXZvaWQgQTJkcEF1ZGlvSW50ZXJmYWNlOjpjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmNsb3NlSW5wdXRTdHJlYW0oaW4pOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OnNldE1vZGUoaW50IG1vZGUpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+c2V0TW9kZShtb2RlKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+c2V0TWljTXV0ZShzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6Z2V0TWljTXV0ZShib29sKiBzdGF0ZSkKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5nZXRNaWNNdXRlKHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5OwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgTE9HVigic2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0KLSAgICBrZXkgPSAiYmx1ZXRvb3RoX2VuYWJsZWQiOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUJsdWV0b290aEVuYWJsZWQgPSAodmFsdWUgPT0gInRydWUiKTsKLSAgICAgICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgICAgIG1PdXRwdXQtPnNldEJsdWV0b290aEVuYWJsZWQobUJsdWV0b290aEVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLSAgICBrZXkgPSBTdHJpbmc4KCJBMmRwU3VzcGVuZGVkIik7Ci0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtU3VzcGVuZGVkID0gKHZhbHVlID09ICJ0cnVlIik7Ci0gICAgICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zZXRTdXNwZW5kZWQobVN1c3BlbmRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtLnNpemUoKSkgewotICAgICAgICBzdGF0dXNfdCBod1N0YXR1cyA9IG1IYXJkd2FyZUludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gaHdTdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1TdHJpbmc4IEEyZHBBdWRpb0ludGVyZmFjZTo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgYTJkcFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5OwotCi0gICAga2V5ID0gImJsdWV0b290aF9lbmFibGVkIjsKLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHZhbHVlID0gbUJsdWV0b290aEVuYWJsZWQgPyAidHJ1ZSIgOiAiZmFsc2UiOwotICAgICAgICBhMmRwUGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAga2V5ID0gIkEyZHBTdXNwZW5kZWQiOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgdmFsdWUgPSBtU3VzcGVuZGVkID8gInRydWUiIDogImZhbHNlIjsKLSAgICAgICAgYTJkcFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzICA9IGEyZHBQYXJhbS50b1N0cmluZygpOwotCi0gICAgaWYgKHBhcmFtLnNpemUoKSkgewotICAgICAgICBpZiAoa2V5VmFsdWVQYWlycyAhPSAiIikgewotICAgICAgICAgICAga2V5VmFsdWVQYWlycyArPSAiOyI7Ci0gICAgICAgIH0KLSAgICAgICAga2V5VmFsdWVQYWlycyArPSBtSGFyZHdhcmVJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgTE9HVigiZ2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIGtleVZhbHVlUGFpcnM7Ci19Ci0KLXNpemVfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2KTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5zZXRNYXN0ZXJWb2x1bWUodik7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6QTJkcEF1ZGlvU3RyZWFtT3V0KCkgOgotICAgIG1GZCgtMSksIG1TdGFuZGJ5KHRydWUpLCBtU3RhcnRDb3VudCgwKSwgbVJldHJ5Q291bnQoMCksIG1EYXRhKE5VTEwpLAotICAgIC8vIGFzc3VtZSBCVCBlbmFibGVkIHRvIHN0YXJ0LCB0aGlzIGlzIHNhZmUgYmVjYXVzZSBpdHMgb25seSB0aGUKLSAgICAvLyBlbmFibGVkLT5kaXNhYmxlZCB0cmFuc2l0aW9uIHdlIGFyZSB3b3JyaWVkIGFib3V0Ci0gICAgbUJsdWV0b290aEVuYWJsZWQodHJ1ZSksIG1EZXZpY2UoMCksIG1DbG9zaW5nKGZhbHNlKSwgbVN1c3BlbmRlZChmYWxzZSkKLXsKLSAgICAvLyB1c2UgYW55IGFkZHJlc3MgYnkgZGVmYXVsdAotICAgIHN0cmNweShtQTJkcEFkZHJlc3MsICIwMDowMDowMDowMDowMDowMCIpOwotICAgIGluaXQoKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldCgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlLCBpbnQgKnBGb3JtYXQsIHVpbnQzMl90ICpwQ2hhbm5lbHMsIHVpbnQzMl90ICpwUmF0ZSkKLXsKLSAgICBpbnQgbEZvcm1hdCA9IHBGb3JtYXQgPyAqcEZvcm1hdCA6IDA7Ci0gICAgdWludDMyX3QgbENoYW5uZWxzID0gcENoYW5uZWxzID8gKnBDaGFubmVscyA6IDA7Ci0gICAgdWludDMyX3QgbFJhdGUgPSBwUmF0ZSA/ICpwUmF0ZSA6IDA7Ci0KLSAgICBMT0dEKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldCAleCwgJWQsICVkLCAlZFxuIiwgZGV2aWNlLCBsRm9ybWF0LCBsQ2hhbm5lbHMsIGxSYXRlKTsKLQotICAgIC8vIGZpeCB1cCBkZWZhdWx0cwotICAgIGlmIChsRm9ybWF0ID09IDApIGxGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICBpZiAobENoYW5uZWxzID09IDApIGxDaGFubmVscyA9IGNoYW5uZWxzKCk7Ci0gICAgaWYgKGxSYXRlID09IDApIGxSYXRlID0gc2FtcGxlUmF0ZSgpOwotCi0gICAgLy8gY2hlY2sgdmFsdWVzCi0gICAgaWYgKChsRm9ybWF0ICE9IGZvcm1hdCgpKSB8fAotICAgICAgICAgICAgKGxDaGFubmVscyAhPSBjaGFubmVscygpKSB8fAotICAgICAgICAgICAgKGxSYXRlICE9IHNhbXBsZVJhdGUoKSkpewotICAgICAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICAgICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGNoYW5uZWxzKCk7Ci0gICAgICAgIGlmIChwUmF0ZSkgKnBSYXRlID0gc2FtcGxlUmF0ZSgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGxGb3JtYXQ7Ci0gICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGxDaGFubmVsczsKLSAgICBpZiAocFJhdGUpICpwUmF0ZSA9IGxSYXRlOwotCi0gICAgbURldmljZSA9IGRldmljZTsKLSAgICBtQnVmZmVyRHVyYXRpb25VcyA9ICgoYnVmZmVyU2l6ZSgpICogMTAwMCApLyBmcmFtZVNpemUoKSAvIHNhbXBsZVJhdGUoKSkgKiAxMDAwOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6On5BMmRwQXVkaW9TdHJlYW1PdXQoKQotewotICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dCBkZXN0cnVjdG9yIik7Ci0gICAgY2xvc2UoKTsKLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQgZGVzdHJ1Y3RvciByZXR1cm5pbmcgZnJvbSBjbG9zZSgpIik7Ci19Ci0KLXNzaXplX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IC0xOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBieXRlczsKLQotICAgICAgICBpZiAoIW1CbHVldG9vdGhFbmFibGVkIHx8IG1DbG9zaW5nIHx8IG1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6d3JpdGUoKSwgYnV0IGJsdWV0b290aCBkaXNhYmxlZCBcCi0gICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEVuYWJsZWQgJWQsIG1DbG9zaW5nICVkLCBtU3VzcGVuZGVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEVuYWJsZWQsIG1DbG9zaW5nLCBtU3VzcGVuZGVkKTsKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN0YW5kYnkpIHsKLSAgICAgICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrIChQQVJUSUFMX1dBS0VfTE9DSywgc0EyZHBXYWtlTG9jayk7Ci0gICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBpbml0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgPCAwKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBpbnQgcmV0cmllcyA9IE1BWF9XUklURV9SRVRSSUVTOwotICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCAmJiByZXRyaWVzKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBhMmRwX3dyaXRlKG1EYXRhLCBidWZmZXIsIHJlbWFpbmluZyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIExPR0UoImEyZHBfd3JpdGUgZmFpbGVkIGVycjogJWRcbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHJpZXMtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbWFpbmluZyAtPSBzdGF0dXM7Ci0gICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKWJ1ZmZlciArIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIEEyRFAgc2luayBydW5zIGFibm9ybWFsbHkgZmFzdCwgc2xlZXAgYSBsaXR0bGUgc28gdGhhdCBhdWRpb2ZsaW5nZXIgbWl4ZXIgdGhyZWFkCi0gICAgICAgIC8vIGRvZXMgbm8gc3BpbiBhbmQgc3RhcnZlIG90aGVyIHRocmVhZHMuCi0gICAgICAgIC8vIE5PVEU6IEl0IGlzIGxpa2VseSB0aGF0IHRoZSBBMkRQIGhlYWRzZXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkCi0gICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAoKHVpbnQzMl90KW5zMnVzKG5vdyAtIG1MYXN0V3JpdGVUaW1lKSA8IChtQnVmZmVyRHVyYXRpb25VcyA+PiAyKSkgewotICAgICAgICAgICAgTE9HVigiQTJEUCBzaW5rIHJ1bnMgdG9vIGZhc3QiKTsKLSAgICAgICAgICAgIHVzbGVlcChtQnVmZmVyRHVyYXRpb25VcyAtICh1aW50MzJfdCluczJ1cyhub3cgLSBtTGFzdFdyaXRlVGltZSkpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0V3JpdGVUaW1lID0gbm93OwotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0KLSAgICB9Ci1FcnJvcjoKLQotICAgIHN0YW5kYnkoKTsKLQotICAgIC8vIFNpbXVsYXRlIGF1ZGlvIG91dHB1dCB0aW1pbmcgaW4gY2FzZSBvZiBlcnJvcgotICAgIHVzbGVlcChtQnVmZmVyRHVyYXRpb25Vcyk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6aW5pdCgpCi17Ci0gICAgaWYgKCFtRGF0YSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhMmRwX2luaXQoNDQxMDAsIDIsICZtRGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJhMmRwX2luaXQgZmFpbGVkIGVycjogJWRcbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGEyZHBfc2V0X3NpbmsobURhdGEsIG1BMmRwQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHN0YW5kYnlfbCgpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c3RhbmRieV9sKCkKLXsKLSAgICBpbnQgcmVzdWx0ID0gTk9fRVJST1I7Ci0KLSAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIExPR1ZfSUYobUNsb3NpbmcgfHwgIW1CbHVldG9vdGhFbmFibGVkLCAiU3RhbmRieSBza2lwIHN0b3A6IGNsb3NpbmcgJWQgZW5hYmxlZCAlZCIsCi0gICAgICAgICAgICAgICAgbUNsb3NpbmcsIG1CbHVldG9vdGhFbmFibGVkKTsKLSAgICAgICAgaWYgKCFtQ2xvc2luZyAmJiBtQmx1ZXRvb3RoRW5hYmxlZCkgewotICAgICAgICAgICAgcmVzdWx0ID0gYTJkcF9zdG9wKG1EYXRhKTsKLSAgICAgICAgfQotICAgICAgICByZWxlYXNlX3dha2VfbG9jayhzQTJkcFdha2VMb2NrKTsKLSAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOCgiYTJkcF9zaW5rX2FkZHJlc3MiKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpbnQgZGV2aWNlOwotICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSBzdHJsZW4oIjAwOjAwOjAwOjAwOjAwOjAwIikpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEFkZHJlc3ModmFsdWUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLSAgICBrZXkgPSBTdHJpbmc4KCJjbG9zaW5nIik7Ci0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtQ2xvc2luZyA9ICh2YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgICBpZiAobUNsb3NpbmcpIHsKLSAgICAgICAgICAgIHN0YW5kYnkoKTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAga2V5ID0gQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmc7Ci0gICAgaWYgKHBhcmFtLmdldEludChrZXksIGRldmljZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZSkpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBpZiAocGFyYW0uc2l6ZSgpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotU3RyaW5nOCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgoImEyZHBfc2lua19hZGRyZXNzIik7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHZhbHVlID0gbUEyZHBBZGRyZXNzOwotICAgICAgICBwYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotICAgIGtleSA9IEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgcGFyYW0uYWRkSW50KGtleSwgKGludCltRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OmdldFBhcmFtZXRlcnMoKSAlcyIsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0QWRkcmVzcyhjb25zdCBjaGFyKiBhZGRyZXNzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChzdHJsZW4oYWRkcmVzcykgIT0gc3RybGVuKCIwMDowMDowMDowMDowMDowMCIpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgIHN0cmNweShtQTJkcEFkZHJlc3MsIGFkZHJlc3MpOwotICAgIGlmIChtRGF0YSkKLSAgICAgICAgYTJkcF9zZXRfc2luayhtRGF0YSwgbUEyZHBBZGRyZXNzKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldEJsdWV0b290aEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIExPR0QoInNldEJsdWV0b290aEVuYWJsZWQgJWQiLCBlbmFibGVkKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIG1CbHVldG9vdGhFbmFibGVkID0gZW5hYmxlZDsKLSAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIGNsb3NlX2woKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0U3VzcGVuZGVkKGJvb2wgb25PZmYpCi17Ci0gICAgTE9HVigic2V0U3VzcGVuZGVkICVkIiwgb25PZmYpOwotICAgIG1TdXNwZW5kZWQgPSBvbk9mZjsKLSAgICBzdGFuZGJ5KCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OmNsb3NlKCkgY2FsbGluZyBjbG9zZV9sKCkiKTsKLSAgICByZXR1cm4gY2xvc2VfbCgpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2VfbCgpCi17Ci0gICAgc3RhbmRieV9sKCk7Ci0gICAgaWYgKG1EYXRhKSB7Ci0gICAgICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2VfbCgpIGNhbGxpbmcgYTJkcF9jbGVhbnVwKG1EYXRhKSIpOwotICAgICAgICBhMmRwX2NsZWFudXAobURhdGEpOwotICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkcml2ZXJGcmFtZXMpCi17Ci0gICAgLy9UT0RPOiBlbmFibGUgd2hlbiBzdXBwb3J0ZWQgYnkgZHJpdmVyCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmUyYzZhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBMkRQX0FVRElPX0hBUkRXQVJFX0gKLSNkZWZpbmUgQTJEUF9BVURJT19IQVJEV0FSRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb0hhcmR3YXJlQmFzZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQTJkcEF1ZGlvSW50ZXJmYWNlIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCi17Ci0gICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0OwotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBMmRwQXVkaW9JbnRlcmZhY2UoQXVkaW9IYXJkd2FyZUludGVyZmFjZSogaHcpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb0ludGVyZmFjZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TW9kZShpbnQgbW9kZSk7Ci0KLSAgICAvLyBtaWMgbXV0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE1pY011dGUoYm9vbCogc3RhdGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQpOwotCi0gICAgLy8gY3JlYXRlIEkvTyBzdHJlYW1zCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbU91dCogb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmb3JtYXQ9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNoYW5uZWxzPTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlPTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dFN0cmVhbShBdWRpb1N0cmVhbU91dCogb3V0KTsKLQotICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpOwotICAgIHZpcnR1YWwgICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluKiBpbik7Ci0vLyAgICBzdGF0aWMgQXVkaW9IYXJkd2FyZUludGVyZmFjZSogY3JlYXRlQTJkcEludGVyZmFjZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0IDogcHVibGljIEF1ZGlvU3RyZWFtT3V0IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJkcEF1ZGlvU3RyZWFtT3V0KCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb1N0cmVhbU91dCgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldCh1aW50MzJfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBSYXRlKTsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gNDQxMDA7IH0KLSAgICAgICAgLy8gU0JDIGNvZGVjIHdhbnRzIGEgbXVsdGlwbGUgb2YgNTEyCi0gICAgICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDUxMiAqIDIwOyB9Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOyB9Ci0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gKCgxMDAwKmJ1ZmZlclNpemUoKSkvZnJhbWVTaXplKCkpL3NhbXBsZVJhdGUoKSArIDIwMDsgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhbmRieSgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQTJkcEF1ZGlvSW50ZXJmYWNlOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGluaXQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjbG9zZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNsb3NlX2woKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBZGRyZXNzKGNvbnN0IGNoYXIqIGFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEJsdWV0b290aEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRTdXNwZW5kZWQoYm9vbCBvbk9mZik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhbmRieV9sKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1GZDsKLSAgICAgICAgICAgICAgICBib29sICAgICAgICBtU3RhbmRieTsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtU3RhcnRDb3VudDsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtUmV0cnlDb3VudDsKLSAgICAgICAgICAgICAgICBjaGFyICAgICAgICBtQTJkcEFkZHJlc3NbMjBdOwotICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIG1EYXRhOwotICAgICAgICAgICAgICAgIE11dGV4ICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1CbHVldG9vdGhFbmFibGVkOwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1EZXZpY2U7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUNsb3Npbmc7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbVN1c3BlbmRlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICBtTGFzdFdyaXRlVGltZTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtQnVmZmVyRHVyYXRpb25VczsKLSAgICB9OwotCi0gICAgZnJpZW5kIGNsYXNzIEEyZHBBdWRpb1N0cmVhbU91dDsKLQotICAgIEEyZHBBdWRpb1N0cmVhbU91dCogICAgIG1PdXRwdXQ7Ci0gICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSAgKm1IYXJkd2FyZUludGVyZmFjZTsKLSAgICBjaGFyICAgICAgICBtQTJkcEFkZHJlc3NbMjBdOwotICAgIGJvb2wgICAgICAgIG1CbHVldG9vdGhFbmFibGVkOwotICAgIGJvb2wgICAgICAgIG1TdXNwZW5kZWQ7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEEyRFBfQVVESU9fSEFSRFdBUkVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA2OWE0YWRjLi4yMjIyZThiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMSw3NyArMSw1IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAotI0FVRElPX1BPTElDWV9URVNUIDo9IHRydWUKLSNFTkFCTEVfQVVESU9fRFVNUCA6PSB0cnVlCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0KLWlmZXEgKCQoQVVESU9fUE9MSUNZX1RFU1QpLHRydWUpCi0gIEVOQUJMRV9BVURJT19EVU1QIDo9IHRydWUKLWVuZGlmCi0KLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcCBcCi0gICAgQXVkaW9IYXJkd2FyZVN0dWIuY3BwIFwKLSAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcAotCi1pZmVxICgkKEVOQUJMRV9BVURJT19EVU1QKSx0cnVlKQotICBMT0NBTF9TUkNfRklMRVMgKz0gQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAotICBMT0NBTF9DRkxBR1MgKz0gLURFTkFCTEVfQVVESU9fRFVNUAotZW5kaWYKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGliaGFyZHdhcmVfbGVnYWN5Ci0KLWlmZXEgKCQoc3RyaXAgJChCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8pKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURHRU5FUklDX0FVRElPCi1lbmRpZgotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ludGVyZmFjZQotCi1pZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQotICBMT0NBTF9TUkNfRklMRVMgKz0gQTJkcEF1ZGlvSW50ZXJmYWNlLmNwcAotICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmEyZHAKLSAgTE9DQUxfQ0ZMQUdTICs9IC1EV0lUSF9CTFVFVE9PVEggLURXSVRIX0EyRFAKLSAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZXopCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYm1lZGlhCi0KLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLSBMT0NBTF9MRExJQlMgKz0gLWxkbAotZWxzZQotIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5YmFzZQotCi1pZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURXSVRIX0EyRFAKLWVuZGlmCi0KLWlmZXEgKCQoQVVESU9fUE9MSUNZX1RFU1QpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtREFVRElPX1BPTElDWV9URVNUCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKQEAgLTg3LDE1ICsxNSwxMiBAQAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYm1lZGlhIFwKKyAgICBsaWJoYXJkd2FyZSBcCiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJlZmZlY3RzCiAKLWlmZXEgKCQoc3RyaXAgJChCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8pKSx0cnVlKQotICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmF1ZGlvaW50ZXJmYWNlIGxpYmF1ZGlvcG9saWN5YmFzZQotICBMT0NBTF9DRkxBR1MgKz0gLURHRU5FUklDX0FVRElPCi1lbHNlCi0gIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYXVkaW8gbGliYXVkaW9wb2xpY3kKLWVuZGlmCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIKIAogaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogIExPQ0FMX0xETElCUyArPSAtbGRsCkBAIC0xMDUsMTUgKzMwLDYgQEAKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9mbGluZ2VyCiAKLWlmZXEgKCQoQk9BUkRfSEFWRV9CTFVFVE9PVEgpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtRFdJVEhfQkxVRVRPT1RIIC1EV0lUSF9BMkRQCi0gIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYTJkcAotZW5kaWYKLQotaWZlcSAoJChBVURJT19QT0xJQ1lfVEVTVCksdHJ1ZSkKLSAgTE9DQUxfQ0ZMQUdTICs9IC1EQVVESU9fUE9MSUNZX1RFU1QKLWVuZGlmCi0KIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKICAgICBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogICAgICAgICBMT0NBTF9MRExJQlMgKz0gLWxydCAtbHB0aHJlYWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTExMTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotLyogLy9kZXZpY2Uvc2VydmVycy9BdWRpb0ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlckR1bXAiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiQXVkaW9EdW1wSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb0R1bXBJbnRlcmZhY2U6OkF1ZGlvRHVtcEludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykKLSAgICA6IG1Qb2xpY3lDb21tYW5kcyhTdHJpbmc4KCIiKSksIG1GaWxlTmFtZShTdHJpbmc4KCIiKSkKLXsKLSAgICBpZihodyA9PSAwKSB7Ci0gICAgICAgIExPR0UoIkR1bXAgY29uc3RydWN0IGh3ID0gMCIpOwotICAgIH0KLSAgICBtRmluYWxJbnRlcmZhY2UgPSBodzsKLSAgICBMT0dWKCJDb25zdHJ1Y3RvciAlcCwgbUZpbmFsSW50ZXJmYWNlICVwIiwgdGhpcywgbUZpbmFsSW50ZXJmYWNlKTsKLX0KLQotCi1BdWRpb0R1bXBJbnRlcmZhY2U6On5BdWRpb0R1bXBJbnRlcmZhY2UoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oKEF1ZGlvU3RyZWFtT3V0ICopbU91dHB1dHNbaV0pOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBjbG9zZUlucHV0U3RyZWFtKChBdWRpb1N0cmVhbUluICopbUlucHV0c1tpXSk7Ci0gICAgfQotCi0gICAgaWYobUZpbmFsSW50ZXJmYWNlKSBkZWxldGUgbUZpbmFsSW50ZXJmYWNlOwotfQotCi0KLUF1ZGlvU3RyZWFtT3V0KiBBdWRpb0R1bXBJbnRlcmZhY2U6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQotewotICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRGaW5hbCA9IE5VTEw7Ci0gICAgaW50IGxGb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKLSAgICB1aW50MzJfdCBsQ2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHVpbnQzMl90IGxSYXRlID0gNDQxMDA7Ci0KLQotICAgIG91dEZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cyk7Ci0gICAgaWYgKG91dEZpbmFsICE9IDApIHsKLSAgICAgICAgbEZvcm1hdCA9IG91dEZpbmFsLT5mb3JtYXQoKTsKLSAgICAgICAgbENoYW5uZWxzID0gb3V0RmluYWwtPmNoYW5uZWxzKCk7Ci0gICAgICAgIGxSYXRlID0gb3V0RmluYWwtPnNhbXBsZVJhdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBsRm9ybWF0ID0gKmZvcm1hdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IGxGb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgICAgIGxDaGFubmVscyA9ICpjaGFubmVsczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmNoYW5uZWxzID0gbENoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqc2FtcGxlUmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbFJhdGUgPSAqc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBsUmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSAqc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgfQotICAgIExPR1YoIm9wZW5PdXRwdXRTdHJlYW0oKSwgb3V0RmluYWwgJXAiLCBvdXRGaW5hbCk7Ci0KLSAgICBBdWRpb1N0cmVhbU91dER1bXAgKmR1bU91dHB1dCA9IG5ldyBBdWRpb1N0cmVhbU91dER1bXAodGhpcywgbU91dHB1dHMuc2l6ZSgpLCBvdXRGaW5hbCwKLSAgICAgICAgICAgIGRldmljZXMsIGxGb3JtYXQsIGxDaGFubmVscywgbFJhdGUpOwotICAgIG1PdXRwdXRzLmFkZChkdW1PdXRwdXQpOwotCi0gICAgcmV0dXJuIGR1bU91dHB1dDsKLX0KLQotdm9pZCBBdWRpb0R1bXBJbnRlcmZhY2U6OmNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpCi17Ci0gICAgQXVkaW9TdHJlYW1PdXREdW1wICpkdW1wT3V0ID0gKEF1ZGlvU3RyZWFtT3V0RHVtcCAqKW91dDsKLQotICAgIGlmIChtT3V0cHV0cy5pbmRleE9mKGR1bXBPdXQpIDwgMCkgewotICAgICAgICBMT0dXKCJBdHRlbXB0IHRvIGNsb3NlIGludmFsaWQgb3V0cHV0IHN0cmVhbSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HVigiY2xvc2VPdXRwdXRTdHJlYW0oKSBvdXRwdXQgJXAiLCBvdXQpOwotCi0gICAgZHVtcE91dC0+c3RhbmRieSgpOwotICAgIGlmIChkdW1wT3V0LT5maW5hbFN0cmVhbSgpICE9IE5VTEwpIHsKLSAgICAgICAgbUZpbmFsSW50ZXJmYWNlLT5jbG9zZU91dHB1dFN0cmVhbShkdW1wT3V0LT5maW5hbFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBtT3V0cHV0cy5yZW1vdmUoZHVtcE91dCk7Ci0gICAgZGVsZXRlIGR1bXBPdXQ7Ci19Ci0KLUF1ZGlvU3RyZWFtSW4qIEF1ZGlvRHVtcEludGVyZmFjZTo6b3BlbklucHV0U3RyZWFtKHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICBBdWRpb1N0cmVhbUluKiBpbkZpbmFsID0gTlVMTDsKLSAgICBpbnQgbEZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOwotICAgIHVpbnQzMl90IGxDaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk87Ci0gICAgdWludDMyX3QgbFJhdGUgPSA4MDAwOwotCi0gICAgaW5GaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3BlbklucHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cywgYWNvdXN0aWNzKTsKLSAgICBpZiAoaW5GaW5hbCAhPSAwKSB7Ci0gICAgICAgIGxGb3JtYXQgPSBpbkZpbmFsLT5mb3JtYXQoKTsKLSAgICAgICAgbENoYW5uZWxzID0gaW5GaW5hbC0+Y2hhbm5lbHMoKTsKLSAgICAgICAgbFJhdGUgPSBpbkZpbmFsLT5zYW1wbGVSYXRlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKmZvcm1hdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbEZvcm1hdCA9ICpmb3JtYXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBsRm9ybWF0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKmNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBsQ2hhbm5lbHMgPSAqY2hhbm5lbHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpjaGFubmVscyA9IGxDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKnNhbXBsZVJhdGUgIT0gMCkgewotICAgICAgICAgICAgICAgIGxSYXRlID0gKnNhbXBsZVJhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gbFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgKnN0YXR1cyA9IE5PX0VSUk9SOwotICAgIH0KLSAgICBMT0dWKCJvcGVuSW5wdXRTdHJlYW0oKSwgaW5GaW5hbCAlcCIsIGluRmluYWwpOwotCi0gICAgQXVkaW9TdHJlYW1JbkR1bXAgKmR1bUlucHV0ID0gbmV3IEF1ZGlvU3RyZWFtSW5EdW1wKHRoaXMsIG1JbnB1dHMuc2l6ZSgpLCBpbkZpbmFsLAotICAgICAgICAgICAgZGV2aWNlcywgbEZvcm1hdCwgbENoYW5uZWxzLCBsUmF0ZSk7Ci0gICAgbUlucHV0cy5hZGQoZHVtSW5wdXQpOwotCi0gICAgcmV0dXJuIGR1bUlucHV0OwotfQotdm9pZCBBdWRpb0R1bXBJbnRlcmZhY2U6OmNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pCi17Ci0gICAgQXVkaW9TdHJlYW1JbkR1bXAgKmR1bXBJbiA9IChBdWRpb1N0cmVhbUluRHVtcCAqKWluOwotCi0gICAgaWYgKG1JbnB1dHMuaW5kZXhPZihkdW1wSW4pIDwgMCkgewotICAgICAgICBMT0dXKCJBdHRlbXB0IHRvIGNsb3NlIGludmFsaWQgaW5wdXQgc3RyZWFtIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZHVtcEluLT5zdGFuZGJ5KCk7Ci0gICAgaWYgKGR1bXBJbi0+ZmluYWxTdHJlYW0oKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaW5hbEludGVyZmFjZS0+Y2xvc2VJbnB1dFN0cmVhbShkdW1wSW4tPmZpbmFsU3RyZWFtKCkpOwotICAgIH0KLQotICAgIG1JbnB1dHMucmVtb3ZlKGR1bXBJbik7Ci0gICAgZGVsZXRlIGR1bXBJbjsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb0R1bXBJbnRlcmZhY2U6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgaW50IHZhbHVlSW50OwotICAgIExPR1YoInNldFBhcmFtZXRlcnMgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLQotICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfZmlsZV9uYW1lIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtRmlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7Ci0gICAgICAgIG1Qb2xpY3lDb21tYW5kcyA9IHBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIExPR1YoInRlc3RfY21kX3BvbGljeSBjb21tYW5kICVzIHdyaXR0ZW4iLCBtUG9saWN5Q29tbWFuZHMuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKG1GaW5hbEludGVyZmFjZSAhPSAwICkgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVN0cmluZzggQXVkaW9EdW1wSW50ZXJmYWNlOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXNwb25zZTsKLSAgICBTdHJpbmc4IHZhbHVlOwotCi0vLyAgICBMT0dWKCJnZXRQYXJhbWV0ZXJzICVzIiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtUG9saWN5Q29tbWFuZHMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBBdWRpb1BhcmFtZXRlcihtUG9saWN5Q29tbWFuZHMpOwotICAgICAgICAgICAgcmVzcG9uc2UuYWRkSW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLmFkZEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKLS8vICAgICAgICBMT0dWKCJ0ZXN0X2NtZF9wb2xpY3kgY29tbWFuZCAlcyByZWFkIiwgbVBvbGljeUNvbW1hbmRzLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmVzcG9uc2UuYWRkKFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpLCBtRmlsZU5hbWUpOwotICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfZmlsZV9uYW1lIikpOwotICAgIH0KLQotICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHJlc3BvbnNlLnRvU3RyaW5nKCk7Ci0KLSAgICBpZiAocGFyYW0uc2l6ZSgpICYmIG1GaW5hbEludGVyZmFjZSAhPSAwICkgewotICAgICAgICBrZXlWYWx1ZVBhaXJzICs9ICI7IjsKLSAgICAgICAga2V5VmFsdWVQYWlycyArPSBtRmluYWxJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGtleVZhbHVlUGFpcnM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvRHVtcEludGVyZmFjZTo6c2V0TW9kZShpbnQgbW9kZSkKLXsKLSAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNb2RlKG1vZGUpOwotfQotCi1zaXplX3QgQXVkaW9EdW1wSW50ZXJmYWNlOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKLXsKLSAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvU3RyZWFtT3V0RHVtcDo6QXVkaW9TdHJlYW1PdXREdW1wKEF1ZGlvRHVtcEludGVyZmFjZSAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZmluYWxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpCi0gICAgOiBtSW50ZXJmYWNlKGludGVyZmFjZSksIG1JZChpZCksCi0gICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbHMoY2hhbm5lbHMpLCBtTGF0ZW5jeSgwKSwgbURldmljZShkZXZpY2VzKSwKLSAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtRmlsZSgwKSwgbUZpbGVDb3VudCgwKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBDb25zdHJ1Y3RvciAlcCwgbUludGVyZmFjZSAlcCwgbUZpbmFsU3RyZWFtICVwIiwgdGhpcywgbUludGVyZmFjZSwgbUZpbmFsU3RyZWFtKTsKLX0KLQotCi1BdWRpb1N0cmVhbU91dER1bXA6On5BdWRpb1N0cmVhbU91dER1bXAoKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBkZXN0cnVjdG9yIik7Ci0gICAgQ2xvc2UoKTsKLX0KLQotc3NpemVfdCBBdWRpb1N0cmVhbU91dER1bXA6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIHNzaXplX3QgcmV0OwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSkgewotICAgICAgICByZXQgPSBtRmluYWxTdHJlYW0tPndyaXRlKGJ1ZmZlciwgYnl0ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVzbGVlcCgoKChieXRlcyAqIDEwMDApIC8gZnJhbWVTaXplKCkpIC8gc2FtcGxlUmF0ZSgpKSAqIDEwMDApOwotICAgICAgICByZXQgPSBieXRlczsKLSAgICB9Ci0gICAgaWYoIW1GaWxlKSB7Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlLT5maWxlTmFtZSgpICE9ICIiKSB7Ci0gICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgICAgIHNwcmludGYobmFtZSwgIiVzX291dF8lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7Ci0gICAgICAgICAgICBtRmlsZSA9IGZvcGVuKG5hbWUsICJ3YiIpOwotICAgICAgICAgICAgTE9HVigiT3BlbmluZyBkdW1wIGZpbGUgJXMsIGZoICVwIiwgbmFtZSwgbUZpbGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtRmlsZSkgewotICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dER1bXA6OnN0YW5kYnkoKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBzdGFuZGJ5KCksIG1GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtRmlsZSwgbUZpbmFsU3RyZWFtKTsKLQotICAgIENsb3NlKCk7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c3RhbmRieSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpzYW1wbGVSYXRlKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zYW1wbGVSYXRlKCk7Ci0gICAgcmV0dXJuIG1TYW1wbGVSYXRlOwotfQotCi1zaXplX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpidWZmZXJTaXplKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5idWZmZXJTaXplKCk7Ci0gICAgcmV0dXJuIG1CdWZmZXJTaXplOwotfQotCi11aW50MzJfdCBBdWRpb1N0cmVhbU91dER1bXA6OmNoYW5uZWxzKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5jaGFubmVscygpOwotICAgIHJldHVybiBtQ2hhbm5lbHM7Ci19Ci1pbnQgQXVkaW9TdHJlYW1PdXREdW1wOjpmb3JtYXQoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPmZvcm1hdCgpOwotICAgIHJldHVybiBtRm9ybWF0OwotfQotdWludDMyX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpsYXRlbmN5KCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5sYXRlbmN5KCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dER1bXA6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcDo6c2V0UGFyYW1ldGVycyAlcyIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgewotICAgICAgICByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBpbnQgdmFsdWVJbnQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInNldF9pZCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUlkID0gdmFsdWVJbnQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJmb3JtYXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChtRmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gdmFsdWVJbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoImNoYW5uZWxzIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAodmFsdWVJbnQgPT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyB8fCB2YWx1ZUludCA9PSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTykgewotICAgICAgICAgICAgbUNoYW5uZWxzID0gdmFsdWVJbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAodmFsdWVJbnQgPiAwICYmIHZhbHVlSW50IDw9IDQ4MDAwKSB7Ci0gICAgICAgICAgICBpZiAobUZpbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1PdXREdW1wOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvU3RyZWFtT3V0RHVtcDo6Q2xvc2UoKQotewotICAgIGlmKG1GaWxlKSB7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgICAgIG1GaWxlID0gMDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbihkc3BGcmFtZXMpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb1N0cmVhbUluRHVtcDo6QXVkaW9TdHJlYW1JbkR1bXAoQXVkaW9EdW1wSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGZpbmFsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKQotICAgIDogbUludGVyZmFjZShpbnRlcmZhY2UpLCBtSWQoaWQpLAotICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1Gb3JtYXQoZm9ybWF0KSwgbUNoYW5uZWxzKGNoYW5uZWxzKSwgbURldmljZShkZXZpY2VzKSwKLSAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtRmlsZSgwKSwgbUZpbGVDb3VudCgwKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtSW5EdW1wIENvbnN0cnVjdG9yICVwLCBtSW50ZXJmYWNlICVwLCBtRmluYWxTdHJlYW0gJXAiLCB0aGlzLCBtSW50ZXJmYWNlLCBtRmluYWxTdHJlYW0pOwotfQotCi0KLUF1ZGlvU3RyZWFtSW5EdW1wOjp+QXVkaW9TdHJlYW1JbkR1bXAoKQotewotICAgIENsb3NlKCk7Ci19Ci0KLXNzaXplX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKQotewotICAgIHNzaXplX3QgcmV0OwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSkgewotICAgICAgICByZXQgPSBtRmluYWxTdHJlYW0tPnJlYWQoYnVmZmVyLCBieXRlcyk7Ci0gICAgICAgIGlmKCFtRmlsZSkgewotICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIlc19pbl8lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAid2IiKTsKLSAgICAgICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGlucHV0IGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GaWxlKSB7Ci0gICAgICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdXNsZWVwKCgoKGJ5dGVzICogMTAwMCkgLyBmcmFtZVNpemUoKSkgLyBzYW1wbGVSYXRlKCkpICogMTAwMCk7Ci0gICAgICAgIHJldCA9IGJ5dGVzOwotICAgICAgICBpZighbUZpbGUpIHsKLSAgICAgICAgICAgIGNoYXIgbmFtZVsyNTVdOwotICAgICAgICAgICAgc3RyY3B5KG5hbWUsICIvc2RjYXJkL211c2ljL3NpbmU0NDAiKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVscygpID09IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8pIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9tbyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9zdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcm1hdCgpID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfMTZiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzhiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSgpIDwgMTYwMDApIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl84ayIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCAzMjAwMCkgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzIyayIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCA0ODAwMCkgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzQ0ayIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl80OGsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiLndhdiIpOwotICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAicmIiKTsKLSAgICAgICAgICAgIExPR1YoIk9wZW5pbmcgaW5wdXQgcmVhZCBmaWxlICVzLCBmaCAlcCIsIG5hbWUsIG1GaWxlKTsKLSAgICAgICAgICAgIGlmIChtRmlsZSkgewotICAgICAgICAgICAgICAgIGZzZWVrKG1GaWxlLCBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobUZpbGUpIHsKLSAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gZnJlYWQoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PTAgJiYgYnl0ZXNSZWFkIDwgYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBmc2VlayhtRmlsZSwgQVVESU9fRFVNUF9XQVZFX0hEUl9TSVpFLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgZnJlYWQoKHVpbnQ4X3QgKilidWZmZXIrYnl0ZXNSZWFkLCBieXRlcy1ieXRlc1JlYWQsIDEsIG1GaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5EdW1wOjpzdGFuZGJ5KCkKLXsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbUluRHVtcCBzdGFuZGJ5KCksIG1GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtRmlsZSwgbUZpbmFsU3RyZWFtKTsKLQotICAgIENsb3NlKCk7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c3RhbmRieSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNldEdhaW4oZmxvYXQgZ2FpbikKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRHYWluKGdhaW4pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNhbXBsZVJhdGUoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPnNhbXBsZVJhdGUoKTsKLSAgICByZXR1cm4gbVNhbXBsZVJhdGU7Ci19Ci0KLXNpemVfdCBBdWRpb1N0cmVhbUluRHVtcDo6YnVmZmVyU2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+YnVmZmVyU2l6ZSgpOwotICAgIHJldHVybiBtQnVmZmVyU2l6ZTsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1JbkR1bXA6OmNoYW5uZWxzKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5jaGFubmVscygpOwotICAgIHJldHVybiBtQ2hhbm5lbHM7Ci19Ci0KLWludCBBdWRpb1N0cmVhbUluRHVtcDo6Zm9ybWF0KCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5mb3JtYXQoKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbUluRHVtcDo6c2V0UGFyYW1ldGVycygpIik7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1JbkR1bXA6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwotCi0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICByZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLX0KLQotdW5zaWduZWQgaW50IEF1ZGlvU3RyZWFtSW5EdW1wOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUluRHVtcDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvU3RyZWFtSW5EdW1wOjpDbG9zZSgpCi17Ci0gICAgaWYobUZpbGUpIHsKLSAgICAgICAgZmNsb3NlKG1GaWxlKTsKLSAgICAgICAgbUZpbGUgPSAwOwotICAgIH0KLX0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNGNlNWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qIC8vZGV2aWNlL3NlcnZlcnMvQXVkaW9GbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19EVU1QX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fRFVNUF9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvSGFyZHdhcmVCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUgNDQKLQotY2xhc3MgQXVkaW9EdW1wSW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1N0cmVhbU91dER1bXAgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXREdW1wKEF1ZGlvRHVtcEludGVyZmFjZSAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBmaW5hbFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvU3RyZWFtT3V0RHVtcCgpOwotCi0gICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDbG9zZSh2b2lkKTsKLSAgICBBdWRpb1N0cmVhbU91dCogICAgIGZpbmFsU3RyZWFtKCkgeyByZXR1cm4gbUZpbmFsU3RyZWFtOyB9Ci0gICAgdWludDMyX3QgICAgICAgICAgICBkZXZpY2UoKSB7IHJldHVybiBtRGV2aWNlOyB9Ci0gICAgaW50ICAgICAgICAgICAgICAgICBnZXRJZCgpICB7IHJldHVybiBtSWQ7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi1wcml2YXRlOgotICAgIEF1ZGlvRHVtcEludGVyZmFjZSAqbUludGVyZmFjZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBtSWQ7Ci0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtRm9ybWF0OyAgICAgICAgICAgICAgICAgICAvLwotICAgIHVpbnQzMl90IG1DaGFubmVsczsgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBjb25maWd1cmF0aW9uCi0gICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KLSAgICBzaXplX3QgIG1CdWZmZXJTaXplOwotICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgKm1GaW5hbFN0cmVhbTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICptRmlsZTsgICAgICAvLyBvdXRwdXQgZmlsZQotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVDb3VudDsKLX07Ci0KLWNsYXNzIEF1ZGlvU3RyZWFtSW5EdW1wIDogcHVibGljIEF1ZGlvU3RyZWFtSW4gewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbkR1bXAoQXVkaW9EdW1wSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogZmluYWxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb1N0cmVhbUluRHVtcCgpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0gICAgdmlydHVhbCBzc2l6ZV90ICAgICByZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDbG9zZSh2b2lkKTsKLSAgICBBdWRpb1N0cmVhbUluKiAgICAgZmluYWxTdHJlYW0oKSB7IHJldHVybiBtRmluYWxTdHJlYW07IH0KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGRldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KLQotcHJpdmF0ZToKLSAgICBBdWRpb0R1bXBJbnRlcmZhY2UgKm1JbnRlcmZhY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgbUlkOwotICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOyAgICAgICAgICAgICAgIC8vCi0gICAgdWludDMyX3QgbUZvcm1hdDsgICAgICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgY29uZmlndXJhdGlvbgotICAgIHVpbnQzMl90IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHNpemVfdCAgbUJ1ZmZlclNpemU7Ci0gICAgQXVkaW9TdHJlYW1JbiAgICAgICptRmluYWxTdHJlYW07Ci0gICAgRklMRSAgICAgICAgICAgICAgICAqbUZpbGU7ICAgICAgLy8gb3V0cHV0IGZpbGUKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlQ291bnQ7Ci19OwotCi1jbGFzcyBBdWRpb0R1bXBJbnRlcmZhY2UgOiBwdWJsaWMgQXVkaW9IYXJkd2FyZUJhc2UKLXsKLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EdW1wSW50ZXJmYWNlKEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3KTsKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvcm1hdD0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHM9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGU9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpOwotCi0gICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9EdW1wSW50ZXJmYWNlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPmluaXRDaGVjaygpO30KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKTt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKTt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1vZGUoaW50IG1vZGUpOwotCi0gICAgLy8gbWljIG11dGUKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1pY011dGUoYm9vbCBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0TWljTXV0ZShzdGF0ZSk7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWljTXV0ZShib29sKiBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+Z2V0TWljTXV0ZShzdGF0ZSk7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQpOwotCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbUluKiBvcGVuSW5wdXRTdHJlYW0odWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsgfQotCi0gICAgICAgICAgICBTdHJpbmc4ICAgICBmaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlTmFtZTsgfQotcHJvdGVjdGVkOgotCi0gICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSAgICAgICAgICAqbUZpbmFsSW50ZXJmYWNlOwotICAgIFNvcnRlZFZlY3RvcjxBdWRpb1N0cmVhbU91dER1bXAgKj4gICBtT3V0cHV0czsKLSAgICBTb3J0ZWRWZWN0b3I8QXVkaW9TdHJlYW1JbkR1bXAgKj4gICAgbUlucHV0czsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeUNvbW1hbmRzOwotICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVOYW1lOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQVVESU9fRFVNUF9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBkZmY5ZjMzLi5kNGE4ZGRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzEsNyArMzEsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CkBAIC00MCwyOCArNDIsMTggQEAKIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9faGFsLmg+CiAKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAKLSNpZmRlZiBXSVRIX0EyRFAKLSNpbmNsdWRlICJBMmRwQXVkaW9JbnRlcmZhY2UuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBzaW0gYnVpbGQgZG9lc24ndCBoYXZlIGdldHRpZAogCi0jaWZuZGVmIEhBVkVfR0VUVElECi0jIGRlZmluZSBnZXR0aWQgZ2V0cGlkCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGdFZmZlY3RMaWJQYXRoOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg3LDQwICs3OSwyMCBAQAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhcm5pbmdUaHJvdHRsZSA9IHNlY29uZHMoNSk7CiAKIAotI2RlZmluZSBBVURJT0ZMSU5HRVJfU0VDVVJJVFlfRU5BQkxFRCAxCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGJvb2wgcmVjb3JkaW5nQWxsb3dlZCgpIHsKLSNpZm5kZWYgSEFWRV9BTkRST0lEX09TCi0gICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZiBBVURJT0ZMSU5HRVJfU0VDVVJJVFlfRU5BQkxFRAogICAgIGlmIChnZXRwaWQoKSA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIikpOwogICAgIGlmICghb2spIExPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwogICAgIHJldHVybiBvazsKLSNlbHNlCi0gICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIikpKQotICAgICAgICBMT0dXKCJXQVJOSU5HOiBOZWVkIHRvIGFkZCBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIHRvIG1hbmlmZXN0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewotI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmIEFVRElPRkxJTkdFUl9TRUNVUklUWV9FTkFCTEVECiAgICAgaWYgKGdldHBpZCgpID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7CiAgICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKSk7CiAgICAgaWYgKCFvaykgTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CiAgICAgcmV0dXJuIG9rOwotI2Vsc2UKLSAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKSkpCi0gICAgICAgIExPR1coIldBUk5JTkc6IE5lZWQgdG8gYWRkIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MgdG8gbWFuaWZlc3QiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgogfQogCiAvLyBUbyBjb2xsZWN0IHRoZSBhbXBsaWZpZXIgdXNhZ2UKQEAgLTEzNiwzNCArMTA4LDEwOSBAQAogICAgIHNlcnZpY2UtPmFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CiB9CiAKK3N0YXRpYyBpbnQgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgY29uc3QgaHdfbW9kdWxlX3QgKiptb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGludCByYzsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIG1vZCk7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIG91dDsKKworICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4oKm1vZCwgZGV2KTsKKyAgICBMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCisgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICByZXR1cm4gMDsKKworb3V0OgorICAgICptb2QgPSBOVUxMOworICAgICpkZXYgPSBOVUxMOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKKyAgICAicHJpbWFyeSIsCisgICAgImEyZHAiLAorICAgICJ1c2IiLAorfTsKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKCh4KSkvc2l6ZW9mKCgoeClbMF0pKSkKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkF1ZGlvRmxpbmdlcigpCiAgICAgOiBCbkF1ZGlvRmxpbmdlcigpLAotICAgICAgICBtQXVkaW9IYXJkd2FyZSgwKSwgbU1hc3RlclZvbHVtZSgxLjBmKSwgbU1hc3Rlck11dGUoZmFsc2UpLCBtTmV4dFVuaXF1ZUlkKDEpCisgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYoMCksIG1NYXN0ZXJWb2x1bWUoMS4wZiksIG1NYXN0ZXJNdXRlKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKQogeworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6b25GaXJzdFJlZigpCit7CisgICAgaW50IHJjID0gMDsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKKyAgICAvKiBUT0RPOiBtb3ZlIGFsbCB0aGlzIHdvcmsgaW50byBhbiBJbml0KCkgZnVuY3Rpb24gKi8KICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogCi0gICAgbUF1ZGlvSGFyZHdhcmUgPSBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlOjpjcmVhdGUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXVkaW9faW50ZXJmYWNlcyk7IGkrKykgeworICAgICAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OworCisgICAgICAgIHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UoYXVkaW9faW50ZXJmYWNlc1tpXSwgJm1vZCwgJmRldik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIExPR0koIkxvYWRlZCAlcyBhdWRpbyBpbnRlcmZhY2UgZnJvbSAlcyAoJXMpIiwgYXVkaW9faW50ZXJmYWNlc1tpXSwKKyAgICAgICAgICAgICBtb2QtPm5hbWUsIG1vZC0+aWQpOworICAgICAgICBtQXVkaW9Id0RldnMucHVzaChkZXYpOworCisgICAgICAgIGlmICghbVByaW1hcnlIYXJkd2FyZURldikgeworICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldiA9IGRldjsKKyAgICAgICAgICAgIExPR0koIlVzaW5nICclcycgKCVzLiVzKSBhcyB0aGUgcHJpbWFyeSBhdWRpbyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBtb2QtPm5hbWUsIG1vZC0+aWQsIGF1ZGlvX2ludGVyZmFjZXNbaV0pOworICAgICAgICB9CisgICAgfQogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSU5JVDsKLSAgICBpZiAobUF1ZGlvSGFyZHdhcmUtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwotICAgICAgICBtTW9kZSA9IEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTDsKLSAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7Ci0gICAgICAgIG1BdWRpb0hhcmR3YXJlLT5zZXRNb2RlKG1Nb2RlKTsKLSAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01BU1RFUl9WT0xVTUU7Ci0gICAgICAgIG1BdWRpb0hhcmR3YXJlLT5zZXRNYXN0ZXJWb2x1bWUoMS4wZik7Ci0gICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HRSgiQ291bGRuJ3QgZXZlbiBpbml0aWFsaXplIHRoZSBzdHViYmVkIGF1ZGlvIGhhcmR3YXJlISIpOworCisgICAgaWYgKCFtUHJpbWFyeUhhcmR3YXJlRGV2IHx8IG1BdWRpb0h3RGV2cy5zaXplKCkgPT0gMCkgeworICAgICAgICBMT0dFKCJQcmltYXJ5IGF1ZGlvIGludGVyZmFjZSBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisKKyAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSU5JVDsKKyAgICAgICAgcmMgPSBkZXYtPmluaXRfY2hlY2soZGV2KTsKKyAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOworCisgICAgICAgICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOworICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7CisgICAgICAgICAgICBkZXYtPnNldF9tb2RlKGRldiwgbU1vZGUpOworICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01BU1RFUl9WT0xVTUU7CisgICAgICAgICAgICBkZXYtPnNldF9tYXN0ZXJfdm9sdW1lKGRldiwgMS4wZik7CisgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVByaW1hcnlIYXJkd2FyZURldiA9PSBOVUxMIHx8IG1BdWRpb0h3RGV2cy5zaXplKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBBdWRpb0ZsaW5nZXI6On5BdWRpb0ZsaW5nZXIoKQogeworICAgIGludCBudW1fZGV2cyA9IG1BdWRpb0h3RGV2cy5zaXplKCk7CisKICAgICB3aGlsZSAoIW1SZWNvcmRUaHJlYWRzLmlzRW1wdHkoKSkgewogICAgICAgICAvLyBjbG9zZUlucHV0KCkgd2lsbCByZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtUmVjb3JkVGhyZWFkcwogICAgICAgICBjbG9zZUlucHV0KG1SZWNvcmRUaHJlYWRzLmtleUF0KDApKTsKQEAgLTE3MiwxMiArMjE5LDI0IEBACiAgICAgICAgIC8vIGNsb3NlT3V0cHV0KCkgd2lsbCByZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtUGxheWJhY2tUaHJlYWRzCiAgICAgICAgIGNsb3NlT3V0cHV0KG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCkpOwogICAgIH0KLSAgICBpZiAobUF1ZGlvSGFyZHdhcmUpIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0hhcmR3YXJlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2czsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZShkZXYpOwogICAgIH0KKyAgICBtQXVkaW9Id0RldnMuY2xlYXIoKTsKIH0KIAotCithdWRpb19od19kZXZpY2VfdCogQXVkaW9GbGluZ2VyOjpmaW5kU3VpdGFibGVId0Rldl9sKHVpbnQzMl90IGRldmljZXMpCit7CisgICAgLyogZmlyc3QgbWF0Y2hpbmcgSFcgZGV2aWNlIGlzIHJldHVybmVkICovCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2c1tpXTsKKyAgICAgICAgaWYgKChkZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhkZXYpICYgZGV2aWNlcykgPT0gZGV2aWNlcykKKyAgICAgICAgICAgIHJldHVybiBkZXY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKQEAgLTI3Niw4ICszMzUsMTAgQEAKICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1BdWRpb0hhcmR3YXJlKSB7Ci0gICAgICAgICAgICBtQXVkaW9IYXJkd2FyZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsKKyAgICAgICAgLy8gZHVtcCBhbGwgaGFyZHdhcmUgZGV2cworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2c1tpXTsKKyAgICAgICAgICAgIGRldi0+ZHVtcChkZXYsIGZkKTsKICAgICAgICAgfQogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKICAgICB9CkBAIC0yOTIsOCArMzUzLDggQEAKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMzA4LDcgKzM2OSw3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBpbnQgbFNlc3Npb25JZDsKIAotICAgIGlmIChzdHJlYW1UeXBlID49IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKSB7CisgICAgaWYgKHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlIik7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTMzNCw3ICszOTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgTE9HVigiY3JlYXRlVHJhY2soKSBzZXNzaW9uSWQ6ICVkIiwgKHNlc3Npb25JZCA9PSBOVUxMKSA/IC0yIDogKnNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKSAhPSBvdXRwdXQpIHsKQEAgLTM2MSw3ICs0MjIsNyBAQAogICAgICAgICBMT0dWKCJjcmVhdGVUcmFjaygpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CiAKICAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsICZsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBsU2Vzc2lvbklkLCAmbFN0YXR1cyk7CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtNDA5LDcgKzQ3MCw3IEBACiAgICAgcmV0dXJuIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKQEAgLTQ1Myw3ICs1MTQsNyBAQAogICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTUFTVEVSX1ZPTFVNRTsKLSAgICAgICAgaWYgKG1BdWRpb0hhcmR3YXJlLT5zZXRNYXN0ZXJWb2x1bWUodmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChtUHJpbWFyeUhhcmR3YXJlRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtUHJpbWFyeUhhcmR3YXJlRGV2LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHZhbHVlID0gMS4wZjsKICAgICAgICAgfQogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwpAQCAtNDc1LDcgKzUzNiw3IEBACiAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIGlmICgobW9kZSA8IDApIHx8IChtb2RlID49IEF1ZGlvU3lzdGVtOjpOVU1fTU9ERVMpKSB7CisgICAgaWYgKChtb2RlIDwgMCkgfHwgKG1vZGUgPj0gQVVESU9fTU9ERV9DTlQpKSB7CiAgICAgICAgIExPR1coIklsbGVnYWwgdmFsdWU6IHNldE1vZGUoJWQpIiwgbW9kZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtNDgzLDcgKzU0NCw3IEBACiAgICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOwotICAgICAgICByZXQgPSBtQXVkaW9IYXJkd2FyZS0+c2V0TW9kZShtb2RlKTsKKyAgICAgICAgcmV0ID0gbVByaW1hcnlIYXJkd2FyZURldi0+c2V0X21vZGUobVByaW1hcnlIYXJkd2FyZURldiwgbW9kZSk7CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQogCkBAIC01MDYsMTYgKzU2NywxNiBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01JQ19NVVRFOwotICAgIHN0YXR1c190IHJldCA9IG1BdWRpb0hhcmR3YXJlLT5zZXRNaWNNdXRlKHN0YXRlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5zZXRfbWljX211dGUobVByaW1hcnlIYXJkd2FyZURldiwgc3RhdGUpOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgcmV0dXJuIHJldDsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OmdldE1pY011dGUoKSBjb25zdAogewotICAgIGJvb2wgc3RhdGUgPSBBdWRpb1N5c3RlbTo6TU9ERV9JTlZBTElEOworICAgIGJvb2wgc3RhdGUgPSBBVURJT19NT0RFX0lOVkFMSUQ7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX01JQ19NVVRFOwotICAgIG1BdWRpb0hhcmR3YXJlLT5nZXRNaWNNdXRlKCZzdGF0ZSk7CisgICAgbVByaW1hcnlIYXJkd2FyZURldi0+Z2V0X21pY19tdXRlKG1QcmltYXJ5SGFyZHdhcmVEZXYsICZzdGF0ZSk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICByZXR1cm4gc3RhdGU7CiB9CkBAIC01NTIsNyArNjEzLDcgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIGlmIChzdHJlYW0gPCAwIHx8IHVpbnQzMl90KHN0cmVhbSkgPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKKyAgICBpZiAoc3RyZWFtIDwgMCB8fCB1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU4NSw4ICs2NDYsOCBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbSA8IDAgfHwgdWludDMyX3Qoc3RyZWFtKSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUyB8fAotICAgICAgICB1aW50MzJfdChzdHJlYW0pID09IEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFKSB7CisgICAgaWYgKHN0cmVhbSA8IDAgfHwgdWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UIHx8CisgICAgICAgIHVpbnQzMl90KHN0cmVhbSkgPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTYwMCw3ICs2NjEsNyBAQAogCiBmbG9hdCBBdWRpb0ZsaW5nZXI6OnN0cmVhbVZvbHVtZShpbnQgc3RyZWFtLCBpbnQgb3V0cHV0KSBjb25zdAogewotICAgIGlmIChzdHJlYW0gPCAwIHx8IHVpbnQzMl90KHN0cmVhbSkgPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKKyAgICBpZiAoc3RyZWFtIDwgMCB8fCB1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgcmV0dXJuIDAuMGY7CiAgICAgfQogCkBAIC02MjEsNyArNjgyLDcgQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXI6OnN0cmVhbU11dGUoaW50IHN0cmVhbSkgY29uc3QKIHsKLSAgICBpZiAoc3RyZWFtIDwgMCB8fCBzdHJlYW0gPj0gKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSAoaW50KUFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC02NDMsOSArNzA0LDE0IEBACiAgICAgaWYgKGlvSGFuZGxlID09IDApIHsKICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX1NFVF9QQVJBTUVURVI7Ci0gICAgICAgIHJlc3VsdCA9IG1BdWRpb0hhcmR3YXJlLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICBzdGF0dXNfdCBmaW5hbF9yZXN1bHQgPSBOT19FUlJPUjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgICAgICByZXN1bHQgPSBkZXYtPnNldF9wYXJhbWV0ZXJzKGRldiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBmaW5hbF9yZXN1bHQgPSByZXN1bHQgPzogZmluYWxfcmVzdWx0OworICAgICAgICB9CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBmaW5hbF9yZXN1bHQ7CiAgICAgfQogCiAgICAgLy8gaG9sZCBhIHN0cm9uZyByZWYgb24gdGhyZWFkIGluIGNhc2UgY2xvc2VPdXRwdXQoKSBvciBjbG9zZUlucHV0KCkgaXMgY2FsbGVkCkBAIC02NzEsNyArNzM3LDE1IEBACiAvLyAgICAgICAgICAgIGlvSGFuZGxlLCBrZXlzLnN0cmluZygpLCBnZXR0aWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKKyAgICAgICAgU3RyaW5nOCBvdXRfczg7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgICAgICBjaGFyICpzID0gZGV2LT5nZXRfcGFyYW1ldGVycyhkZXYsIGtleXMuc3RyaW5nKCkpOworICAgICAgICAgICAgb3V0X3M4ICs9IFN0cmluZzgocyk7CisgICAgICAgICAgICBmcmVlKHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRfczg7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTY4OSw3ICs3NjMsNyBAQAogCiBzaXplX3QgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvSGFyZHdhcmUtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CisgICAgcmV0dXJuIG1QcmltYXJ5SGFyZHdhcmVEZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtUHJpbWFyeUhhcmR3YXJlRGV2LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CiB9CiAKIHVuc2lnbmVkIGludCBBdWRpb0ZsaW5nZXI6OmdldElucHV0RnJhbWVzTG9zdChpbnQgaW9IYW5kbGUpCkBAIC03MTYsNyArNzkwLDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX1NFVF9WT0lDRV9WT0xVTUU7Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldFZvaWNlVm9sdW1lKHZhbHVlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1QcmltYXJ5SGFyZHdhcmVEZXYsIHZhbHVlKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogCiAgICAgcmV0dXJuIHJldDsKQEAgLTgzNSw3ICs5MDksNyBAQAogICAgIHJldHVybiAoaW50KW1DaGFubmVsQ291bnQ7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Gb3JtYXQ7CiB9CkBAIC05MjEsNiArOTk1LDggQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBDb3VudDogJWRcbiIsIG1DaGFubmVsQ291bnQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIE1hc2s6IDB4JTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZyYW1lIHNpemU6ICVkXG4iLCBtRnJhbWVTaXplKTsKQEAgLTk2Nyw3ICsxMDQzLDcgQEAKICAgICBtTWFzdGVyVm9sdW1lID0gbUF1ZGlvRmxpbmdlci0+bWFzdGVyVm9sdW1lKCk7CiAgICAgbU1hc3Rlck11dGUgPSBtQXVkaW9GbGluZ2VyLT5tYXN0ZXJNdXRlKCk7CiAKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1Wb2x1bWVJbnRlcm5hbChzdHJlYW0pOwogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtTXV0ZShzdHJlYW0pOwogICAgIH0KQEAgLTk5NCw3ICsxMDcwLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSAgQ2xpZW4gVHlwIEZtdCBDaG4gU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBtYXNrICAgU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTEwMDUsNyArMTA4MSw3IEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIG1hc2sgICBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICB3cDxUcmFjaz4gd1RyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHdUcmFjayAhPSAwKSB7CkBAIC0xMDkxLDggKzExNjcsOCBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBpbnQgc2Vzc2lvbklkLApAQCAtMTEwMiwxMSArMTE3OCwxNCBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKICAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxDb3VudCAhPSAoaW50KW1DaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiAgc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxDb3VudCAlZCBmb3Igb3V0cHV0ICVwIiwKLSAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIG1PdXRwdXQpOwotICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSA9PSBBVURJT19GT1JNQVRfUENNKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KQEAgLTExMzAsMTIgKzEyMDksMTIgQEAKICAgICAgICAgLy8gY29uZmxpY3RzIHdpbGwgaGFwcGVuIHdoZW4gdHJhY2tzIGFyZSBtb3ZlZCBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlciBieSBhdWRpbyBwb2xpY3kKICAgICAgICAgLy8gbWFuYWdlcgogICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbVR5cGUpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHQtPnNlc3Npb25JZCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSAhPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSl0LT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSAhPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpdC0+dHlwZSgpKSkgewogICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTE0Myw3ICsxMjIyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCk7CiAgICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xMTU0LDcgKzEyMzMsOCBAQAogICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgTE9HVigiY3JlYXRlVHJhY2tfbCgpIHNldHRpbmcgbWFpbiBidWZmZXIgJXAiLCBjaGFpbi0+aW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihjaGFpbi0+aW5CdWZmZXIoKSk7Ci0gICAgICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpdHJhY2stPnR5cGUoKSkpOworICAgICAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdCl0cmFjay0+dHlwZSgpKSk7CisgICAgICAgICAgICBjaGFpbi0+aW5jVHJhY2tDbnQoKTsKICAgICAgICAgfQogICAgIH0KICAgICBsU3RhdHVzID0gTk9fRVJST1I7CkBAIC0xMTY5LDcgKzEyNDksNyBAQAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bGF0ZW5jeSgpIGNvbnN0CiB7CiAgICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQtPmxhdGVuY3koKTsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTIzOCw3ICsxMzE4LDcgQEAKICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HVigiYWRkVHJhY2tfbCgpIHN0YXJ0aW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPnN0YXJ0VHJhY2soKTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMjU2LDE0ICsxMzM2LDI5IEBACiB7CiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6VEVSTUlOQVRFRDsKICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKLSAgICAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjaykKK3sKKyAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgZGVsZXRlVHJhY2tOYW1lX2wodHJhY2stPm5hbWUoKSk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIGNoYWluLT5kZWNUcmFja0NudCgpOwogICAgIH0KIH0KIAogU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgcmV0dXJuIG1PdXRwdXQtPmdldFBhcmFtZXRlcnMoa2V5cyk7CisgICAgU3RyaW5nOCBvdXRfczg7CisgICAgY2hhciAqczsKKworICAgIHMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sIGtleXMuc3RyaW5nKCkpOworICAgIG91dF9zOCA9IFN0cmluZzgocyk7CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4gb3V0X3M4OwogfQogCiAvLyBkZXN0cm95VHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCkBAIC0xMjc2LDcgKzEzNzEsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsTWFzazsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTEyOTUsMTIgKzEzOTAsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpCiB7Ci0gICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxzID0gbU91dHB1dC0+Y2hhbm5lbHMoKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KUF1ZGlvU3lzdGVtOjpwb3BDb3VudChtQ2hhbm5lbHMpOwotICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5mb3JtYXQoKTsKLSAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KW1PdXRwdXQtPmZyYW1lU2l6ZSgpOwotICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+YnVmZmVyU2l6ZSgpIC8gbUZyYW1lU2l6ZTsKKyAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxNYXNrKTsKKyAgICBtRm9ybWF0ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVDb3VudCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pIC8gbUZyYW1lU2l6ZTsKIAogICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQ6IEFsd2F5cwogICAgIC8vIEFsbG9jYXRlIGEgc3RlcmVvIGJ1ZmZlciBldmVuIGlmIEhXIG91dHB1dCBpcyBtb25vLgpAQCAtMTMyOCw5ICsxNDIzLDkgQEAKICAgICBpZiAobU91dHB1dCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgKmhhbEZyYW1lcyA9IG1CeXRlc1dyaXR0ZW4vbU91dHB1dC0+ZnJhbWVTaXplKCk7CisgICAgKmhhbEZyYW1lcyA9IG1CeXRlc1dyaXR0ZW4gLyBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogCi0gICAgcmV0dXJuIG1PdXRwdXQtPmdldFJlbmRlclBvc2l0aW9uKGRzcEZyYW1lcyk7CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sIGRzcEZyYW1lcyk7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbihpbnQgc2Vzc2lvbklkKQpAQCAtMTM1NSwxOSArMTQ1MCwxOSBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKQogewotICAgIC8vIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdAorICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIHBsYWNlZCBpbiBzYW1lIHN0cmF0ZWd5IGFzIE1VU0lDIHN0cmVhbSBzbyB0aGF0CiAgICAgLy8gaXQgaXMgbW92ZWQgdG8gY29ycmVjdCBvdXRwdXQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2hlbiBBMkRQIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQKLSAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6TVVTSUMpOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmCiAgICAgICAgICAgICAgICAgISh0cmFjay0+bUNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKLSAgICAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgdHJhY2stPnR5cGUoKSk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KSB0cmFjay0+dHlwZSgpKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7CisgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOwogfQogCiBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRFZmZlY3RDaGFpbihpbnQgc2Vzc2lvbklkKQpAQCAtMTQ2MCw3ICsxNTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvIGhhcmR3YXJlIGVudGVyaW5nIHN0YW5kYnksIG1peGVyICVwLCBtU3VzcGVuZGVkICVkXG4iLCB0aGlzLCBtU3VzcGVuZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTUzNyw3ICsxNjMyLDcgQEAKICAgICAgICAgICAgIG1JbldyaXRlID0gdHJ1ZTsKICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKIAotICAgICAgICAgICAgaW50IGJ5dGVzV3JpdHRlbiA9IChpbnQpbU91dHB1dC0+d3JpdGUobU1peEJ1ZmZlciwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gKGludCltT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwgbU1peEJ1ZmZlciwgbWl4QnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBpZiAoYnl0ZXNXcml0dGVuIDwgMCkgbUJ5dGVzV3JpdHRlbiAtPSBtaXhCdWZmZXJTaXplOwogICAgICAgICAgICAgbU51bVdyaXRlcysrOwogICAgICAgICAgICAgbUluV3JpdGUgPSBmYWxzZTsKQEAgLTE1NzIsNyArMTY2Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKCFtU3RhbmRieSkgewotICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CisgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICB9CiAKICAgICBMT0dWKCJNaXhlclRocmVhZCAlcCBleGl0aW5nIiwgdGhpcyk7CkBAIC0xNTk2LDcgKzE2OTEsNyBAQAogICAgICAgICBtYXN0ZXJWb2x1bWUgPSAwOwogICAgIH0KICAgICAvLyBEZWxlZ2F0ZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIG91dHB1dCBtaXggZWZmZWN0IGNoYWluIGlmIG5lZWRlZAotICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgIHVpbnQzMl90IHYgPSAodWludDMyX3QpKG1hc3RlclZvbHVtZSAqICgxIDw8IDI0KSk7CiAgICAgICAgIGNoYWluLT5zZXRWb2x1bWVfbCgmdiwgJnYpOwpAQCAtMTcwNyw3ICsxODAyLDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsICh2b2lkICopdHJhY2stPmZvcm1hdCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9DT1VOVCwgKHZvaWQgKil0cmFjay0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKil0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLApAQCAtMTczOCw3ICsxODMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLCB0cmFjay0+bmFtZSgpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfRElTQUJMRURfT047CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRElTQUJMRURfT04sICZjYmxrLT5mbGFncyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXhlclN0YXR1cyAhPSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CkBAIC0xNzU3LDEyICsxODUyLDExIEBACiAgICAgICAgICAgICAgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYWluLT5zdG9wVHJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bU5hbWUpOworICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTc4NywxMCArMTg4MSw4IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgc3A8VHJhY2s+IHQgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAodC0+dHlwZSgpID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIHQtPm1DYmxrLT5sb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHQtPm1DYmxrLT5mbGFncyB8PSBDQkxLX0lOVkFMSURfT047CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSURfT04sICZ0LT5tQ2Jsay0+ZmxhZ3MpOwogICAgICAgICAgICAgdC0+bUNibGstPmN2LnNpZ25hbCgpOwotICAgICAgICAgICAgdC0+bUNibGstPmxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xODI0LDE0ICsxOTE2LDE0IEBACiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKHZhbHVlICE9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKQEAgLTE4NTAsMTUgKzE5NDIsMTUgQEAKICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQogICAgICAgICAgICAgLy8gdGhlIGNoYW5nZQotICAgICAgICAgICAgaWYgKG1EZXZpY2UgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICgoaW50KW1EZXZpY2UgIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOwogICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc3BlYWtlciBpcyBvbgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlV2l0aG91dFNwZWFrZXIKLSAgICAgICAgICAgICAgICAgICAgPSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTEwgJiB+QXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247CkBAIC0xODc4LDEyICsxOTcwLDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcik7CisgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CisgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewogICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKQEAgLTE5MjcsNyArMjAyMSw3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmFjdGl2ZVNsZWVwVGltZVVzKCkKIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KShtT3V0cHV0LT5sYXRlbmN5KCkgKiAxMDAwKSAvIDI7CisgICAgcmV0dXJuICh1aW50MzJfdCkobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pICogMTAwMCkgLyAyOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjppZGxlU2xlZXBUaW1lVXMoKQpAQCAtMTk3NywxMiArMjA3MSwxMiBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6YXBwbHlWb2x1bWUodWludDE2X3QgbGVmdFZvbCwgdWludDE2X3QgcmlnaHRWb2wsIGJvb2wgcmFtcCkKIHsKICAgICAvLyBEbyBub3QgYXBwbHkgdm9sdW1lIG9uIGNvbXByZXNzZWQgYXVkaW8KLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgeworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy8gY29udmVydCB0byBzaWduZWQgMTYgYml0IGJlZm9yZSB2b2x1bWUgY2FsY3VsYXRpb24KLSAgICBpZiAobUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSB7CisgICAgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCkgewogICAgICAgICBzaXplX3QgY291bnQgPSBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CiAgICAgICAgIHVpbnQ4X3QgKnNyYyA9ICh1aW50OF90ICopbU1peEJ1ZmZlciArIGNvdW50LTE7CiAgICAgICAgIGludDE2X3QgKmRzdCA9IG1NaXhCdWZmZXIgKyBjb3VudC0xOwpAQCAtMjAzNSw3ICsyMTI5LDcgQEAKICAgICB9CiAKICAgICAvLyBjb252ZXJ0IGJhY2sgdG8gdW5zaWduZWQgOCBiaXQgYWZ0ZXIgdm9sdW1lIGNhbGN1bGF0aW9uCi0gICAgaWYgKG1Gb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkgeworICAgIGlmIChtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpIHsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICBpbnQxNl90ICpzcmMgPSBtTWl4QnVmZmVyOwogICAgICAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW1NaXhCdWZmZXI7CkBAIC0yMDkxLDcgKzIxODUsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZG8uLi4KICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvIGhhcmR3YXJlIGVudGVyaW5nIHN0YW5kYnksIG1peGVyICVwXG4iLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjE3Niw3ICsyMjcwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXVkaW8gSEFMIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBzb2Z0d2FyZSB2b2x1bWUgdG8gbm9taW5hbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQtPnNldFZvbHVtZShsZWZ0LCByaWdodCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPnNldF92b2x1bWUobU91dHB1dC0+c3RyZWFtLCBsZWZ0LCByaWdodCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMS4wZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IDEuMGY7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMjQwLDExICsyMzM0LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKCFlZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGVmZmVjdENoYWluc1swXS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RvUmVtb3ZlLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrVG9SZW1vdmUtPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrVG9SZW1vdmUpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFja1RvUmVtb3ZlLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2tUb1JlbW92ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0yMjc3LDcgKzIzNzAsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgICAgICAgICB9CkBAIC0yMjk5LDcgKzIzOTIsNyBAQAogICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7Ci0gICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gKGludCltT3V0cHV0LT53cml0ZShtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGludCBieXRlc1dyaXR0ZW4gPSAoaW50KW1PdXRwdXQtPnN0cmVhbS0+d3JpdGUobU91dHB1dC0+c3RyZWFtLCBtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKICAgICAgICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPCAwKSBtQnl0ZXNXcml0dGVuIC09IG1peEJ1ZmZlclNpemU7CiAgICAgICAgICAgICBtTnVtV3JpdGVzKys7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IGZhbHNlOwpAQCAtMjMyMSw3ICsyNDE0LDcgQEAKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIH0KIAogICAgIExPR1YoIkRpcmVjdE91dHB1dFRocmVhZCAlcCBleGl0aW5nIiwgdGhpcyk7CkBAIC0yMzYxLDEyICsyNDU0LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgbU91dHB1dC0+c3RhbmRieSgpOworICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcik7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKICAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwpAQCAtMjM4Niw4ICsyNDgxLDggQEAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjphY3RpdmVTbGVlcFRpbWVVcygpCiB7CiAgICAgdWludDMyX3QgdGltZTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHRpbWUgPSAodWludDMyX3QpKG1PdXRwdXQtPmxhdGVuY3koKSAqIDEwMDApIC8gMjsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICB0aW1lID0gKHVpbnQzMl90KShtT3V0cHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1PdXRwdXQtPnN0cmVhbSkgKiAxMDAwKSAvIDI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdGltZSA9IDEwMDAwOwogICAgIH0KQEAgLTIzOTcsNyArMjQ5Miw3IEBACiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6aWRsZVNsZWVwVGltZVVzKCkKIHsKICAgICB1aW50MzJfdCB0aW1lOwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00obUZvcm1hdCkpIHsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICB0aW1lID0gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKSAvIDI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdGltZSA9IDEwMDAwOwpAQCAtMjQwOCw3ICsyNTAzLDcgQEAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzdXNwZW5kU2xlZXBUaW1lVXMoKQogewogICAgIHVpbnQzMl90IHRpbWU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgeworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgIHRpbWUgPSAodWludDMyX3QpKCgobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlKSAqIDEwMDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRpbWUgPSAxMDAwMDsKQEAgLTI1ODYsMTAgKzI2ODEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CiAgICAgaWYgKG91dHB1dFRyYWNrLT5jYmxrKCkgIT0gTlVMTCkgewotICAgICAgICB0aHJlYWQtPnNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUywgMS4wZik7CisgICAgICAgIHRocmVhZC0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9DTlQsIDEuMGYpOwogICAgICAgICBtT3V0cHV0VHJhY2tzLmFkZChvdXRwdXRUcmFjayk7CiAgICAgICAgIExPR1YoImFkZE91dHB1dFRyYWNrKCkgdHJhY2sgJXAsIG9uIHRocmVhZCAlcCIsIG91dHB1dFRyYWNrLCB0aHJlYWQpOwogICAgICAgICB1cGRhdGVXYWl0VGltZSgpOwpAQCAtMjY1NCw4ICsyNzQ5LDggQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMjY3NSw2ICsyNzcwLDcgQEAKIAogICAgIC8vIExPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7CiAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7CkBAIC0yNjg5LDcgKzI3ODUsOCBAQAogICAgICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCiAgICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CkBAIC0yNzEzLDcgKzI4MTAsOCBAQAogICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgIC8vIEZvcmNlIHVuZGVycnVuIGNvbmRpdGlvbiB0byBhdm9pZCBmYWxzZSB1bmRlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCkBAIC0yNzgwLDcgKzI4NzgsMTEgQEAKIH0KIAogaW50IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQpbUNibGstPmNoYW5uZWxDb3VudDsKKyAgICByZXR1cm4gKGNvbnN0IGludCltQ2hhbm5lbENvdW50OworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1DaGFubmVsTWFzazsKIH0KIAogdm9pZCogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3QgewpAQCAtMjc5Miw5ICsyODk0LDkgQEAKICAgICBpZiAoYnVmZmVyU3RhcnQgPCBtQnVmZmVyIHx8IGJ1ZmZlclN0YXJ0ID4gYnVmZmVyRW5kIHx8IGJ1ZmZlckVuZCA+IG1CdWZmZXJFbmQgfHwKICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1ZmZlclN0YXJ0ICYgKHVuc2lnbmVkIGxvbmcpKGNibGstPmZyYW1lU2l6ZSAtIDEpKSkgewogICAgICAgICBMT0dFKCJUcmFja0Jhc2U6OmdldEJ1ZmZlciBidWZmZXIgb3V0IG9mIHJhbmdlOlxuICAgIHN0YXJ0OiAlcCwgZW5kICVwICwgbUJ1ZmZlciAlcCBtQnVmZmVyRW5kICVwXG4gICAgXAotICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQsIGNoYW5uZWxDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyU3RhcnQsIGJ1ZmZlckVuZCwgbUJ1ZmZlciwgbUJ1ZmZlckVuZCwKLSAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlLCBjYmxrLT5jaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIGNibGstPnNlcnZlciwgY2Jsay0+c2VydmVyQmFzZSwgY2Jsay0+dXNlciwgY2Jsay0+dXNlckJhc2UpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI4MDksMTIgKzI5MTEsMTIgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwLCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCksCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAogICAgIG1NdXRlKGZhbHNlKSwgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLCBtTmFtZSgtMSksIG1NYWluQnVmZmVyKE5VTEwpLCBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpCiB7CkBAIC0yODM0LDcgKzI5MzYsNyBAQAogICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgICAgIC8vIE5PVEU6IGF1ZGlvX3RyYWNrX2NibGtfdDo6ZnJhbWVTaXplIGZvciA4IGJpdCBQQ00gZGF0YSBpcyBiYXNlZCBvbiBhIHNhbXBsZSBzaXplIG9mCiAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlciBieSBBdWRpb1RyYWNrCi0gICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00oZm9ybWF0KSA/IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSA6IHNpemVvZihpbnQ4X3QpOworICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpID8gbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSA6IHNpemVvZihpbnQ4X3QpOwogICAgIH0KIH0KIApAQCAtMjg2NSw3ICsyOTY3LDcgQEAKICAgICAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCkBAIC0yODgyLDEyICsyOTg0LDEyIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwNWQgJTAzdSAlMDN1ICUwM3UgJTA1dSAgICUwNHUgJTFkICUxZCAlMWQgJTA1dSAlMDV1ICUwNXUgIDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwNWQgJTAzdSAlMDN1IDB4JTA4eCAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAogICAgICAgICAgICAgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzAsCiAgICAgICAgICAgICAobUNsaWVudCA9PSBOVUxMKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLApAQCAtMjk0OSw3ICszMDUxLDcgQEAKICAgICBpZiAobUNibGstPmZyYW1lc1JlYWR5KCkgPj0gbUNibGstPmZyYW1lQ291bnQgfHwKICAgICAgICAgICAgIChtQ2Jsay0+ZmxhZ3MgJiBDQkxLX0ZPUkNFUkVBRFlfTVNLKSkgewogICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTEVEOwotICAgICAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRk9SQ0VSRUFEWV9NU0s7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GT1JDRVJFQURZX01TSywgJm1DYmxrLT5mbGFncyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0yOTc3LDcgKzMwNzksNyBAQAogICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiBzdGF0ZSAhPSBBQ1RJVkUgJiYgc3RhdGUgIT0gUkVTVU1JTkcpIHsKICAgICAgICAgICAgIHRocmVhZC0+bUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQodGhyZWFkLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLmxvY2soKTsKIApAQCAtMzAxNyw3ICszMTE5LDcgQEAKICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkgJiYgKHN0YXRlID09IEFDVElWRSB8fCBzdGF0ZSA9PSBSRVNVTUlORykpIHsKICAgICAgICAgICAgIHRocmVhZC0+bUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0aHJlYWQtPmlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHRocmVhZC0+bUxvY2subG9jaygpOwogCkBAIC0zMDM5LDcgKzMxNDEsNyBAQAogICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KW1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIHRocmVhZC0+bUxvY2subG9jaygpOwogCkBAIC0zMDYzLDE0ICszMTY1LDEyIEBACiAgICAgICAgIC8vIFNUT1BQRUQgc3RhdGUKICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKIAotICAgICAgICBtQ2Jsay0+bG9jay5sb2NrKCk7Ci0gICAgICAgIC8vIE5PVEU6IHJlc2V0KCkgd2lsbCByZXNldCBjYmxrLT51c2VyIGFuZCBjYmxrLT5zZXJ2ZXIgd2l0aAotICAgICAgICAvLyB0aGUgcmlzayB0aGF0IGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBBdWRpb01peGVyIGlzIHRyeWluZyB0byByZWFkCi0gICAgICAgIC8vIGRhdGEuIEluIHRoaXMgY2FzZSwgZ2V0TmV4dEJ1ZmZlcigpIHdvdWxkIHJldHVybiBhIE5VTEwgcG9pbnRlcgotICAgICAgICAvLyBhcyBhdWRpbyBidWZmZXIgPT4gdGhlIEF1ZGlvTWl4ZXIgY29kZSBNVVNUIGFsd2F5cyB0ZXN0IHRoYXQgcG9pbnRlcgotICAgICAgICAvLyByZXR1cm5lZCBieSBnZXROZXh0QnVmZmVyKCkgaXMgbm90IE5VTEwhCi0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIG1DYmxrLT5sb2NrLnVubG9jaygpOworICAgICAgICAvLyBkbyBub3QgcmVzZXQgdGhlIHRyYWNrIGlmIGl0IGlzIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN0b3BwZWQgb3IgcGF1c2VkLgorICAgICAgICAvLyB0aGlzIHdpbGwgYmUgZG9uZSBieSBwcmVwYXJlVHJhY2tzX2woKSB3aGVuIHRoZSB0cmFjayBpcyBzdG9wcGVkLgorICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+bUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRoaXMpIDwgMCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMzA4Miw4ICszMTgyLDggQEAKICAgICAgICAgVHJhY2tCYXNlOjpyZXNldCgpOwogICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgotICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKLSAgICAgICAgbUNibGstPmZsYWdzICY9IH5DQkxLX0ZPUkNFUkVBRFlfTVNLOworICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRk9SQ0VSRUFEWV9NU0ssICZtQ2Jsay0+ZmxhZ3MpOworICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOX09OLCAmbUNibGstPmZsYWdzKTsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7CiAgICAgICAgIG1SZXNldERvbmUgPSB0cnVlOwogICAgIH0KQEAgLTMxMjQsMjEgKzMyMjQsMjEgQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgZmxhZ3MsIDAsIHNlc3Npb25JZCksCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIDAsIHNlc3Npb25JZCksCiAgICAgICAgIG1PdmVyZmxvdyhmYWxzZSkKIHsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgIExPR1YoIlJlY29yZFRyYWNrIGNvbnN0cnVjdG9yLCBzaXplICVkIiwgKGludCltQnVmZmVyRW5kIC0gKGludCltQnVmZmVyKTsKLSAgICAgICBpZiAoZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7Ci0gICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkgewotICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDhfdCk7CisgICAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUKSB7CisgICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDhfdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IHNpemVvZihpbnQ4X3QpOwogICAgICAgIH0KQEAgLTMyMTIsMTYgKzMzMTIsMTYgQEAKICAgICAgICAgVHJhY2tCYXNlOjpyZXNldCgpOwogICAgICAgICAvLyBGb3JjZSBvdmVyZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIG92ZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAvLyByZWFkIGZyb20gYnVmZmVyCi0gICAgICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX1VOREVSUlVOX09OOworICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOX09OLCAmbUNibGstPmZsYWdzKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTA1ZCAlMDN1ICUwM3UgJTA1ZCAgICUwNHUgJTAxZCAlMDV1ICAlMDh4ICUwOHhcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTA1ZCAlMDN1IDB4JTA4eCAlMDVkICAgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLApAQCAtMzIzNywxMCArMzMzNywxMCBAQAogICAgICAgICAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgIER1cGxpY2F0aW5nVGhyZWFkICpzb3VyY2VUaHJlYWQsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KQotICAgIDogICBUcmFjayh0aHJlYWQsIE5VTEwsIEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgTlVMTCwgMCksCisgICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgMCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewogCkBAIC0zMjUxLDggKzMzNTEsMTAgQEAKICAgICAgICAgbUNibGstPnZvbHVtZVswXSA9IG1DYmxrLT52b2x1bWVbMV0gPSAweDEwMDA7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsIG1DYmxrLT5idWZmZXJzICVwLCBtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DYmxrLT5jaGFubmVsQ291bnQgJWQgbUJ1ZmZlckVuZCAlcCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLCBtQ2Jsay0+ZnJhbWVDb3VudCwgbUNibGstPnNhbXBsZVJhdGUsIG1DYmxrLT5jaGFubmVsQ291bnQsIG1CdWZmZXJFbmQpOworICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsICIgXAorICAgICAgICAgICAgICAgICJtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DaGFubmVsTWFzayAweCUwOHggbUJ1ZmZlckVuZCAlcCIsCisgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLAorICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNoYW5uZWxNYXNrLCBtQnVmZmVyRW5kKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOwogICAgIH0KQEAgLTMyODcsNyArMzM4OSw3IEBACiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DYmxrLT5jaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKICAgICBib29sIG91dHB1dEJ1ZmZlckZ1bGwgPSBmYWxzZTsKICAgICBpbkJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwogICAgIGluQnVmZmVyLmkxNiA9IGRhdGE7CkBAIC0zNTcyLDggKzM2NzQsOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTM2MTIsNyArMzcxNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZF9sKCk7CkBAIC0zNjIyLDcgKzM3MjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrLiBUaGUgcmVjb3JkIHRyYWNrIHVzZXMgb25lIHRyYWNrIGluIG1IYXJkd2FyZU1peGVyVGhyZWFkIGJ5IGNvbnZlbnRpb24uCiAgICAgICAgIHJlY29yZFRyYWNrID0gbmV3IFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgZmxhZ3MsIGxTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIGxTZXNzaW9uSWQpOwogICAgIH0KICAgICBpZiAocmVjb3JkVHJhY2stPmdldENibGsoKSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFJlY29yZFRyYWNrIHNvIHRoYXQgdGhlIENsaWVudApAQCAtMzY4Miw3ICszNzg0LDcgQEAKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQpLAogICAgIG1JbnB1dChpbnB1dCksIG1SZXNhbXBsZXIoMCksIG1Sc21wT3V0QnVmZmVyKDApLCBtUnNtcEluQnVmZmVyKDApCiB7Ci0gICAgbVJlcUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjaGFubmVscyk7CisgICAgbVJlcUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxzKTsKICAgICBtUmVxU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwogfQpAQCAtMzcyNCw3ICszODI2LDcgQEAKICAgICAgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CiAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrID09IDAgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RhbmRieSgpOworICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zNzM5LDcgKzM4NDEsNyBAQAogICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzg0LDcgKzM4ODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCArPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgLT0gZnJhbWVzSW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpbUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGZyYW1lc0luICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMTYgPSAoaW50MTZfdCAqKXNyYzsKQEAgLTM4MDQsMTEgKzM5MDYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCltQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQgfHwgbUZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+cmVhZChidWZmZXIucmF3LCBtSW5wdXRCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KW1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCB8fCBtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIGJ1ZmZlci5yYXcsIG1JbnB1dEJ5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5yZWFkKG1Sc21wSW5CdWZmZXIsIG1JbnB1dEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCBtUnNtcEluQnVmZmVyLCBtSW5wdXRCeXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkIDwgMCkgewpAQCAtMzgxNiw3ICszOTE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdGFuZGJ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDUwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwpAQCAtMzg3MSw3ICszOTczLDcgQEAKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIG1JbnB1dC0+c3RhbmRieSgpOworICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIH0KICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKIApAQCAtMzk3MCw3ICs0MDcyLDcgQEAKIAogICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewogICAgICAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgVHJhY2s6XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBTUmF0ZSAgU2VydiAgICAgVXNlclxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIENsaWVuIEZtdCBDaG4gbWFzayAgIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIApAQCAtNDAwMywxMyArNDEwNSwxMyBAQAogICAgIGludCBjaGFubmVsQ291bnQ7CiAKICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5yZWFkKG1Sc21wSW5CdWZmZXIsIG1JbnB1dEJ5dGVzKTsKKyAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCBtUnNtcEluQnVmZmVyLCBtSW5wdXRCeXRlcyk7CiAgICAgICAgIGlmIChtQnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgTE9HRSgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgRXJyb3IgcmVhZGluZyBhdWRpbyBpbnB1dCIpOwogICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgbUlucHV0LT5zdGFuZGJ5KCk7CisgICAgICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgICAgICAgICB1c2xlZXAoNTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXItPnJhdyA9IDA7CkBAIC00MDYyLDcgKzQxNjQsNyBAQAogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJlcUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudCh2YWx1ZSk7CisgICAgICAgICAgICByZXFDaGFubmVsQ291bnQgPSBwb3Bjb3VudCh2YWx1ZSk7CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CkBAIC00MDc2LDE2ICs0MTc4LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcik7CisgICAgICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLCBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgbUlucHV0LT5zdGFuZGJ5KCk7Ci0gICAgICAgICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKKyAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLCBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+Zm9ybWF0KCkgJiYgcmVxRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUICYmCi0gICAgICAgICAgICAgICAgICAgICgoaW50KW1JbnB1dC0+c2FtcGxlUmF0ZSgpIDw9IDIgKiByZXFTYW1wbGluZ1JhdGUpICYmCi0gICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6cG9wQ291bnQobUlucHV0LT5jaGFubmVscygpKSA8IDMpICYmIChyZXFDaGFubmVsQ291bnQgPCAzKSkgeworICAgICAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSAmJgorICAgICAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKKyAgICAgICAgICAgICAgICAgICAgKChpbnQpbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pIDw9ICgyICogcmVxU2FtcGxpbmdSYXRlKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBvcGNvdW50KG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkgPCAzKSAmJgorICAgICAgICAgICAgICAgICAgICAocmVxQ2hhbm5lbENvdW50IDwgMykpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTQxMDYsNyArNDIxMCwxMyBAQAogCiBTdHJpbmc4IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgcmV0dXJuIG1JbnB1dC0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKKyAgICBjaGFyICpzOworICAgIFN0cmluZzggb3V0X3M4OworCisgICAgcyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sIGtleXMuc3RyaW5nKCkpOworICAgIG91dF9zOCA9IFN0cmluZzgocyk7CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4gb3V0X3M4OwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewpAQCAtNDExNiw3ICs0MjI2LDcgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxzOworICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxNYXNrOwogICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwpAQCAtNDEzOCwxMiArNDI0OCwxMiBAQAogICAgIGlmIChtUmVzYW1wbGVyKSBkZWxldGUgbVJlc2FtcGxlcjsKICAgICBtUmVzYW1wbGVyID0gMDsKIAotICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxzID0gbUlucHV0LT5jaGFubmVscygpOwotICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpQXVkaW9TeXN0ZW06OnBvcENvdW50KG1DaGFubmVscyk7Ci0gICAgbUZvcm1hdCA9IG1JbnB1dC0+Zm9ybWF0KCk7Ci0gICAgbUZyYW1lU2l6ZSA9ICh1aW50MTZfdCltSW5wdXQtPmZyYW1lU2l6ZSgpOwotICAgIG1JbnB1dEJ5dGVzID0gbUlucHV0LT5idWZmZXJTaXplKCk7CisgICAgbVNhbXBsZVJhdGUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxNYXNrID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxNYXNrKTsKKyAgICBtRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KWF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtSW5wdXRCeXRlcyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVDb3VudCA9IG1JbnB1dEJ5dGVzIC8gbUZyYW1lU2l6ZTsKICAgICBtUnNtcEluQnVmZmVyID0gbmV3IGludDE2X3RbbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50XTsKIApAQCAtNDE3Myw3ICs0MjgzLDcgQEAKIAogdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKQogewotICAgIHJldHVybiBtSW5wdXQtPmdldElucHV0RnJhbWVzTG9zdCgpOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1JbnB1dC0+c3RyZWFtKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDE5Miw2ICs0MzAyLDggQEAKICAgICB1aW50MzJfdCBmb3JtYXQgPSBwRm9ybWF0ID8gKnBGb3JtYXQgOiAwOwogICAgIHVpbnQzMl90IGNoYW5uZWxzID0gcENoYW5uZWxzID8gKnBDaGFubmVscyA6IDA7CiAgICAgdWludDMyX3QgbGF0ZW5jeSA9IHBMYXRlbmN5TXMgPyAqcExhdGVuY3lNcyA6IDA7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW07CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm91dEh3RGV2OwogCiAgICAgTE9HVigib3Blbk91dHB1dCgpLCBEZXZpY2UgJXgsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICVkLCBDaGFubmVscyAleCwgZmxhZ3MgJXgiLAogICAgICAgICAgICAgcERldmljZXMgPyAqcERldmljZXMgOiAwLApAQCAtNDIwMywyNiArNDMxNSwzMCBAQAogICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5PdXRwdXRTdHJlYW0oKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgIG91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbCgqcERldmljZXMpOworICAgIGlmIChvdXRId0RldiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0YXR1cyA9IG91dEh3RGV2LT5vcGVuX291dHB1dF9zdHJlYW0ob3V0SHdEZXYsICpwRGV2aWNlcywgKGludCAqKSZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbHMsICZzYW1wbGluZ1JhdGUsICZvdXRTdHJlYW0pOwogICAgIExPR1YoIm9wZW5PdXRwdXQoKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJWQsIENoYW5uZWxzICV4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgb3V0U3RyZWFtLAogICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgICBzdGF0dXMpOwogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICBpZiAob3V0cHV0ICE9IDApIHsKKyAgICBpZiAob3V0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG5ldyBBdWRpb1N0cmVhbU91dChvdXRId0Rldiwgb3V0U3RyZWFtKTsKICAgICAgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkX2woKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpIHx8Ci0gICAgICAgICAgICAoZm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB8fAotICAgICAgICAgICAgKGNoYW5uZWxzICE9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8pKSB7CisKKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1QpIHx8CisgICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB8fAorICAgICAgICAgICAgKGNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKICAgICAgICAgICAgIExPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtNDI5Myw3ICs0NDA5LDkgQEAKICAgICB0aHJlYWQtPmV4aXQoKTsKIAogICAgIGlmICh0aHJlYWQtPnR5cGUoKSAhPSBQbGF5YmFja1RocmVhZDo6RFVQTElDQVRJTkcpIHsKLSAgICAgICAgbUF1ZGlvSGFyZHdhcmUtPmNsb3NlT3V0cHV0U3RyZWFtKHRocmVhZC0+Z2V0T3V0cHV0KCkpOworICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5nZXRPdXRwdXQoKTsKKyAgICAgICAgb3V0LT5od0Rldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShvdXQtPmh3RGV2LCBvdXQtPnN0cmVhbSk7CisgICAgICAgIGRlbGV0ZSBvdXQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTQzNDMsMjAgKzQ0NjEsMjUgQEAKICAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CiAgICAgdWludDMyX3QgcmVxRm9ybWF0ID0gZm9ybWF0OwogICAgIHVpbnQzMl90IHJlcUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmluU3RyZWFtOworICAgIGF1ZGlvX2h3X2RldmljZV90ICppbkh3RGV2OwogCiAgICAgaWYgKHBEZXZpY2VzID09IE5VTEwgfHwgKnBEZXZpY2VzID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbSgqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcylhY291c3RpY3MpOworICAgIGluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKCpwRGV2aWNlcyk7CisgICAgaWYgKGluSHdEZXYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0dXMgPSBpbkh3RGV2LT5vcGVuX2lucHV0X3N0cmVhbShpbkh3RGV2LCAqcERldmljZXMsIChpbnQgKikmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVscywgJnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpYWNvdXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSk7CiAgICAgTE9HVigib3BlbklucHV0KCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlZCwgQ2hhbm5lbHMgJXgsIGFjb3VzdGljcyAleCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgaW5TdHJlYW0sCiAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICBjaGFubmVscywKQEAgLTQzNjYsMjAgKzQ0ODksMjAgQEAKICAgICAvLyBJZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycyBhbmQgd2UgY2FuIGhhbmRsZSB0aGUgY29udmVyc2lvbiBpbnRlcm5hbGx5LAogICAgIC8vIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuIFRoZSBBdWRpb0ZsaW5nZXIgY2FuIHJlc2FtcGxlIHRoZSBpbnB1dCBhbmQgZG8gbW9ubyB0byBzdGVyZW8KICAgICAvLyBvciBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9ucyBvbiAxNiBiaXQgUENNIGlucHV0cy4KLSAgICBpZiAoaW5wdXQgPT0gMCAmJiBzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgIHJlcUZvcm1hdCA9PSBmb3JtYXQgJiYgZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUICYmCisgICAgaWYgKGluU3RyZWFtID09IE5VTEwgJiYgc3RhdHVzID09IEJBRF9WQUxVRSAmJgorICAgICAgICByZXFGb3JtYXQgPT0gZm9ybWF0ICYmIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgogICAgICAgICAoc2FtcGxpbmdSYXRlIDw9IDIgKiByZXFTYW1wbGluZ1JhdGUpICYmCi0gICAgICAgIChBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMpIDwgMykgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChyZXFDaGFubmVscykgPCAzKSkgeworICAgICAgICAocG9wY291bnQoY2hhbm5lbHMpIDwgMykgJiYgKHBvcGNvdW50KHJlcUNoYW5uZWxzKSA8IDMpKSB7CiAgICAgICAgIExPR1YoIm9wZW5JbnB1dCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWxzIik7Ci0gICAgICAgIGlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbSgqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcylhY291c3RpY3MpOworICAgICAgICBzdGF0dXMgPSBpbkh3RGV2LT5vcGVuX2lucHV0X3N0cmVhbShpbkh3RGV2LCAqcERldmljZXMsIChpbnQgKikmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbHMsICZzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19pbl9hY291c3RpY3NfdClhY291c3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSk7CiAgICAgfQogCi0gICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICBpZiAoaW5TdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG5ldyBBdWRpb1N0cmVhbUluKGluSHdEZXYsIGluU3RyZWFtKTsKKwogICAgICAgICBpbnQgaWQgPSBuZXh0VW5pcXVlSWRfbCgpOwogICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsIGlucHV0LCByZXFTYW1wbGluZ1JhdGUsIHJlcUNoYW5uZWxzLCBpZCk7CkBAIC00Mzg5LDcgKzQ1MTIsNyBAQAogICAgICAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgIGlmIChwQ2hhbm5lbHMpICpwQ2hhbm5lbHMgPSByZXFDaGFubmVsczsKIAotICAgICAgICBpbnB1dC0+c3RhbmRieSgpOworICAgICAgICBpbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmaW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKIAogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCiAgICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CkBAIC00NDE4LDcgKzQ1NDEsOSBAQAogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKIAotICAgIG1BdWRpb0hhcmR3YXJlLT5jbG9zZUlucHV0U3RyZWFtKHRocmVhZC0+Z2V0SW5wdXQoKSk7CisgICAgQXVkaW9TdHJlYW1JbiAqaW4gPSB0aHJlYWQtPmdldElucHV0KCk7CisgICAgaW4tPmh3RGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0oaW4tPmh3RGV2LCBpbi0+c3RyZWFtKTsKKyAgICBkZWxldGUgaW47CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC00NDk3LDMyICs0NjIyLDYgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQotewotICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgLy8gb25seSBhbGxvdyBsaWJyYXJpZXMgbG9hZGVkIGZyb20gL3N5c3RlbS9saWIvc291bmRmeCBmb3Igbm93Ci0gICAgaWYgKHN0cm5jbXAoZ0VmZmVjdExpYlBhdGgsIGxpYlBhdGgsIHN0cmxlbihnRWZmZWN0TGliUGF0aCkpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIEVmZmVjdExvYWRMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6dW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQotewotICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBFZmZlY3RVbmxvYWRMaWJyYXJ5KGhhbmRsZSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NTU4LDcgKzQ2NTcsNiBAQAogewogICAgIHN0YXR1c190IGxTdGF0dXMgPSBOT19FUlJPUjsKICAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKLSAgICBlZmZlY3RfaW50ZXJmYWNlX3QgaXRmZTsKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgd3A8Q2xpZW50PiB3Y2xpZW50OwpAQCAtNDU3MiwxNCArNDY3MCwxNCBAQAogICAgIH0KIAogICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYICYmICFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmICFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBTZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKKyAgICAvLyBTZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIHJlc2VydmVkIGZvciBvdXRwdXQgc3RhZ2UgZWZmZWN0cwogICAgIC8vIHRoYXQgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciAocnVubmluZyBpbiBzYW1lIHByb2Nlc3MpCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkKCkgIT0gcGlkKSB7CisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSAmJiBnZXRwaWQoKSAhPSBwaWQpIHsKICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpAQCAtNDU5MywxMiArNDY5MSwxMiBAQAogICAgIH0KIAogICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAvLyBvdXRwdXQgbXVzdCBiZSBzcGVjaWZpZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyIHdoZW4gdXNpbmcgc2Vzc2lvbgotICAgICAgICAgICAgLy8gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFCisgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgaXMgcmVtb3ZlZCBiZWZvcmUgd2UgbG9jayB0aGUKICAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KSBiZWxvdyB3aWxsIGRldGVjdCBpdAogICAgICAgICAgICAgLy8gYW5kIHdlIHdpbGwgZXhpdCBzYWZlbHkKQEAgLTQ2NDYsNyArNDc0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZkLCAmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYIHx8CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDY1OSwxNCArNDc1NywxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKICAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCiAgICAgICAgICAgICAgICAgICAgIChkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgICAgIG1lbWNweSgmZGVzYywgJmQsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdHMgb24gYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9tIDAgKG91dHB1dCBtaXgpCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgogICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgbFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgZ290byBFeGl0OwpAQCAtNDgzOSw3ICs0OTM3LDcgQEAKIAogICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0IG9uIHNlc3Npb24gb3RoZXIgdGhhbiAwCiAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgJiYKLSAgICAgICAgc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgYXV4aWxpYXJ5IGVmZmVjdCAlcyB0byBzZXNzaW9uICVkIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtNDg0OCw3ICs0OTQ2LDcgQEAKIAogICAgIC8vIERvIG5vdCBhbGxvdyBlZmZlY3RzIHdpdGggc2Vzc2lvbiBJRCAwIG9uIGRpcmVjdCBvdXRwdXQgb3IgZHVwbGljYXRpbmcgdGhyZWFkcwogICAgIC8vIFRPRE86IGFkZCBydWxlIGZvciBodyBhY2NlbGVyYXRlZCBlZmZlY3RzIG9uIGRpcmVjdCBvdXRwdXRzIHdpdGggbm9uIFBDTSBmb3JtYXQKLSAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYgbVR5cGUgIT0gTUlYRVIpIHsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJiBtVHlwZSAhPSBNSVhFUikgewogICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgYXV4aWxpYXJ5IGVmZmVjdCAlcyB0byBzZXNzaW9uICVkIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtNTAxOSw2ICs1MTE3LDcgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgIExPR1YoImFkZEVmZmVjdENoYWluX2woKSB0cmFjay0+c2V0TWFpbkJ1ZmZlciB0cmFjayAlcCBidWZmZXIgJXAiLCB0cmFjay5nZXQoKSwgYnVmZmVyKTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgICAgIGNoYWluLT5pbmNUcmFja0NudCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUwMjgsMjAgKzUxMjcsMjAgQEAKICAgICAgICAgICAgIGlmICh0cmFjayA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgIExPR1YoImFkZEVmZmVjdENoYWluX2woKSBhY3RpdmF0aW5nIHRyYWNrICVwIG9uIHNlc3Npb24gJWQiLCB0cmFjay5nZXQoKSwgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPnN0YXJ0VHJhY2soKTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihidWZmZXIsIG93bnNCdWZmZXIpOwogICAgIGNoYWluLT5zZXRPdXRCdWZmZXIobU1peEJ1ZmZlcik7Ci0gICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CisgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIGluc2VydGVkIGF0IGVuZCBvZiBlZmZlY3QKICAgICAvLyBjaGFpbnMgbGlzdCBpbiBvcmRlciB0byBiZSBwcm9jZXNzZWQgbGFzdCBhcyBpdCBjb250YWlucyBvdXRwdXQgc3RhZ2UgZWZmZWN0cwotICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQotICAgIC8vIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFIHRvIGJlIHByb2Nlc3NlZAorICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggaXMgaW5zZXJ0ZWQgYmVmb3JlCisgICAgLy8gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSB0byBiZSBwcm9jZXNzZWQKICAgICAvLyBhZnRlciB0cmFjayBzcGVjaWZpYyBlZmZlY3RzIGFuZCBiZWZvcmUgb3V0cHV0IHN0YWdlCi0gICAgLy8gSXQgaXMgdGhlcmVmb3JlIG1hbmRhdG9yeSB0aGF0IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggPT0gMCBhbmQKLSAgICAvLyB0aGF0IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSA8IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgKKyAgICAvLyBJdCBpcyB0aGVyZWZvcmUgbWFuZGF0b3J5IHRoYXQgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID09IDAgYW5kCisgICAgLy8gdGhhdCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSA8IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWAogICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igb3RoZXIgc2Vzc2lvbnMgYXJlIGluc2VydGVkIGF0IGJlZ2lubmluZyBvZiBlZmZlY3QKICAgICAvLyBjaGFpbnMgbGlzdCB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIG91dHB1dCBtaXggZWZmZWN0cy4gUmVsYXRpdmUgb3JkZXIgYmV0d2VlbiBvdGhlcgogICAgIC8vIHNlc3Npb25zIGlzIG5vdCBpbXBvcnRhbnQKQEAgLTUwNjQsMTEgKzUxNjMsMjMgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKGNoYWluID09IG1FZmZlY3RDaGFpbnNbaV0pIHsKICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAvLyBkZXRhY2ggYWxsIGFjdGl2ZSB0cmFja3MgZnJvbSB0aGUgY2hhaW4KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpIDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJyZW1vdmVFZmZlY3RDaGFpbl9sKCk6IHN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW4uZ2V0KCksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGRldGFjaCBhbGwgdHJhY2tzIHdpdGggc2FtZSBzZXNzaW9uIElEIGZyb20gdGhpcyBjaGFpbgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIobU1peEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGNoYWluLT5kZWNUcmFja0NudCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTEyMSw4ICs1MjMyLDggQEAKICAgICBpZiAoRWZmZWN0SWQgPT0gMCkgewogICAgICAgICB0cmFjay0+c2V0QXV4QnVmZmVyKDAsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEF1eGlsaWFyeSBlZmZlY3RzIGFyZSBhbHdheXMgaW4gYXVkaW8gc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYCi0gICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZ2V0RWZmZWN0X2woQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpOworICAgICAgICAvLyBBdXhpbGlhcnkgZWZmZWN0cyBhcmUgYWx3YXlzIGluIGF1ZGlvIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZ2V0RWZmZWN0X2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBFZmZlY3RJZCk7CiAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewogICAgICAgICAgICAgaWYgKChlZmZlY3QtPmRlc2MoKS5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+c2V0QXV4QnVmZmVyKEVmZmVjdElkLCAoaW50MzJfdCAqKWVmZmVjdC0+aW5CdWZmZXIoKSk7CkBAIC01MzUwLDcgKzU0NjEsNyBAQAogICAgICAgICAvLyBJZiBhbiBpbnNlcnQgZWZmZWN0IGlzIGlkbGUgYW5kIGlucHV0IGJ1ZmZlciBpcyBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgYnVmZmVyLAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja3MoKSAhPSAwKSB7CisgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiAyOyAgLy9hbHdheXMgc3RlcmVvIGhlcmUKICAgICAgICAgICAgIGludDE2X3QgKmluID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2OwogICAgICAgICAgICAgaW50MTZfdCAqb3V0ID0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnMxNjsKQEAgLTUzODMsMTkgKzU0OTQsMTkgQEAKIAogICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKICAgICBpZiAodGhyZWFkLT5jaGFubmVsQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgICAgICBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICAgICAgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCiAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwogICAgIH0KICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwotICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OwotICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNTQwNiw3ICs1NTE3LDcgQEAKICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIC8vIEluc2VydCBlZmZlY3Q6Ci0gICAgLy8gLSBpbiBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggb3IgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgIC8vIC0gaW4gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsCiAgICAgLy8gYWx3YXlzIG92ZXJ3cml0ZXMgb3V0cHV0IGJ1ZmZlcjogaW5wdXQgYnVmZmVyID09IG91dHB1dCBidWZmZXIKICAgICAvLyAtIGluIG90aGVyIHNlc3Npb25zOgogICAgIC8vICAgICAgbGFzdCBlZmZlY3QgaW4gdGhlIGNoYWluIGFjY3VtdWxhdGVzIGluIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciAhPSBvdXRwdXQgYnVmZmVyCkBAIC01NjQwLDExICs1NzUxLDYgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSykgPT0gRUZGRUNUX0ZMQUdfREVWSUNFX0lORCkgewotICAgICAgICAvLyBjb252ZXJ0IGRldmljZSBiaXQgZmllbGQgZnJvbSBBdWRpb1N5c3RlbSB0byBFZmZlY3RBcGkgZm9ybWF0LgotICAgICAgICBkZXZpY2UgPSBkZXZpY2VBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKGRldmljZSk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQogICAgICAgICBzdGF0dXNfdCBjbWRTdGF0dXM7CiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yoc3RhdHVzX3QpOwogICAgICAgICBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCkBAIC01NjY1LDE3ICs1NzcxLDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCkgewotICAgICAgICAvLyBjb252ZXJ0IGF1ZGlvIG1vZGUgZnJvbSBBdWRpb1N5c3RlbSB0byBFZmZlY3RBcGkgZm9ybWF0LgotICAgICAgICBpbnQgZWZmZWN0TW9kZSA9IG1vZGVBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKG1vZGUpOwotICAgICAgICBpZiAoZWZmZWN0TW9kZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KICAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwogICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKICAgICAgICAgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVmZmVjdE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTU2ODUsNTMgKzU3ODYsNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLS8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgb3IgYXVkaW9fZGV2aWNlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKLWNvbnN0IHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzRGV2aWNlQ29udlRhYmxlW10gPSB7Ci0gICAgREVWSUNFX0VBUlBJRUNFLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9FQVJQSUVDRQotICAgIERFVklDRV9TUEVBS0VSLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSCi0gICAgREVWSUNFX1dJUkVEX0hFQURTRVQsIC8vIGNhc2UgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVAotICAgIERFVklDRV9XSVJFRF9IRUFEUEhPTkUsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORQotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPCi0gICAgREVWSUNFX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUCi0gICAgREVWSUNFX0JMVUVUT09USF9TQ09fQ0FSS0lULCAvLyAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFAsIC8vICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUAotICAgIERFVklDRV9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTCi0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIKLSAgICBERVZJQ0VfQVVYX0RJR0lUQUwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQVVYX0RJR0lUQUwKLX07Ci0KLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkZXZpY2VBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKHVpbnQzMl90IGRldmljZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2VPdXQgPSAwOwotICAgIHdoaWxlIChkZXZpY2UpIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2NseihkZXZpY2UpOwotICAgICAgICBkZXZpY2UgJj0gfigxIDw8IGkpOwotICAgICAgICBpZiAoaSA+PSBzaXplb2Yoc0RldmljZUNvbnZUYWJsZSkvc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICAgICAgTE9HRSgiZGV2aWNlIGNvbnZlcnRpb24gZXJyb3IgZm9yIEF1ZGlvU3lzdGVtIGRldmljZSAweCUwOHgiLCBkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGV2aWNlT3V0IHw9ICh1aW50MzJfdClzRGV2aWNlQ29udlRhYmxlW2ldOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlT3V0OwotfQotCi0vLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19tb2RlIG9yIGF1ZGlvX21vZGVfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAotY29uc3QgdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNNb2RlQ29udlRhYmxlW10gPSB7Ci0gICAgQVVESU9fRUZGRUNUX01PREVfTk9STUFMLCAgIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTAotICAgIEFVRElPX0VGRkVDVF9NT0RFX1JJTkdUT05FLCAvLyBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORQotICAgIEFVRElPX0VGRkVDVF9NT0RFX0lOX0NBTEwsICAvLyBBdWRpb1N5c3RlbTo6TU9ERV9JTl9DQUxMCi0gICAgQVVESU9fRUZGRUNUX01PREVfSU5fQ0FMTCAgIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NPTU1VTklDQVRJT04sIHNhbWUgY29udmVyc2lvbiBhcyBmb3IgTU9ERV9JTl9DQUxMCi19OwotCi1pbnQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6Om1vZGVBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKHVpbnQzMl90IG1vZGUpCi17Ci0gICAgaW50IG1vZGVPdXQgPSAtMTsKLSAgICBpZiAobW9kZSA8IHNpemVvZihzTW9kZUNvbnZUYWJsZSkgLyBzaXplb2YodWludDMyX3QpKSB7Ci0gICAgICAgIG1vZGVPdXQgPSAoaW50KXNNb2RlQ29udlRhYmxlW21vZGVdOwotICAgIH0KLSAgICByZXR1cm4gbW9kZU91dDsKLX0KLQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtNTc2Myw3ICs1ODE3LDcgQEAKICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLmNsb2NrU2VxLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMF0sIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsxXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbMl0sCiAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5ub2RlWzNdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs0XSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNV0pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDRYXG5cdFx0LSBmbGFnczogJTA4WFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WFxuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmFwaVZlcnNpb24sCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpAQCAtNjAyNiwxMSArNjA4MCwxMSBAQAogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDaGFpbihjb25zdCB3cDxUaHJlYWRCYXNlPiYgd1RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQotICAgIDogbVRocmVhZCh3VGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1Pd25JbkJ1ZmZlcihmYWxzZSksCi0gICAgICAgICAgICBtVm9sdW1lQ3RybElkeCgtMSksIG1MZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbVJpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwKLSAgICAgICAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKQorICAgIDogbVRocmVhZCh3VGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1UcmFja0NudCgwKSwKKyAgICAgIG1Pd25JbkJ1ZmZlcihmYWxzZSksIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAorICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCiB7Ci0gICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7CisgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46On5FZmZlY3RDaGFpbigpCkBAIC02MDgxLDEyICs2MTM1LDE5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgIGJvb2wgaXNHbG9iYWxTZXNzaW9uID0gKG1TZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCkgfHwKLSAgICAgICAgICAgIChtU2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSk7CisgICAgYm9vbCBpc0dsb2JhbFNlc3Npb24gPSAobVNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHx8CisgICAgICAgICAgICAobVNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSk7CiAgICAgYm9vbCB0cmFja3NPblNlc3Npb24gPSBmYWxzZTsKICAgICBpZiAoIWlzR2xvYmFsU2Vzc2lvbikgewotICAgICAgICB0cmFja3NPblNlc3Npb24gPQotICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5oYXNBdWRpb1Nlc3Npb24obVNlc3Npb25JZCkgJiBQbGF5YmFja1RocmVhZDo6VFJBQ0tfU0VTU0lPTjsKKyAgICAgICAgdHJhY2tzT25TZXNzaW9uID0gKHRyYWNrQ250KCkgIT0gMCk7CisgICAgfQorCisgICAgLy8gaWYgbm8gdHJhY2sgaXMgYWN0aXZlLCBpbnB1dCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGhlcmUgYXMgdGhlIG1peGVyIHByb2Nlc3MKKyAgICAvLyB3aWxsIG5vdCBkbyBpdAorICAgIGlmICh0cmFja3NPblNlc3Npb24gJiYKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrQ250KCkgPT0gMCkgeworICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiBwbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOwogICAgIH0KIAogICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOwpAQCAtNjA5OSwxMyArNjE2MCw2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgbUVmZmVjdHNbaV0tPnVwZGF0ZVN0YXRlKCk7CiAgICAgfQotICAgIC8vIGlmIG5vIHRyYWNrIGlzIGFjdGl2ZSwgaW5wdXQgYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBoZXJlIGFzIHRoZSBtaXhlciBwcm9jZXNzCi0gICAgLy8gd2lsbCBub3QgZG8gaXQKLSAgICBpZiAodHJhY2tzT25TZXNzaW9uICYmCi0gICAgICAgIGFjdGl2ZVRyYWNrcygpID09IDApIHsKLSAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogcGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOwotICAgICAgICBtZW1zZXQobUluQnVmZmVyLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICB9CiB9CiAKIC8vIGFkZEVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IGVjM2QyMDIuLmYzMzcxYmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTMyLDEyICszMiwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2hhbC5oPgogCiAjaW5jbHVkZSAiQXVkaW9CdWZmZXJQcm92aWRlci5oIgogCkBAIC00OSw3ICs1MSw2IEBACiBjbGFzcyBBdWRpb0J1ZmZlcjsKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyOwogCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQpAQCAtNzUsOCArNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC04Niw3ICs4Nyw3IEBACiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGludCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChpbnQgb3V0cHV0KSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeShpbnQgb3V0cHV0KSBjb25zdDsKIApAQCAtMTQ2LDEwICsxNDcsNiBAQAogCiAgICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZEVmZmVjdExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CkBAIC0xOTIsOCArMTg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0yMTEsNiArMjA4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXIoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QXVkaW9GbGluZ2VyKCk7CiAKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisgICAgYXVkaW9faHdfZGV2aWNlX3QqICAgICAgZmluZFN1aXRhYmxlSHdEZXZfbCh1aW50MzJfdCBkZXZpY2VzKTsKIAogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0ZXMuCiAgICAgc3RhdHVzX3QgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTI2OCw2ICsyNjgsOCBAQAogICAgIGNsYXNzIEVmZmVjdE1vZHVsZTsKICAgICBjbGFzcyBFZmZlY3RIYW5kbGU7CiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47CisgICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0OworICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluOwogCiAgICAgY2xhc3MgVGhyZWFkQmFzZSA6IHB1YmxpYyBUaHJlYWQgewogICAgIHB1YmxpYzoKQEAgLTI5OSw4ICszMDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC0zMjcsMTIgKzMyOSwxNCBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIGludCBmb3JtYXQoKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQoKSBjb25zdCA7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrKCkgY29uc3Q7CisKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKICAgICAgICAgICAgIHZvaWQqIGdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3Q7CkBAIC0zNTgsOSArMzYyLDExIEBACiAgICAgICAgICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1TdGF0ZTsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUNsaWVudFRpZDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZvcm1hdDsKICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZsYWdzOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOworICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ29uZmlnRXZlbnQgewpAQCAtMzczLDcgKzM3OSw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZvcm1hdCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHdha2VVcCgpICAgIHsgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7IH0KICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwpAQCAtNDA0LDEwICs0MTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiAgICAgICAgbUF1ZGlvRmxpbmdlcjsKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVBhcmFtQ29uZDsKICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1QYXJhbVN0YXR1czsKQEAgLTQ0MCw4ICs0NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKTsKQEAgLTQ5NSw3ICs1MDEsNyBAQAogICAgICAgICAgICAgdm9pZCByZXNldCgpOwogCiAgICAgICAgICAgICBib29sIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtU3RyZWFtVHlwZSA9PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fQ05UKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQpAQCAtNTI4LDggKzUzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFRyYWNrKCAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGluZ1RocmVhZCAqc291cmNlVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5PdXRwdXRUcmFjaygpOwogCkBAIC01ODEsOCArNTg3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCkBAIC02NzgsNiArNjg0LDcgQEAKIAogICAgICAgICBzdGF0dXNfdCAgICBhZGRUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwogICAgICAgICB2b2lkICAgICAgICBkZXN0cm95VHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKKyAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKIAogICAgICAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwogCkBAIC02ODksNyArNjk2LDcgQEAKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPFRyYWNrPiA+ICAgICAgIG1UcmFja3M7CiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIHVzZXMgMSBhZGRpdGlvbm5hbCBzdHJlYW0gdHlwZSBpbnRlcm5hbGx5IGZvciB0aGUgT3V0cHV0VHJhY2sgdXNlZCBieSBEdXBsaWNhdGluZ1RocmVhZAotICAgICAgICBzdHJlYW1fdHlwZV90ICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlc1tBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUyArIDFdOworICAgICAgICBzdHJlYW1fdHlwZV90ICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlc1tBVURJT19TVFJFQU1fQ05UICsgMV07CiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiAgICAgICAgICAgICAgICAgbU91dHB1dDsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwogICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lOwpAQCAtODI2LDggKzgzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFRyYWNrKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKTsKQEAgLTk5NSwxNCArMTAwMiw2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXJ0X2woKTsKICAgICAgICAgc3RhdHVzX3Qgc3RvcF9sKCk7CiAKLSAgICAgICAgLy8gdXBkYXRlIHRoaXMgdGFibGUgd2hlbiBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBvciBhdWRpb19kZXZpY2VfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qgc0RldmljZUNvbnZUYWJsZVtdOwotICAgICAgICBzdGF0aWMgdWludDMyX3QgZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBkZXZpY2UpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUgb3IgYXVkaW9fbW9kZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzTW9kZUNvbnZUYWJsZVtdOwotICAgICAgICBzdGF0aWMgaW50IG1vZGVBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKHVpbnQzMl90IG1vZGUpOwotCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgLy8gbXV0ZXggZm9yIHByb2Nlc3MsIGNvbW1hbmRzIGFuZCBoYW5kbGVzIGxpc3QgcHJvdGVjdGlvbgogICAgICAgICB3cDxUaHJlYWRCYXNlPiAgICAgIG1UaHJlYWQ7ICAgIC8vIHBhcmVudCB0aHJlYWQKICAgICAgICAgd3A8RWZmZWN0Q2hhaW4+ICAgICBtQ2hhaW47ICAgICAvLyBwYXJlbnQgZWZmZWN0IGNoYWluCkBAIC0xMDEwLDcgKzEwMDksNyBAQAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7IC8vIGF1ZGlvIHNlc3Npb24gSUQKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzY3JpcHRvcjsvLyBlZmZlY3QgZGVzY3JpcHRvciByZWNlaXZlZCBmcm9tIGVmZmVjdCBlbmdpbmUKICAgICAgICAgZWZmZWN0X2NvbmZpZ190ICAgICBtQ29uZmlnOyAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGF1ZGlvIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICBtRWZmZWN0SW50ZXJmYWNlOyAvLyBFZmZlY3QgbW9kdWxlIEMgQVBJCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgbUVmZmVjdEludGVyZmFjZTsgLy8gRWZmZWN0IG1vZHVsZSBDIEFQSQogICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIHN0YXR1cwogICAgICAgICB1aW50MzJfdCBtU3RhdGU7ICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZhdGlvbiBzdGF0ZSAoZWZmZWN0X3N0YXRlKQogICAgICAgICBWZWN0b3I8IHdwPEVmZmVjdEhhbmRsZT4gPiBtSGFuZGxlczsgICAgLy8gbGlzdCBvZiBjbGllbnQgaGFuZGxlcwpAQCAtMTEyOCw5ICsxMTI3LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbU91dEJ1ZmZlcjsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgc3RhcnRUcmFjaygpIHttQWN0aXZlVHJhY2tDbnQrKzt9Ci0gICAgICAgIHZvaWQgc3RvcFRyYWNrKCkge21BY3RpdmVUcmFja0NudC0tO30KLSAgICAgICAgaW50IGFjdGl2ZVRyYWNrcygpIHsgcmV0dXJuIG1BY3RpdmVUcmFja0NudDt9CisgICAgICAgIHZvaWQgaW5jVHJhY2tDbnQoKSB7IGFuZHJvaWRfYXRvbWljX2luYygmbVRyYWNrQ250KTsgfQorICAgICAgICB2b2lkIGRlY1RyYWNrQ250KCkgeyBhbmRyb2lkX2F0b21pY19kZWMoJm1UcmFja0NudCk7IH0KKyAgICAgICAgaW50MzJfdCB0cmFja0NudCgpIHsgcmV0dXJuIG1UcmFja0NudDt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVUcmFja0NudCgpIHsgYW5kcm9pZF9hdG9taWNfaW5jKCZtQWN0aXZlVHJhY2tDbnQpOyB9CisgICAgICAgIHZvaWQgZGVjQWN0aXZlVHJhY2tDbnQoKSB7IGFuZHJvaWRfYXRvbWljX2RlYygmbUFjdGl2ZVRyYWNrQ250KTsgfQorICAgICAgICBpbnQzMl90IGFjdGl2ZVRyYWNrQ250KCkgeyByZXR1cm4gbUFjdGl2ZVRyYWNrQ250O30KIAogICAgICAgICB1aW50MzJfdCBzdHJhdGVneSgpIHsgcmV0dXJuIG1TdHJhdGVneTsgfQogICAgICAgICB2b2lkIHNldFN0cmF0ZWd5KHVpbnQzMl90IHN0cmF0ZWd5KQpAQCAtMTE0OSw3ICsxMTUyLDggQEAKICAgICAgICAgaW50IG1TZXNzaW9uSWQ7ICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKICAgICAgICAgaW50MTZfdCAqbUluQnVmZmVyOyAgICAgICAgIC8vIGNoYWluIGlucHV0IGJ1ZmZlcgogICAgICAgICBpbnQxNl90ICptT3V0QnVmZmVyOyAgICAgICAgLy8gY2hhaW4gb3V0cHV0IGJ1ZmZlcgotICAgICAgICBpbnQgbUFjdGl2ZVRyYWNrQ250OyAgICAgICAgLy8gbnVtYmVyIG9mIGFjdGl2ZSB0cmFja3MgY29ubmVjdGVkCisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUFjdGl2ZVRyYWNrQ250OyAgLy8gbnVtYmVyIG9mIGFjdGl2ZSB0cmFja3MgY29ubmVjdGVkCisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbVRyYWNrQ250OyAgICAgICAgLy8gbnVtYmVyIG9mIHRyYWNrcyBjb25uZWN0ZWQKICAgICAgICAgYm9vbCBtT3duSW5CdWZmZXI7ICAgICAgICAgIC8vIHRydWUgaWYgdGhlIGNoYWluIG93bnMgaXRzIGlucHV0IGJ1ZmZlcgogICAgICAgICBpbnQgbVZvbHVtZUN0cmxJZHg7ICAgICAgICAgLy8gaW5kZXggb2YgaW5zZXJ0IGVmZmVjdCBoYXZpbmcgY29udHJvbCBvdmVyIHZvbHVtZQogICAgICAgICB1aW50MzJfdCBtTGVmdFZvbHVtZTsgICAgICAgLy8gcHJldmlvdXMgdm9sdW1lIG9uIGxlZnQgY2hhbm5lbApAQCAtMTE1OSwyMSArMTE2MywzNyBAQAogICAgICAgICB1aW50MzJfdCBtU3RyYXRlZ3k7IC8vIHN0cmF0ZWd5IGZvciB0aGlzIGVmZmVjdCBjaGFpbgogICAgIH07CiAKKyAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1PdXQgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAgICpod0RldjsKKyAgICAgICAgYXVkaW9fc3RyZWFtX291dF90ICAqc3RyZWFtOworCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KGF1ZGlvX2h3X2RldmljZV90ICpkZXYsIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0KSA6CisgICAgICAgICAgICBod0RldihkZXYpLCBzdHJlYW0ob3V0KSB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbiB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICAgKmh3RGV2OworICAgICAgICBhdWRpb19zdHJlYW1faW5fdCAgICpzdHJlYW07CisKKyAgICAgICAgQXVkaW9TdHJlYW1JbihhdWRpb19od19kZXZpY2VfdCAqZGV2LCBhdWRpb19zdHJlYW1faW5fdCAqaW4pIDoKKyAgICAgICAgICAgIGh3RGV2KGRldiksIHN0cmVhbShpbikge30KKyAgICB9OworCiAgICAgZnJpZW5kIGNsYXNzIFJlY29yZFRocmVhZDsKICAgICBmcmllbmQgY2xhc3MgUGxheWJhY2tUaHJlYWQ7CiAKLQogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgd3A8Q2xpZW50PiA+ICAgICBtQ2xpZW50czsKIAogICAgICAgICAgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2s7Ci0gICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSogICAgICAgICAgICAgbUF1ZGlvSGFyZHdhcmU7CisgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QqICAgICAgICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldjsKKyAgICAgICAgICAgICAgICBWZWN0b3I8YXVkaW9faHdfZGV2aWNlX3QqPiAgICAgICAgICBtQXVkaW9Id0RldnM7CiAgICAgbXV0YWJsZSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzOwogCiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludCwgc3A8UGxheWJhY2tUaHJlYWQ+ID4gIG1QbGF5YmFja1RocmVhZHM7Ci0gICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQ6OnN0cmVhbV90eXBlX3QgICAgICAgbVN0cmVhbVR5cGVzW0F1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTXTsKKyAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZDo6c3RyZWFtX3R5cGVfdCAgICAgICBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVF07CiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKIApAQCAtMTE4NSw2ICsxMjA1LDcgQEAKIAogfTsKIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzYzAzMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvSGFyZHdhcmUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSAiQXVkaW9IYXJkd2FyZUdlbmVyaWMuaCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrQXVkaW9EZXZpY2VOYW1lID0gIi9kZXYvZWFjIjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb0hhcmR3YXJlR2VuZXJpYzo6QXVkaW9IYXJkd2FyZUdlbmVyaWMoKQotICAgIDogbU91dHB1dCgwKSwgbUlucHV0KDApLCAgbUZkKC0xKSwgbU1pY011dGUoZmFsc2UpCi17Ci0gICAgbUZkID0gOjpvcGVuKGtBdWRpb0RldmljZU5hbWUsIE9fUkRXUik7Ci19Ci0KLUF1ZGlvSGFyZHdhcmVHZW5lcmljOjp+QXVkaW9IYXJkd2FyZUdlbmVyaWMoKQotewotICAgIGlmIChtRmQgPj0gMCkgOjpjbG9zZShtRmQpOwotICAgIGNsb3NlT3V0cHV0U3RyZWFtKChBdWRpb1N0cmVhbU91dCAqKW1PdXRwdXQpOwotICAgIGNsb3NlSW5wdXRTdHJlYW0oKEF1ZGlvU3RyZWFtSW4gKiltSW5wdXQpOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6aW5pdENoZWNrKCkKLXsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgaWYgKDo6YWNjZXNzKGtBdWRpb0RldmljZU5hbWUsIE9fUkRXUikgPT0gTk9fRVJST1IpCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi1BdWRpb1N0cmVhbU91dCogQXVkaW9IYXJkd2FyZUdlbmVyaWM6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQotewotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLQotICAgIC8vIG9ubHkgb25lIG91dHB1dCBzdHJlYW0gYWxsb3dlZAotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgICpzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgbmV3IG91dHB1dCBzdHJlYW0KLSAgICBBdWRpb1N0cmVhbU91dEdlbmVyaWMqIG91dCA9IG5ldyBBdWRpb1N0cmVhbU91dEdlbmVyaWMoKTsKLSAgICBzdGF0dXNfdCBsU3RhdHVzID0gb3V0LT5zZXQodGhpcywgbUZkLCBkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtT3V0cHV0ID0gb3V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZSBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBtT3V0cHV0OwotfQotCi12b2lkIEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpjbG9zZU91dHB1dFN0cmVhbShBdWRpb1N0cmVhbU91dCogb3V0KSB7Ci0gICAgaWYgKG1PdXRwdXQgJiYgb3V0ID09IG1PdXRwdXQpIHsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXQ7Ci0gICAgICAgIG1PdXRwdXQgPSAwOwotICAgIH0KLX0KLQotQXVkaW9TdHJlYW1JbiogQXVkaW9IYXJkd2FyZUdlbmVyaWM6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMsIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQotewotICAgIC8vIGNoZWNrIGZvciB2YWxpZCBpbnB1dCBzb3VyY2UKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0lucHV0RGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcylkZXZpY2VzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0KLSAgICAvLyBvbmx5IG9uZSBpbnB1dCBzdHJlYW0gYWxsb3dlZAotICAgIGlmIChtSW5wdXQpIHsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgKnN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBuZXcgb3V0cHV0IHN0cmVhbQotICAgIEF1ZGlvU3RyZWFtSW5HZW5lcmljKiBpbiA9IG5ldyBBdWRpb1N0cmVhbUluR2VuZXJpYygpOwotICAgIHN0YXR1c190IGxTdGF0dXMgPSBpbi0+c2V0KHRoaXMsIG1GZCwgZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSwgYWNvdXN0aWNzKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtSW5wdXQgPSBpbjsKLSAgICB9IGVsc2UgewotICAgICAgICBkZWxldGUgaW47Ci0gICAgfQotICAgIHJldHVybiBtSW5wdXQ7Ci19Ci0KLXZvaWQgQXVkaW9IYXJkd2FyZUdlbmVyaWM6OmNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pIHsKLSAgICBpZiAobUlucHV0ICYmIGluID09IG1JbnB1dCkgewotICAgICAgICBkZWxldGUgbUlucHV0OwotICAgICAgICBtSW5wdXQgPSAwOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUdlbmVyaWM6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHYpCi17Ci0gICAgLy8gSW1wbGVtZW50OiBzZXQgdm9pY2Ugdm9sdW1lCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHYpCi17Ci0gICAgLy8gSW1wbGVtZW50OiBzZXQgbWFzdGVyIHZvbHVtZQotICAgIC8vIHJldHVybiBlcnJvciAtIHNvZnR3YXJlIG1peGVyIHdpbGwgaGFuZGxlIGl0Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6c2V0TWljTXV0ZShib29sIHN0YXRlKQotewotICAgIG1NaWNNdXRlID0gc3RhdGU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6Z2V0TWljTXV0ZShib29sKiBzdGF0ZSkKLXsKLSAgICAqc3RhdGUgPSBtTWljTXV0ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kKCJBdWRpb0hhcmR3YXJlR2VuZXJpYzo6ZHVtcEludGVybmFsc1xuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtRmQ6ICVkIG1NaWNNdXRlOiAlc1xuIiwgIG1GZCwgbU1pY011dGU/ICJ0cnVlIjogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0gICAgaWYgKG1JbnB1dCkgewotICAgICAgICBtSW5wdXQtPmR1bXAoZmQsIGFyZ3MpOwotICAgIH0KLSAgICBpZiAobU91dHB1dCkgewotICAgICAgICBtT3V0cHV0LT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6c2V0KAotICAgICAgICBBdWRpb0hhcmR3YXJlR2VuZXJpYyAqaHcsCi0gICAgICAgIGludCBmZCwKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgaW50ICpwRm9ybWF0LAotICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICB1aW50MzJfdCAqcFJhdGUpCi17Ci0gICAgaW50IGxGb3JtYXQgPSBwRm9ybWF0ID8gKnBGb3JtYXQgOiAwOwotICAgIHVpbnQzMl90IGxDaGFubmVscyA9IHBDaGFubmVscyA/ICpwQ2hhbm5lbHMgOiAwOwotICAgIHVpbnQzMl90IGxSYXRlID0gcFJhdGUgPyAqcFJhdGUgOiAwOwotCi0gICAgLy8gZml4IHVwIGRlZmF1bHRzCi0gICAgaWYgKGxGb3JtYXQgPT0gMCkgbEZvcm1hdCA9IGZvcm1hdCgpOwotICAgIGlmIChsQ2hhbm5lbHMgPT0gMCkgbENoYW5uZWxzID0gY2hhbm5lbHMoKTsKLSAgICBpZiAobFJhdGUgPT0gMCkgbFJhdGUgPSBzYW1wbGVSYXRlKCk7Ci0KLSAgICAvLyBjaGVjayB2YWx1ZXMKLSAgICBpZiAoKGxGb3JtYXQgIT0gZm9ybWF0KCkpIHx8Ci0gICAgICAgICAgICAobENoYW5uZWxzICE9IGNoYW5uZWxzKCkpIHx8Ci0gICAgICAgICAgICAobFJhdGUgIT0gc2FtcGxlUmF0ZSgpKSkgewotICAgICAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICAgICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGNoYW5uZWxzKCk7Ci0gICAgICAgIGlmIChwUmF0ZSkgKnBSYXRlID0gc2FtcGxlUmF0ZSgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGxGb3JtYXQ7Ci0gICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGxDaGFubmVsczsKLSAgICBpZiAocFJhdGUpICpwUmF0ZSA9IGxSYXRlOwotCi0gICAgbUF1ZGlvSGFyZHdhcmUgPSBodzsKLSAgICBtRmQgPSBmZDsKLSAgICBtRGV2aWNlID0gZGV2aWNlczsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6fkF1ZGlvU3RyZWFtT3V0R2VuZXJpYygpCi17Ci19Ci0KLXNzaXplX3QgQXVkaW9TdHJlYW1PdXRHZW5lcmljOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBzc2l6ZV90KDo6d3JpdGUobUZkLCBidWZmZXIsIGJ5dGVzKSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6c3RhbmRieSgpCi17Ci0gICAgLy8gSW1wbGVtZW50OiBhdWRpbyBoYXJkd2FyZSB0byBzdGFuZGJ5IG1vZGUKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9TdHJlYW1PdXRHZW5lcmljOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRzYW1wbGUgcmF0ZTogJWRcbiIsIHNhbXBsZVJhdGUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0YnVmZmVyIHNpemU6ICVkXG4iLCBidWZmZXJTaXplKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGNoYW5uZWxzOiAlZFxuIiwgY2hhbm5lbHMoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0Zm9ybWF0OiAlZFxuIiwgZm9ybWF0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGRldmljZTogJWRcbiIsIG1EZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdG1BdWRpb0hhcmR3YXJlOiAlcFxuIiwgbUF1ZGlvSGFyZHdhcmUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdG1GZDogJWRcbiIsIG1GZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dEdlbmVyaWM6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaW50IGRldmljZTsKLSAgICBMT0dWKCJzZXRQYXJhbWV0ZXJzKCkgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLQotICAgIGlmIChwYXJhbS5nZXRJbnQoa2V5LCBkZXZpY2UpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIGlmIChwYXJhbS5zaXplKCkpIHsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1TdHJpbmc4IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpOwotCi0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBwYXJhbS5hZGRJbnQoa2V5LCAoaW50KW1EZXZpY2UpOwotICAgIH0KLQotICAgIExPR1YoImdldFBhcmFtZXRlcnMoKSAlcyIsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dEdlbmVyaWM6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpCi17Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHJlY29yZCBmdW5jdGlvbnMKLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5HZW5lcmljOjpzZXQoCi0gICAgICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICpodywKLSAgICAgICAgaW50IGZkLAotICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICBpbnQgKnBGb3JtYXQsCi0gICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCi0gICAgICAgIHVpbnQzMl90ICpwUmF0ZSwKLSAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpCi17Ci0gICAgaWYgKHBGb3JtYXQgPT0gMCB8fCBwQ2hhbm5lbHMgPT0gMCB8fCBwUmF0ZSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIExPR1YoIkF1ZGlvU3RyZWFtSW5HZW5lcmljOjpzZXQoJXAsICVkLCAlZCwgJWQsICV1KSIsIGh3LCBmZCwgKnBGb3JtYXQsICpwQ2hhbm5lbHMsICpwUmF0ZSk7Ci0gICAgLy8gY2hlY2sgdmFsdWVzCi0gICAgaWYgKCgqcEZvcm1hdCAhPSBmb3JtYXQoKSkgfHwKLSAgICAgICAgKCpwQ2hhbm5lbHMgIT0gY2hhbm5lbHMoKSkgfHwKLSAgICAgICAgKCpwUmF0ZSAhPSBzYW1wbGVSYXRlKCkpKSB7Ci0gICAgICAgIExPR0UoIkVycm9yIG9wZW5pbmcgaW5wdXQgY2hhbm5lbCIpOwotICAgICAgICAqcEZvcm1hdCA9IGZvcm1hdCgpOwotICAgICAgICAqcENoYW5uZWxzID0gY2hhbm5lbHMoKTsKLSAgICAgICAgKnBSYXRlID0gc2FtcGxlUmF0ZSgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIG1BdWRpb0hhcmR3YXJlID0gaHc7Ci0gICAgbUZkID0gZmQ7Ci0gICAgbURldmljZSA9IGRldmljZXM7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1BdWRpb1N0cmVhbUluR2VuZXJpYzo6fkF1ZGlvU3RyZWFtSW5HZW5lcmljKCkKLXsKLX0KLQotc3NpemVfdCBBdWRpb1N0cmVhbUluR2VuZXJpYzo6cmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpCi17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIExPR0UoIkF0dGVtcHQgdG8gcmVhZCBmcm9tIHVub3BlbmVkIGRldmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIDo6cmVhZChtRmQsIGJ1ZmZlciwgYnl0ZXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUluR2VuZXJpYzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9TdHJlYW1JbkdlbmVyaWM6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdHNhbXBsZSByYXRlOiAlZFxuIiwgc2FtcGxlUmF0ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRidWZmZXIgc2l6ZTogJWRcbiIsIGJ1ZmZlclNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0Y2hhbm5lbHM6ICVkXG4iLCBjaGFubmVscygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRmb3JtYXQ6ICVkXG4iLCBmb3JtYXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0ZGV2aWNlOiAlZFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bUF1ZGlvSGFyZHdhcmU6ICVwXG4iLCBtQXVkaW9IYXJkd2FyZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bUZkOiAlZFxuIiwgbUZkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5HZW5lcmljOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKLSAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGludCBkZXZpY2U7Ci0gICAgTE9HVigic2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocGFyYW0uZ2V0SW50KGtleSwgZGV2aWNlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBpZiAocGFyYW0uc2l6ZSgpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotU3RyaW5nOCBBdWRpb1N0cmVhbUluR2VuZXJpYzo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpOwotCi0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBwYXJhbS5hZGRJbnQoa2V5LCAoaW50KW1EZXZpY2UpOwotICAgIH0KLQotICAgIExPR1YoImdldFBhcmFtZXRlcnMoKSAlcyIsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRlNzhkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19IQVJEV0FSRV9HRU5FUklDX0gKLSNkZWZpbmUgQU5EUk9JRF9BVURJT19IQVJEV0FSRV9HRU5FUklDX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvSGFyZHdhcmVCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb0hhcmR3YXJlR2VuZXJpYzsKLQotY2xhc3MgQXVkaW9TdHJlYW1PdXRHZW5lcmljIDogcHVibGljIEF1ZGlvU3RyZWFtT3V0IHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0R2VuZXJpYygpIDogbUF1ZGlvSGFyZHdhcmUoMCksIG1GZCgtMSkge30KLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1N0cmVhbU91dEdlbmVyaWMoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0KAotICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMgKmh3LAotICAgICAgICAgICAgaW50IG1GZCwKLSAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICBpbnQgKnBGb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgdWludDMyX3QgKnBSYXRlKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIDQ0MTAwOyB9Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gNDA5NjsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOyB9Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDIwOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0gICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi1wcml2YXRlOgotICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICptQXVkaW9IYXJkd2FyZTsKLSAgICBNdXRleCAgIG1Mb2NrOwotICAgIGludCAgICAgbUZkOwotICAgIHVpbnQzMl90IG1EZXZpY2U7Ci19OwotCi1jbGFzcyBBdWRpb1N0cmVhbUluR2VuZXJpYyA6IHB1YmxpYyBBdWRpb1N0cmVhbUluIHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW5HZW5lcmljKCkgOiBtQXVkaW9IYXJkd2FyZSgwKSwgbUZkKC0xKSB7fQotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvU3RyZWFtSW5HZW5lcmljKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldCgKLSAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICpodywKLSAgICAgICAgICAgIGludCBtRmQsCi0gICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgaW50ICpwRm9ybWF0LAotICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgIHVpbnQzMl90ICpwUmF0ZSwKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIDgwMDA7IH0KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiAzMjA7IH0KLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGNoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fTU9OTzsgfQotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEdhaW4oZmxvYXQgZ2FpbikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KLSAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YW5kYnkoKSB7IHJldHVybiBOT19FUlJPUjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotcHJpdmF0ZToKLSAgICBBdWRpb0hhcmR3YXJlR2VuZXJpYyAqbUF1ZGlvSGFyZHdhcmU7Ci0gICAgTXV0ZXggICBtTG9jazsKLSAgICBpbnQgICAgIG1GZDsKLSAgICB1aW50MzJfdCBtRGV2aWNlOwotfTsKLQotCi1jbGFzcyBBdWRpb0hhcmR3YXJlR2VuZXJpYyA6IHB1YmxpYyBBdWRpb0hhcmR3YXJlQmFzZQotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb0hhcmR3YXJlR2VuZXJpYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBtaWMgbXV0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE1pY011dGUoYm9vbCogc3RhdGUpOwotCi0gICAgLy8gY3JlYXRlIEkvTyBzdHJlYW1zCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbU91dCogb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICBpbnQgKmZvcm1hdD0wLAotICAgICAgICAgICAgdWludDMyX3QgKmNoYW5uZWxzPTAsCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZT0wLAotICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpOwotCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbUluKiBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgaW50ICpmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHMsCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0R2VuZXJpYyogb3V0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW5HZW5lcmljKiBpbik7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi1wcml2YXRlOgotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIEF1ZGlvU3RyZWFtT3V0R2VuZXJpYyAgICptT3V0cHV0OwotICAgIEF1ZGlvU3RyZWFtSW5HZW5lcmljICAgICptSW5wdXQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NaWNNdXRlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9BVURJT19IQVJEV0FSRV9HRU5FUklDX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4ZTRjMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2RlZmluZSBMT0dfVEFHICJBdWRpb0hhcmR3YXJlSW50ZXJmYWNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIkF1ZGlvSGFyZHdhcmVTdHViLmgiCi0jaW5jbHVkZSAiQXVkaW9IYXJkd2FyZUdlbmVyaWMuaCIKLSNpZmRlZiBXSVRIX0EyRFAKLSNpbmNsdWRlICJBMmRwQXVkaW9JbnRlcmZhY2UuaCIKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX0FVRElPX0RVTVAKLSNpbmNsdWRlICJBdWRpb0R1bXBJbnRlcmZhY2UuaCIKLSNlbmRpZgotCi0KLS8vIGNoYW5nZSB0byAxIHRvIGxvZyByb3V0aW5nIGNhbGxzCi0jZGVmaW5lIExPR19ST1VUSU5HX0NBTExTIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jaWYgTE9HX1JPVVRJTkdfQ0FMTFMKLXN0YXRpYyBjb25zdCBjaGFyKiByb3V0aW5nTW9kZVN0cmluZ3NbXSA9Ci17Ci0gICAgIk9VVCBPRiBSQU5HRSIsCi0gICAgIklOVkFMSUQiLAotICAgICJDVVJSRU5UIiwKLSAgICAiTk9STUFMIiwKLSAgICAiUklOR1RPTkUiLAotICAgICJJTl9DQUxMIiwKLSAgICAiSU5fQ09NTVVOSUNBVElPTiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiByb3V0ZU5vbmUgPSAiTk9ORSI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBkaXNwbGF5TW9kZShpbnQgbW9kZSkKLXsKLSAgICBpZiAoKG1vZGUgPCBBdWRpb1N5c3RlbTo6TU9ERV9JTlZBTElEKSB8fCAobW9kZSA+PSBBdWRpb1N5c3RlbTo6TlVNX01PREVTKSkKLSAgICAgICAgcmV0dXJuIHJvdXRpbmdNb2RlU3RyaW5nc1swXTsKLSAgICByZXR1cm4gcm91dGluZ01vZGVTdHJpbmdzW21vZGUrM107Ci19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlOjpjcmVhdGUoKQotewotICAgIC8qCi0gICAgICogRklYTUU6IFRoaXMgY29kZSBuZWVkcyB0byBpbnN0YW50aWF0ZSB0aGUgY29ycmVjdCBhdWRpbyBkZXZpY2UKLSAgICAgKiBpbnRlcmZhY2UuIEZvciBub3cgLSB3ZSB1c2UgY29tcGlsZS10aW1lIHN3aXRjaGVzLgotICAgICAqLwotICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3ID0gMDsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0KLSNpZmRlZiBHRU5FUklDX0FVRElPCi0gICAgaHcgPSBuZXcgQXVkaW9IYXJkd2FyZUdlbmVyaWMoKTsKLSNlbHNlCi0gICAgLy8gaWYgcnVubmluZyBpbiBlbXVsYXRpb24gLSB1c2UgdGhlIGVtdWxhdG9yIGRyaXZlcgotICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmtlcm5lbC5xZW11IiwgdmFsdWUsIDApKSB7Ci0gICAgICAgIExPR0QoIlJ1bm5pbmcgaW4gZW11bGF0aW9uIC0gdXNpbmcgZ2VuZXJpYyBhdWRpbyBkcml2ZXIiKTsKLSAgICAgICAgaHcgPSBuZXcgQXVkaW9IYXJkd2FyZUdlbmVyaWMoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPR1YoIkNyZWF0aW5nIFZlbmRvciBTcGVjaWZpYyBBdWRpb0hhcmR3YXJlIik7Ci0gICAgICAgIGh3ID0gY3JlYXRlQXVkaW9IYXJkd2FyZSgpOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChody0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HVygiVXNpbmcgc3R1YmJlZCBhdWRpbyBoYXJkd2FyZS4gTm8gc291bmQgd2lsbCBiZSBwcm9kdWNlZC4iKTsKLSAgICAgICAgZGVsZXRlIGh3OwotICAgICAgICBodyA9IG5ldyBBdWRpb0hhcmR3YXJlU3R1YigpOwotICAgIH0KLSAgICAKLSNpZmRlZiBXSVRIX0EyRFAKLSAgICBodyA9IG5ldyBBMmRwQXVkaW9JbnRlcmZhY2UoaHcpOwotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfQVVESU9fRFVNUAotICAgIC8vIFRoaXMgY29kZSBhZGRzIGEgcmVjb3JkIG9mIGJ1ZmZlcnMgaW4gYSBmaWxlIHRvIHdyaXRlIGNhbGxzIG1hZGUgYnkgQXVkaW9GbGluZ2VyLgotICAgIC8vIEl0IHJlcGxhY2VzIHRoZSBjdXJyZW50IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2Ugb2JqZWN0IGJ5IGFuIGludGVybWVkaWF0ZSBvbmUgd2hpY2gKLSAgICAvLyB3aWxsIHJlY29yZCBidWZmZXJzIGluIGEgZmlsZSAoYWZ0ZXIgc2VuZGluZyB0aGVtIHRvIGhhcmR3YXJlKSBmb3IgdGVzdGluZyBwdXJwb3NlLgotICAgIC8vIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmluaW5nIHN5bWJvbCBFTkFCTEVfQVVESU9fRFVNUC4KLSAgICAvLyBUaGUgb3V0cHV0IGZpbGUgaXMgc2V0IHdpdGggc2V0UGFyYW1ldGVycygidGVzdF9jbWRfZmlsZV9uYW1lPTxuYW1lPiIpLiBQYXVzZSBhcmUgbm90IHJlY29yZGVkIGluIHRoZSBmaWxlLgotICAgIExPR1YoIm9wZW5pbmcgUENNIGR1bXAgaW50ZXJmYWNlIik7Ci0gICAgaHcgPSBuZXcgQXVkaW9EdW1wSW50ZXJmYWNlKGh3KTsgICAgLy8gcmVwbGFjZSBpbnRlcmZhY2UKLSNlbmRpZgotICAgIHJldHVybiBodzsKLX0KLQotQXVkaW9TdHJlYW1PdXQ6On5BdWRpb1N0cmVhbU91dCgpCi17Ci19Ci0KLUF1ZGlvU3RyZWFtSW46On5BdWRpb1N0cmVhbUluKCkge30KLQotQXVkaW9IYXJkd2FyZUJhc2U6OkF1ZGlvSGFyZHdhcmVCYXNlKCkKLXsKLSAgICBtTW9kZSA9IDA7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpzZXRNb2RlKGludCBtb2RlKQotewotI2lmIExPR19ST1VUSU5HX0NBTExTCi0gICAgTE9HRCgic2V0TW9kZSglcykiLCBkaXNwbGF5TW9kZShtb2RlKSk7Ci0jZW5kaWYKLSAgICBpZiAoKG1vZGUgPCAwKSB8fCAobW9kZSA+PSBBdWRpb1N5c3RlbTo6TlVNX01PREVTKSkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBpZiAobU1vZGUgPT0gbW9kZSkKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIG1Nb2RlID0gbW9kZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi1TdHJpbmc4IEF1ZGlvSGFyZHdhcmVCYXNlOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICByZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLX0KLQotLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotc2l6ZV90IEF1ZGlvSGFyZHdhcmVCYXNlOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKLXsKLSAgICBpZiAoc2FtcGxlUmF0ZSAhPSA4MDAwKSB7Ci0gICAgICAgIExPR1coImdldElucHV0QnVmZmVyU2l6ZSBiYWQgc2FtcGxpbmcgcmF0ZTogJWQiLCBzYW1wbGVSYXRlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChmb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKLSAgICAgICAgTE9HVygiZ2V0SW5wdXRCdWZmZXJTaXplIGJhZCBmb3JtYXQ6ICVkIiwgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjaGFubmVsQ291bnQgIT0gMSkgewotICAgICAgICBMT0dXKCJnZXRJbnB1dEJ1ZmZlclNpemUgYmFkIGNoYW5uZWwgY291bnQ6ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDMyMDsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OmR1bXBTdGF0ZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9IYXJkd2FyZUJhc2U6OmR1bXBTdGF0ZVxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bU1vZGU6ICVkXG4iLCBtTW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZHVtcChmZCwgYXJncyk7ICAvLyBEdW1wIHRoZSBzdGF0ZSBvZiB0aGUgY29uY3JldGUgY2hpbGQuCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4MTE1MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qIC8vZGV2aWNlL3NlcnZlcnMvQXVkaW9GbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlICJBdWRpb0hhcmR3YXJlU3R1Yi5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb0hhcmR3YXJlU3R1Yjo6QXVkaW9IYXJkd2FyZVN0dWIoKSA6IG1NaWNNdXRlKGZhbHNlKQotewotfQotCi1BdWRpb0hhcmR3YXJlU3R1Yjo6fkF1ZGlvSGFyZHdhcmVTdHViKCkKLXsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZVN0dWI6OmluaXRDaGVjaygpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1BdWRpb1N0cmVhbU91dCogQXVkaW9IYXJkd2FyZVN0dWI6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQotewotICAgIEF1ZGlvU3RyZWFtT3V0U3R1Yiogb3V0ID0gbmV3IEF1ZGlvU3RyZWFtT3V0U3R1YigpOwotICAgIHN0YXR1c190IGxTdGF0dXMgPSBvdXQtPnNldChmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICBkZWxldGUgb3V0OwotICAgIHJldHVybiAwOwotfQotCi12b2lkIEF1ZGlvSGFyZHdhcmVTdHViOjpjbG9zZU91dHB1dFN0cmVhbShBdWRpb1N0cmVhbU91dCogb3V0KQotewotICAgIGRlbGV0ZSBvdXQ7Ci19Ci0KLUF1ZGlvU3RyZWFtSW4qIEF1ZGlvSGFyZHdhcmVTdHViOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpzYW1wbGVSYXRlLAotICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICAvLyBjaGVjayBmb3IgdmFsaWQgaW5wdXQgc291cmNlCi0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNJbnB1dERldmljZSgoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMpZGV2aWNlcykpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQXVkaW9TdHJlYW1JblN0dWIqIGluID0gbmV3IEF1ZGlvU3RyZWFtSW5TdHViKCk7Ci0gICAgc3RhdHVzX3QgbFN0YXR1cyA9IGluLT5zZXQoZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSwgYWNvdXN0aWNzKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIGluOwotICAgIGRlbGV0ZSBpbjsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBBdWRpb0hhcmR3YXJlU3R1Yjo6Y2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluKiBpbikKLXsKLSAgICBkZWxldGUgaW47Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVTdHViOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlU3R1Yjo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVTdHViOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kKCJBdWRpb0hhcmR3YXJlU3R1Yjo6ZHVtcEludGVybmFsc1xuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtTWljTXV0ZTogJXNcbiIsIG1NaWNNdXRlPyAidHJ1ZSI6ICJmYWxzZSIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZVN0dWI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dFN0dWI6OnNldChpbnQgKnBGb3JtYXQsIHVpbnQzMl90ICpwQ2hhbm5lbHMsIHVpbnQzMl90ICpwUmF0ZSkKLXsKLSAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICBpZiAocENoYW5uZWxzKSAqcENoYW5uZWxzID0gY2hhbm5lbHMoKTsKLSAgICBpZiAocFJhdGUpICpwUmF0ZSA9IHNhbXBsZVJhdGUoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3NpemVfdCBBdWRpb1N0cmVhbU91dFN0dWI6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIC8vIGZha2UgdGltaW5nIGZvciBhdWRpbyBvdXRwdXQKLSAgICB1c2xlZXAoYnl0ZXMgKiAxMDAwMDAwIC8gc2l6ZW9mKGludDE2X3QpIC8gQXVkaW9TeXN0ZW06OnBvcENvdW50KGNoYW5uZWxzKCkpIC8gc2FtcGxlUmF0ZSgpKTsKLSAgICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6c3RhbmRieSgpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dFN0dWI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvU3RyZWFtT3V0U3R1Yjo6ZHVtcFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRzYW1wbGUgcmF0ZTogJWRcbiIsIHNhbXBsZVJhdGUoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRidWZmZXIgc2l6ZTogJWRcbiIsIGJ1ZmZlclNpemUoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRjaGFubmVsczogJWRcbiIsIGNoYW5uZWxzKCkpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0Zm9ybWF0OiAlZFxuIiwgZm9ybWF0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotU3RyaW5nOCBBdWRpb1N0cmVhbU91dFN0dWI6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleXMpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dFN0dWI6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpCi17Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5TdHViOjpzZXQoaW50ICpwRm9ybWF0LCB1aW50MzJfdCAqcENoYW5uZWxzLCB1aW50MzJfdCAqcFJhdGUsCi0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpCi17Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zc2l6ZV90IEF1ZGlvU3RyZWFtSW5TdHViOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcykKLXsKLSAgICAvLyBmYWtlIHRpbWluZyBmb3IgYXVkaW8gaW5wdXQKLSAgICB1c2xlZXAoYnl0ZXMgKiAxMDAwMDAwIC8gc2l6ZW9mKGludDE2X3QpIC8gQXVkaW9TeXN0ZW06OnBvcENvdW50KGNoYW5uZWxzKCkpIC8gc2FtcGxlUmF0ZSgpKTsKLSAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlcyk7Ci0gICAgcmV0dXJuIGJ5dGVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUluU3R1Yjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9TdHJlYW1JblN0dWI6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdHNhbXBsZSByYXRlOiAlZFxuIiwgc2FtcGxlUmF0ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRidWZmZXIgc2l6ZTogJWRcbiIsIGJ1ZmZlclNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0Y2hhbm5lbHM6ICVkXG4iLCBjaGFubmVscygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRmb3JtYXQ6ICVkXG4iLCBmb3JtYXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1TdHJpbmc4IEF1ZGlvU3RyZWFtSW5TdHViOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICByZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMjlkZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiAvL2RldmljZS9zZXJ2ZXJzL0F1ZGlvRmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19IQVJEV0FSRV9TVFVCX0gKLSNkZWZpbmUgQU5EUk9JRF9BVURJT19IQVJEV0FSRV9TVFVCX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvSGFyZHdhcmVCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb1N0cmVhbU91dFN0dWIgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0KGludCAqcEZvcm1hdCwgdWludDMyX3QgKnBDaGFubmVscywgdWludDMyX3QgKnBSYXRlKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiA0NDEwMDsgfQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDQwOTY7IH0KLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGNoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTzsgfQotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsgcmV0dXJuIE5PX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsgcmV0dXJuIE5PX0VSUk9SO30KLSAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLX07Ci0KLWNsYXNzIEF1ZGlvU3RyZWFtSW5TdHViIDogcHVibGljIEF1ZGlvU3RyZWFtSW4gewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0KGludCAqcEZvcm1hdCwgdWludDMyX3QgKnBDaGFubmVscywgdWludDMyX3QgKnBSYXRlLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gODAwMDsgfQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDMyMDsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05POyB9Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0R2FpbihmbG9hdCBnYWluKSB7IHJldHVybiBOT19FUlJPUjsgfQotICAgIHZpcnR1YWwgc3NpemVfdCAgICAgcmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpIHsgcmV0dXJuIE5PX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsgcmV0dXJuIE5PX0VSUk9SO30KLSAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLX07Ci0KLWNsYXNzIEF1ZGlvSGFyZHdhcmVTdHViIDogcHVibGljICBBdWRpb0hhcmR3YXJlQmFzZQotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZVN0dWIoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb0hhcmR3YXJlU3R1YigpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBtaWMgbXV0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKSB7IG1NaWNNdXRlID0gc3RhdGU7ICByZXR1cm4gIE5PX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRNaWNNdXRlKGJvb2wqIHN0YXRlKSB7ICpzdGF0ZSA9IG1NaWNNdXRlIDsgcmV0dXJuIE5PX0VSUk9SOyB9Ci0KLSAgICAvLyBjcmVhdGUgSS9PIHN0cmVhbXMKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvcm1hdD0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHM9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGU9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpOwotCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbUluKiBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgICAgICBib29sICAgICAgICBtTWljTXV0ZTsKLXByaXZhdGU6Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0hBUkRXQVJFX1NUVUJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDUwZGNkYTcuLjZlOTMxOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsNiArNjUsNyBAQAogICAgICAgICB0LT5jaGFubmVsQ291bnQgPSAyOwogICAgICAgICB0LT5lbmFibGVkID0gMDsKICAgICAgICAgdC0+Zm9ybWF0ID0gMTY7CisgICAgICAgIHQtPmNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgICAgICB0LT5idWZmZXIucmF3ID0gMDsKICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXIgPSAwOwogICAgICAgICB0LT5ob29rID0gMDsKQEAgLTE4MCwxMyArMTg1LDE4IEBACiAKICAgICBzd2l0Y2ggKHRhcmdldCkgewogICAgIGNhc2UgVFJBQ0s6Ci0gICAgICAgIGlmIChuYW1lID09IENIQU5ORUxfQ09VTlQpIHsKLSAgICAgICAgICAgIGlmICgodWludDMyX3QodmFsdWVJbnQpIDw9IE1BWF9OVU1fQ0hBTk5FTFMpICYmICh2YWx1ZUludCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ICE9IHZhbHVlSW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxDb3VudCA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfQ09VTlQsICVkKSIsIHZhbHVlSW50KTsKKyAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gKHVpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxNYXNrICE9IG1hc2spIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOworICAgICAgICAgICAgICAgIGlmICgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFMpICYmIChjaGFubmVsQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmNoYW5uZWxNYXNrID0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgbWFzayk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IDg4NDA4YTcuLjc1YzkxNzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtNjEsNyArNjEsNyBAQAogCiAgICAgICAgIC8vIHNldCBQYXJhbWV0ZXIgbmFtZXMKICAgICAgICAgLy8gZm9yIHRhcmdldCBUUkFDSwotICAgICAgICBDSEFOTkVMX0NPVU5UICAgPSAweDQwMDAsCisgICAgICAgIENIQU5ORUxfTUFTSyAgICA9IDB4NDAwMCwKICAgICAgICAgRk9STUFUICAgICAgICAgID0gMHg0MDAxLAogICAgICAgICBNQUlOX0JVRkZFUiAgICAgPSAweDQwMDIsCiAgICAgICAgIEFVWF9CVUZGRVIgICAgICA9IDB4NDAwMywKQEAgLTE1MCw2ICsxNTAsNyBAQAogICAgICAgICB1aW50OF90ICAgICBlbmFibGVkICAgICAgOiAxOwogICAgICAgICB1aW50OF90ICAgICByZXNlcnZlZDAgICAgOiAzOwogICAgICAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxNYXNrOwogCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICAgICAgICAgICAgICAgIGJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBtdXRhYmxlIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTczNDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeU1hbmFnZXJCYXNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLQotICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZTogJXgsIHN0YXRlICVkLCBhZGRyZXNzICVzIiwgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwotCi0gICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChkZXZpY2UpICE9IDEpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAoc3RybGVuKGRldmljZV9hZGRyZXNzKSA+PSBNQVhfREVWSUNFX0FERFJFU1NfTEVOKSB7Ci0gICAgICAgIExPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgYWRkcmVzczogJXMiLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2VzCi0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc091dHB1dERldmljZShkZXZpY2UpKSB7Ci0KLSNpZm5kZWYgV0lUSF9BMkRQCi0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIExPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgICB7Ci0gICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX0FWQUlMQUJMRToKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIGRldmljZSkgewotICAgICAgICAgICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIHw9IGRldmljZTsKLQotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICAgICAgLy8gaGFuZGxlIEEyRFAgZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYW5kbGVBMmRwQ29ubmVjdGlvbihkZXZpY2UsIGRldmljZV9hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICY9IH5kZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzQmx1ZXRvb3RoU2NvRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgQlQgU0NPICBkZXZpY2UsIGFkZHJlc3MgJXMiLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgU0NPIGRldmljZSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIG1TY29EZXZpY2VBZGRyZXNzID0gU3RyaW5nOChkZXZpY2VfYWRkcmVzcywgTUFYX0RFVklDRV9BRERSRVNTX0xFTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7Ci0gICAgICAgICAgICBpZiAoIShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCi0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmPSB+ZGV2aWNlOwotCi0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgICAgICAvLyBoYW5kbGUgQTJEUCBkZXZpY2UgZGlzY29ubmVjdGlvbgotICAgICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZUEyZHBEaXNjb25uZWN0aW9uKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMgfD0gZGV2aWNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0JsdWV0b290aFNjb0RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY29EZXZpY2VBZGRyZXNzID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVxdWVzdCByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgdWludDMyX3QgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgICAgICAvLyBBMkRQIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKHN0YXRlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUgJiYgQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICBjbG9zZUEyZHBPdXRwdXRzKCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICB1cGRhdGVEZXZpY2VGb3JTdHJhdGVneSgpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCBuZXdEZXZpY2UpOwotCi0gICAgICAgIGlmIChkZXZpY2UgPT0gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVCkgewotICAgICAgICAgICAgZGV2aWNlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9XSVJFRF9IRUFEU0VUOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHx8Ci0gICAgICAgICAgICAgICAgICAgZGV2aWNlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCB8fAotICAgICAgICAgICAgICAgICAgIGRldmljZSA9PSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkgewotICAgICAgICAgICAgZGV2aWNlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCi0gICAgICAgIGNhc2UgQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyB8PSBkZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7Ci0gICAgICAgICAgICBpZiAoIShtQXZhaWxhYmxlSW5wdXREZXZpY2VzICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyAmPSB+ZGV2aWNlOwotICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOwotICAgICAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgewotICAgICAgICAgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgdWludDMyX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgaWYgKG5ld0RldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGFuZ2luZyBkZXZpY2UgZnJvbSAleCB0byAleCBmb3IgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBuZXdEZXZpY2UsIGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBuZXdEZXZpY2U7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCluZXdEZXZpY2UpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGFjdGl2ZUlucHV0LCBwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLUF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUgPSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwotICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBpZiAoZGV2aWNlICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMpIHsKLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICBhZGRyZXNzICE9ICIiICYmIG1BMmRwRGV2aWNlQWRkcmVzcyAhPSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzQmx1ZXRvb3RoU2NvRGV2aWNlKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICBhZGRyZXNzICE9ICIiICYmIG1TY29EZXZpY2VBZGRyZXNzICE9IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChBdWRpb1N5c3RlbTo6aXNJbnB1dERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgJiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXRlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFBob25lU3RhdGUoaW50IHN0YXRlKQotewotICAgIExPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICB1aW50MzJfdCBuZXdEZXZpY2UgPSAwOwotICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQXVkaW9TeXN0ZW06Ok5VTV9NT0RFUykgewotICAgICAgICBMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKLSAgICAgICAgTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIExPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKLSAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKLSAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOwotICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKLQotICAgIC8vIGFyZSB3ZSBlbnRlcmluZyBvciBzdGFydGluZyBhIGNhbGwKLSAgICBpZiAoIWlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIExPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3RhcnRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgIWlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIExPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBleGl0aW5nIGEgY2FsbAotICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgICAgIGZvcmNlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpIHsKLSAgICAgICAgTE9HVigiICBTd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUAotICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgICAgIGZvcmNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwotI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSNlbmRpZgotICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCk7Ci0KLSAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAotICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgbmV3RGV2aWNlID09IDApIHsKLSAgICAgICAgbmV3RGV2aWNlID0gaHdPdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICB9Ci0KLSAgICAvLyB3aGVuIGNoYW5naW5nIGZyb20gcmluZyB0b25lIHRvIGluIGNhbGwgbW9kZSwgbXV0ZSB0aGUgcmluZ2luZyB0b25lCi0gICAgLy8gaW1tZWRpYXRlbHkgYW5kIGRlbGF5IHRoZSByb3V0ZSBjaGFuZ2UgdG8gYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lCi0gICAgLy8gdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgotICAgIGludCBkZWxheU1zID0gMDsKLSAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkgJiYgb2xkU3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfUklOR1RPTkUpIHsKLSAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBjaGFuZ2UgY29tbWFuZCBieSB0d2ljZSB0aGUgb3V0cHV0IGxhdGVuY3kgdG8gaGF2ZSBzb21lIG1hcmdpbgotICAgICAgICAvLyBhbmQgYmUgc3VyZSB0aGF0IGF1ZGlvIGJ1ZmZlcnMgbm90IHlldCBhZmZlY3RlZCBieSB0aGUgbXV0ZSBhcmUgb3V0IHdoZW4KLSAgICAgICAgLy8gd2UgYWN0dWFsbHkgYXBwbHkgdGhlIHJvdXRlIGNoYW5nZQotICAgICAgICBkZWxheU1zID0gaHdPdXRwdXREZXNjLT5tTGF0ZW5jeSoyOwotICAgICAgICBzZXRTdHJlYW1NdXRlKEF1ZGlvU3lzdGVtOjpSSU5HLCB0cnVlLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgIH0KLQotICAgIC8vIGNoYW5nZSByb3V0aW5nIGlzIG5lY2Vzc2FyeQotICAgIHNldE91dHB1dERldmljZShtSGFyZHdhcmVPdXRwdXQsIG5ld0RldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotCi0gICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQotICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewotICAgICAgICBMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIC8vIHVubXV0ZSB0aGUgcmluZ2luZyB0b25lIGFmdGVyIGEgc3VmZmljaWVudCBkZWxheSBpZiBpdCB3YXMgbXV0ZWQgYmVmb3JlCi0gICAgICAgIC8vIHNldHRpbmcgb3V0cHV0IGRldmljZSBhYm92ZQotICAgICAgICBpZiAob2xkU3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfUklOR1RPTkUpIHsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoQXVkaW9TeXN0ZW06OlJJTkcsIGZhbHNlLCBtSGFyZHdhcmVPdXRwdXQsIE1VVEVfVElNRV9NUyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfUklOR1RPTkUgJiYKLSAgICAgICAgaXNTdHJlYW1BY3RpdmUoQXVkaW9TeXN0ZW06Ok1VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzaykKLXsKLSAgICBMT0dWKCJzZXRSaW5nZXJNb2RlKCkgbW9kZSAleCwgbWFzayAleCIsIG1vZGUsIG1hc2spOwotCi0gICAgbVJpbmdlck1vZGUgPSBtb2RlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZykKLXsKLSAgICBMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbVBob25lU3RhdGUpOwotCi0gICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOwotICAgIHN3aXRjaCh1c2FnZSkgewotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OOgotICAgICAgICBpZiAoY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIExPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkZPUl9NRURJQToKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0JUX0EyRFAgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0FOQUxPR19ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIExPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6Rk9SX1JFQ09SRDoKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkUpIHsKLSAgICAgICAgICAgIExPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkZPUl9ET0NLOgotICAgICAgICBpZiAoY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfREVTS19ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9BTkFMT0dfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9ESUdJVEFMX0RPQ0spIHsKLSAgICAgICAgICAgIExPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQotICAgIHVpbnQzMl90IG5ld0RldmljZSA9IGdldE5ld0RldmljZShtSGFyZHdhcmVPdXRwdXQsIGZhbHNlKTsKLSNpZmRlZiBXSVRIX0EyRFAKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0jZW5kaWYKLSAgICB1cGRhdGVEZXZpY2VGb3JTdHJhdGVneSgpOwotICAgIHNldE91dHB1dERldmljZShtSGFyZHdhcmVPdXRwdXQsIG5ld0RldmljZSk7Ci0gICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsKSB7Ci0gICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhtSGFyZHdhcmVPdXRwdXQsIG5ld0RldmljZSwgMCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOwotICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKLSAgICAgICAgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOwotICAgICAgICBpZiAobmV3RGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgewotICAgICAgICAgICAgTE9HVigic2V0Rm9yY2VVc2UoKSBjaGFuZ2luZyBkZXZpY2UgZnJvbSAleCB0byAleCBmb3IgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIG5ld0RldmljZSwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gbmV3RGV2aWNlOwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KW5ld0RldmljZSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhhY3RpdmVJbnB1dCwgcGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSkKLXsKLSAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpCi17Ci0gICAgTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwotICAgIGlmIChzdHJjbXAocHJvcGVydHksICJyby5jYW1lcmEuc291bmQuZm9yY2VkIikgPT0gMCkgewotICAgICAgICBpZiAoYXRvaSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIExPR1YoIkVORk9SQ0VEX0FVRElCTEUgY2Fubm90IGJlIG11dGVkIik7Ci0gICAgICAgICAgICBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRV0ubUNhbkJlTXV0ZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR1YoIkVORk9SQ0VEX0FVRElCTEUgY2FuIGJlIG11dGVkIik7Ci0gICAgICAgICAgICBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRV0ubUNhbkJlTXV0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRPdXRwdXQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncykKLXsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOwotICAgIHVpbnQzMl90IGxhdGVuY3kgPSAwOwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSk7Ci0gICAgdWludDMyX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotICAgIExPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncyk7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtQ3VyT3V0cHV0ICE9IDApIHsKLSAgICAgICAgTE9HVigiZ2V0T3V0cHV0KCkgdGVzdCBvdXRwdXQgbUN1ck91dHB1dCAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBtRGlyZWN0T3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0LCBtVGVzdFNhbXBsaW5nUmF0ZSwgbVRlc3RGb3JtYXQsIG1UZXN0Q2hhbm5lbHMsIG1EaXJlY3RPdXRwdXQpOwotCi0gICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gPT0gMCkgewotICAgICAgICAgICAgTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOwotICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IG1UZXN0Rm9ybWF0OwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxzID0gbVRlc3RDaGFubmVsczsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPSAoQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncykobURpcmVjdE91dHB1dCA/IEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgICAgIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KCZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0pIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLSAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycwotICAgIGlmIChuZWVkc0RpcmVjdE91cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncywgZGV2aWNlKSkgewotCi0gICAgICAgIExPR1YoImdldE91dHB1dCgpIG9wZW5pbmcgZGlyZWN0IG91dHB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVscyA9IGNoYW5uZWxzOwotICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9IChBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzKShmbGFncyB8IEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWV0ZWQgcGFyYW1ldGVycwotICAgICAgICBpZiAob3V0cHV0ID09IDAgfHwKLSAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKLSAgICAgICAgICAgIChmb3JtYXQgIT0gMCAmJiBmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgfHwKLSAgICAgICAgICAgIChjaGFubmVscyAhPSAwICYmIGNoYW5uZWxzICE9IG91dHB1dERlc2MtPm1DaGFubmVscykpIHsKLSAgICAgICAgICAgIExPR1YoImdldE91dHB1dCgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscyk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBvdXRwdXREZXNjOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgaWYgKGNoYW5uZWxzICE9IDAgJiYgY2hhbm5lbHMgIT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8gJiYKLSAgICAgICAgY2hhbm5lbHMgIT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0Ci0KLSAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbCByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbgotICAgIC8vIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgIHVpbnQzMl90IGEyZHBEZXZpY2UgPSBkZXZpY2UgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTExfQTJEUDsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OnBvcENvdW50KChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcylkZXZpY2UpID09IDIpIHsKLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgaWYgKGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcERldmljZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBpZiBwbGF5aW5nIG9uIDIgZGV2aWNlcyBhbW9uZyB3aGljaCBvbmUgaXMgQTJEUCwgdXNlIGR1cGxpY2F0ZWQgb3V0cHV0Ci0gICAgICAgICAgICBMT0dWKCJnZXRPdXRwdXQoKSB1c2luZyBkdXBsaWNhdGVkIG91dHB1dCIpOwotICAgICAgICAgICAgTE9HV19JRigobUEyZHBPdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBBMkRQIGRldmljZSBpbiBtdWx0aXBsZSAleCBzZWxlY3RlZCBidXQgQTJEUCBvdXRwdXQgbm90IG9wZW5lZCIsIGRldmljZSk7Ci0gICAgICAgICAgICBvdXRwdXQgPSBtRHVwbGljYXRlZE91dHB1dDsKLSAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgcGxheWluZyBvbiAyIGRldmljZXMgYW1vbmcgd2hpY2ggbm9uZSBpcyBBMkRQLCB1c2UgaGFyZHdhcmUgb3V0cHV0Ci0gICAgICAgICAgICBvdXRwdXQgPSBtSGFyZHdhcmVPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiZ2V0T3V0cHV0KCkgdXNpbmcgb3V0cHV0ICVkIGZvciAyIGRldmljZXMgJXgiLCBvdXRwdXQsIGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgaWYgKGEyZHBEZXZpY2UgIT0gMCkgewotICAgICAgICAgICAgLy8gaWYgcGxheWluZyBvbiBBMkRQIGRldmljZSwgdXNlIGEyZHAgb3V0cHV0Ci0gICAgICAgICAgICBMT0dXX0lGKChtQTJkcE91dHB1dCA9PSAwKSwgImdldE91dHB1dCgpIEEyRFAgZGV2aWNlICV4IHNlbGVjdGVkIGJ1dCBBMkRQIG91dHB1dCBub3Qgb3BlbmVkIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIG91dHB1dCA9IG1BMmRwT3V0cHV0OwotICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBwbGF5aW5nIG9uIG5vdCBBMkRQIGRldmljZSwgdXNlIGhhcmR3YXJlIG91dHB1dAotICAgICAgICAgICAgb3V0cHV0ID0gbUhhcmR3YXJlT3V0cHV0OwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBMT0dXX0lGKChvdXRwdXQgPT0wKSwgImdldE91dHB1dCgpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgZmxhZ3MpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIExPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93IG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKTsKLQotI2lmZGVmIFdJVEhfQTJEUAotICAgIGlmIChtQTJkcE91dHB1dCAhPSAwICAmJiAhYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSAmJiBzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtQTJkcE91dHB1dCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBpbmNyZW1lbmVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6Ci0gICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcwotICAgIC8vIG5lY2Fzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCi0gICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKLQotICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIGdldE5ld0RldmljZShvdXRwdXQpKTsKLQotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKLSAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLCBvdXRwdXQsIG91dHB1dERlc2MtPmRldmljZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIExPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygic3RvcE91dHB1dCgpIHVua25vdyBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSk7Ci0KLSAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewotICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAotICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKLSAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKLSAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7Ci0KLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZ2V0TmV3RGV2aWNlKG91dHB1dCksIGZhbHNlLCBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKLQotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICBpZiAobUEyZHBPdXRwdXQgIT0gMCAmJiAhYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSAmJgotICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPm1MYXRlbmN5KjIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG91dHB1dCAhPSBtSGFyZHdhcmVPdXRwdXQpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtSGFyZHdhcmVPdXRwdXQsIGdldE5ld0RldmljZShtSGFyZHdhcmVPdXRwdXQpLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HVygic3RvcE91dHB1dCgpIHJlZmNvdW50IGlzIGFscmVhZHkgMCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOwotICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgewotICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPnJlZkNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLSAgICBpZiAobU91dHB1dHMudmFsdWVBdChpbmRleCktPm1GbGFncyAmIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOwotICAgIH0KLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0SW5wdXQoaW50IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IDA7Ci0gICAgdWludDMyX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotCi0gICAgTE9HVigiZ2V0SW5wdXQoKSBpbnB1dFNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBhY291c3RpY3MgJXgiLCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBhY291c3RpY3MpOwotCi0gICAgaWYgKGRldmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGFkYXB0IGNoYW5uZWwgc2VsZWN0aW9uIHRvIGlucHV0IHNvdXJjZQotICAgIHN3aXRjaChpbnB1dFNvdXJjZSkgewotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKLSAgICAgICAgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9WT0lDRV9VUExJTks7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgotICAgICAgICBjaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKLSAgICAgICAgY2hhbm5lbHMgPSAoQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcigpOwotCi0gICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgIGlucHV0RGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLSAgICBpbnB1dERlc2MtPm1DaGFubmVscyA9IGNoYW5uZWxzOwotICAgIGlucHV0RGVzYy0+bUFjb3VzdGljcyA9IGFjb3VzdGljczsKLSAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7Ci0gICAgaW5wdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KCZpbnB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bUFjb3VzdGljcyk7Ci0KLSAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKLSAgICBpZiAoaW5wdXQgPT0gMCB8fAotICAgICAgICAoc2FtcGxpbmdSYXRlICE9IGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKLSAgICAgICAgKGZvcm1hdCAhPSBpbnB1dERlc2MtPm1Gb3JtYXQpIHx8Ci0gICAgICAgIChjaGFubmVscyAhPSBpbnB1dERlc2MtPm1DaGFubmVscykpIHsKLSAgICAgICAgTE9HVigiZ2V0SW5wdXQoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMpOwotICAgICAgICBpZiAoaW5wdXQgIT0gMCkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBpbnB1dERlc2M7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygic3RhcnRJbnB1dCgpIHVua25vdyBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtVGVzdElucHV0ID09IDApCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIHsKLSAgICAgICAgLy8gcmVmdXNlIDIgYWN0aXZlIEF1ZGlvUmVjb3JkIGNsaWVudHMgYXQgdGhlIHNhbWUgdGltZQotICAgICAgICBpZiAoZ2V0QWN0aXZlSW5wdXQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBMT0dXKCJzdGFydElucHV0KCkgaW5wdXQgJWQgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KWlucHV0RGVzYy0+bURldmljZSk7Ci0KLSAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCAoaW50KWlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKLSAgICBMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKLQotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50ID0gMTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInN0b3BJbnB1dCgpIHVua25vdyBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICBMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9IGVsc2UgewotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAwOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKLSAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOwotICAgIExPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjppbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQotewotICAgIExPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7Ci0gICAgICAgIExPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKLSAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCA9IGluZGV4TWF4OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgaW5kZXgpCi17Ci0KLSAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4pIHx8IChpbmRleCA+IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4KSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVN0cmVhbXNbc3RyZWFtXS5tQ2FuQmVNdXRlZCkgaW5kZXggPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLQotICAgIExPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBpbmRleCAlZCIsIHN0cmVhbSwgaW5kZXgpOwotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyID0gaW5kZXg7Ci0KLSAgICAvLyBjb21wdXRlIGFuZCBhcHBseSBzdHJlYW0gdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFjY29yZGluZyB0byBjb25uZWN0ZWQgZGV2aWNlCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIGluZGV4LCBtT3V0cHV0cy5rZXlBdChpKSwgbU91dHB1dHMudmFsdWVBdChpKS0+ZGV2aWNlKCkpOwotICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCIsIHN0cmVhbSk7Ci0gICAgKmluZGV4ID0gIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCi17Ci0gICAgTE9HVigiZ2V0T3V0cHV0Rm9yRWZmZWN0KCkiKTsKLSAgICAvLyBhcHBseSBzaW1wbGUgcnVsZSB3aGVyZSBnbG9iYWwgZWZmZWN0cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHNhbWUgb3V0cHV0IGFzIE1VU0lDIHN0cmVhbXMKLSAgICByZXR1cm4gZ2V0T3V0cHV0KEF1ZGlvU3lzdGVtOjpNVVNJQyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZGVzYy0+Y3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKLSAgICAgICAgTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBDUFUgTG9hZCBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIENQVSAlZiBNSVBTIiwKLSAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCAoZmxvYXQpZGVzYy0+Y3B1TG9hZC8xMCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgewotICAgICAgICBMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCi0gICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkICs9IGRlc2MtPmNwdUxvYWQ7Ci0gICAgbVRvdGFsRWZmZWN0c01lbW9yeSArPSBkZXNjLT5tZW1vcnlVc2FnZTsKLSAgICBMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgb3V0cHV0ICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKLSAgICAgICAgICAgIGRlc2MtPm5hbWUsIG91dHB1dCwgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKLQotICAgIExPR1YoInJlZ2lzdGVyRWZmZWN0KCkgQ1BVICVkLCBtZW1vcnkgJWQiLCBkZXNjLT5jcHVMb2FkLCBkZXNjLT5tZW1vcnlVc2FnZSk7Ci0gICAgTE9HVigiICB0b3RhbCBDUFUgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKLQotICAgIEVmZmVjdERlc2NyaXB0b3IgKnBEZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKLSAgICBtZW1jcHkgKCZwRGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgcERlc2MtPm1PdXRwdXQgPSBvdXRwdXQ7Ci0gICAgcERlc2MtPm1TdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5OwotICAgIHBEZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgbUVmZmVjdHMuYWRkKGlkLCBwRGVzYyk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIEVmZmVjdERlc2NyaXB0b3IgKnBEZXNjID0gbUVmZmVjdHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgPCBwRGVzYy0+bURlc2MuY3B1TG9hZCkgewotICAgICAgICBMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgQ1BVIGxvYWQgJWQgdG9vIGhpZ2ggZm9yIHRvdGFsICVkIiwKLSAgICAgICAgICAgICAgICBwRGVzYy0+bURlc2MuY3B1TG9hZCwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOwotICAgICAgICBwRGVzYy0+bURlc2MuY3B1TG9hZCA9IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOwotICAgIH0KLSAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCAtPSBwRGVzYy0+bURlc2MuY3B1TG9hZDsKLSAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewotICAgICAgICBMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKLSAgICAgICAgICAgICAgICBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotICAgICAgICBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UgPSBtVG90YWxFZmZlY3RzTWVtb3J5OwotICAgIH0KLSAgICBtVG90YWxFZmZlY3RzTWVtb3J5IC09IHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZTsKLSAgICBMT0dWKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBJRCAlZCwgQ1BVICVkLCBtZW1vcnkgJWQiLAotICAgICAgICAgICAgcERlc2MtPm1EZXNjLm5hbWUsIGlkLCBwRGVzYy0+bURlc2MuY3B1TG9hZCwgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKTsKLSAgICBMT0dWKCIgIHRvdGFsIENQVSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgbUVmZmVjdHMucmVtb3ZlSXRlbShpZCk7Ci0gICAgZGVsZXRlIHBEZXNjOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmlzU3RyZWFtQWN0aXZlKGludCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0cy52YWx1ZUF0KGkpLT5tUmVmQ291bnRbc3RyZWFtXSAhPSAwIHx8Ci0gICAgICAgICAgICBuczJtcyhzeXNUaW1lIC0gbU91dHB1dHMudmFsdWVBdChpKS0+bVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEhhcmR3YXJlIE91dHB1dDogJWRcbiIsIG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotI2lmZGVmIFdJVEhfQTJEUAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBMkRQIE91dHB1dDogJWRcbiIsIG1BMmRwT3V0cHV0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIER1cGxpY2F0ZWQgT3V0cHV0OiAlZFxuIiwgbUR1cGxpY2F0ZWRPdXRwdXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQTJEUCBkZXZpY2UgYWRkcmVzczogJXNcbiIsIG1BMmRwRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotI2VuZGlmCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNDTyBkZXZpY2UgYWRkcmVzczogJXNcbiIsIG1TY29EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE91dHB1dCBkZXZpY2VzOiAlMDh4XG4iLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJbnB1dCBkZXZpY2VzOiAlMDh4XG4iLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlZFxuIiwgbVBob25lU3RhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUmluZ2VyIG1vZGU6ICVkXG4iLCBtUmluZ2VyTW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLCBtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9NRURJQV0pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX1JFQ09SRF0pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9ET0NLXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1PdXRwdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIG1JbnB1dHMua2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciAgQ2FuIGJlIG11dGVkXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkIiwgaSk7Ci0gICAgICAgIG1TdHJlYW1zW2ldLmR1bXAoYnVmZmVyICsgMywgU0laRSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCi0gICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5TWFuYWdlckJhc2UKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6QXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZShBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDoKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIFRocmVhZChmYWxzZSksCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLAotICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCi0gICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCksCi0gICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpCi17Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEF1ZGlvU3lzdGVtOjpOVU1fRk9SQ0VfVVNFOyBpKyspIHsKLSAgICAgICAgbUZvcmNlVXNlW2ldID0gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkU7Ci0gICAgfQotCi0gICAgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpOwotCi0gICAgLy8gZGV2aWNlcyBhdmFpbGFibGUgYnkgZGVmYXVsdCBhcmUgc3BlYWtlciwgZWFyIHBpZWNlIGFuZCBtaWNyb3Bob25lCi0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMgPSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9FQVJQSUVDRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JVSUxUSU5fTUlDOwotCi0jaWZkZWYgV0lUSF9BMkRQCi0gICAgbUEyZHBPdXRwdXQgPSAwOwotICAgIG1EdXBsaWNhdGVkT3V0cHV0ID0gMDsKLSAgICBtQTJkcERldmljZUFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSNlbmRpZgotICAgIG1TY29EZXZpY2VBZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0KLSAgICAvLyBvcGVuIGhhcmR3YXJlIG91dHB1dAotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoKTsKLSAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gKHVpbnQzMl90KUF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgbUhhcmR3YXJlT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7Ci0KLSAgICBpZiAobUhhcmR3YXJlT3V0cHV0ID09IDApIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgc2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhZGRPdXRwdXQobUhhcmR3YXJlT3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgKHVpbnQzMl90KUF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVIsIHRydWUpOwotICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKLSAgICB9Ci0KLSAgICB1cGRhdGVEZXZpY2VGb3JTdHJhdGVneSgpOwotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaWYgKG1IYXJkd2FyZU91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSGFyZHdhcmVPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKLQotICAgICAgICBtVGVzdERldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gICAgICAgIG1UZXN0Rm9ybWF0ID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7Ci0gICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOwotICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKLSAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOwotICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotfQotCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjp+QXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZSgpCi17Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBleGl0KCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVBdChpKTsKLSAgIH0KLSAgIG1PdXRwdXRzLmNsZWFyKCk7Ci0gICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpKSk7Ci0gICAgICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICB9Ci0gICBtSW5wdXRzLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmluaXRDaGVjaygpCi17Ci0gICAgcmV0dXJuIChtSGFyZHdhcmVPdXRwdXQgPT0gMCkgPyBOT19JTklUIDogTk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjp0aHJlYWRMb29wKCkKLXsKLSAgICBMT0dWKCJlbnRlcmluZyB0aHJlYWRMb29wKCkiKTsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCi0gICAgewotICAgICAgICBTdHJpbmc4IGNvbW1hbmQ7Ci0gICAgICAgIGludCB2YWx1ZUludDsKLSAgICAgICAgU3RyaW5nOCB2YWx1ZTsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIG1pbGxpc2Vjb25kcyg1MCkpOwotCi0gICAgICAgIGNvbW1hbmQgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoY29tbWFuZCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SICYmCi0gICAgICAgICAgICB2YWx1ZUludCAhPSAwKSB7Ci0gICAgICAgICAgICBMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OwotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKLSAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7Ci0gICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7Ci0gICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpJTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIlBDTSAxNiBiaXRzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJQQ00gOCBiaXRzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNvbXByZXNzZWQgTVAzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6TVAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpJTlZBTElEX0ZPUk1BVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOwotICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImNoYW5uZWxzIiksIGNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPj0gMCAmJiB2YWx1ZUludCA8PSA5NjAwMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdSYXRlID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoInNhbXBsaW5nX3JhdGUiKSwgc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpKTsKLQotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obUhhcmR3YXJlT3V0cHV0KTsKLQotICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gKHVpbnQzMl90KUF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgbUhhcmR3YXJlT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IYXJkd2FyZU91dHB1dCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgc2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobUhhcmR3YXJlT3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChtSGFyZHdhcmVPdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpleGl0KCkKLXsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLS8vIC0tLQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBpZCwgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjKQotewotICAgIG91dHB1dERlc2MtPm1JZCA9IGlkOwotICAgIG1PdXRwdXRzLmFkZChpZCwgb3V0cHV0RGVzYyk7Ci19Ci0KLQotI2lmZGVmIFdJVEhfQTJEUAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aGFuZGxlQTJkcENvbm5lY3Rpb24oQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIC8vIHdoZW4gYW4gQTJEUCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcGVuIGFuIEEyRFAgYW5kIGEgZHVwbGljYXRlZCBvdXRwdXQKLSAgICBMT0dWKCJvcGVuaW5nIEEyRFAgb3V0cHV0IGZvciBkZXZpY2UgJXMiLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpOwotICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgbUEyZHBPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7Ci0gICAgaWYgKG1BMmRwT3V0cHV0KSB7Ci0gICAgICAgIC8vIGFkZCBBMkRQIG91dHB1dCBkZXNjcmlwdG9yCi0gICAgICAgIGFkZE91dHB1dChtQTJkcE91dHB1dCwgb3V0cHV0RGVzYyk7Ci0KLSAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCi0KLSAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgQTJEUCBkZXZpY2UKLSAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG1BMmRwT3V0cHV0LCBkZXZpY2UpOwotICAgICAgICBpZiAoYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSkgewotICAgICAgICAgICAgbUR1cGxpY2F0ZWRPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChtQTJkcE91dHB1dCwgbUhhcmR3YXJlT3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUR1cGxpY2F0ZWRPdXRwdXQgIT0gMCB8fAotICAgICAgICAgICAgIWEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIC8vIElmIGJvdGggQTJEUCBhbmQgZHVwbGljYXRlZCBvdXRwdXRzIGFyZSBvcGVuLCBzZW5kIGRldmljZSBhZGRyZXNzIHRvIEEyRFAgaGFyZHdhcmUKLSAgICAgICAgICAgIC8vIGludGVyZmFjZQotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgICAgICBwYXJhbS5hZGQoU3RyaW5nOCgiYTJkcF9zaW5rX2FkZHJlc3MiKSwgU3RyaW5nOChkZXZpY2VfYWRkcmVzcykpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobUEyZHBPdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgbUEyZHBEZXZpY2VBZGRyZXNzID0gU3RyaW5nOChkZXZpY2VfYWRkcmVzcywgTUFYX0RFVklDRV9BRERSRVNTX0xFTik7Ci0KLSAgICAgICAgICAgIGlmIChhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmR1cE91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gbU91dHB1dHMudmFsdWVGb3IobUEyZHBPdXRwdXQpOwotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1Gb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1DaGFubmVscyA9IG91dHB1dERlc2MtPm1DaGFubmVsczsKLSAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tTGF0ZW5jeSA9IG91dHB1dERlc2MtPm1MYXRlbmN5OwotICAgICAgICAgICAgICAgIGFkZE91dHB1dChtRHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG1EdXBsaWNhdGVkT3V0cHV0LCBkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVygiZ2V0T3V0cHV0KCkgY291bGQgbm90IG9wZW4gZHVwbGljYXRlZCBvdXRwdXQgZm9yICVkIGFuZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZU91dHB1dCwgbUEyZHBPdXRwdXQpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1BMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obUEyZHBPdXRwdXQpOwotICAgICAgICAgICAgbUEyZHBPdXRwdXQgPSAwOwotICAgICAgICAgICAgZGVsZXRlIG91dHB1dERlc2M7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBvcGVuIEEyRFAgb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgICAgICBkZWxldGUgb3V0cHV0RGVzYzsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKLQotICAgIGlmICghYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSkgewotICAgICAgICAvLyBtdXRlIG11c2ljIG9uIEEyRFAgb3V0cHV0IGlmIGEgbm90aWZpY2F0aW9uIG9yIHJpbmd0b25lIGlzIHBsYXlpbmcKLSAgICAgICAgdWludDMyX3QgcmVmQ291bnQgPSBod091dHB1dERlc2MtPnN0cmF0ZWd5UmVmQ291bnQoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlZkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgbUEyZHBPdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aGFuZGxlQTJkcERpc2Nvbm5lY3Rpb24oQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIGlmIChtQTJkcE91dHB1dCA9PSAwKSB7Ci0gICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgQTJEUCBhbmQgbm8gQTJEUCBvdXRwdXQhIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAobUEyZHBEZXZpY2VBZGRyZXNzICE9IGRldmljZV9hZGRyZXNzKSB7Ci0gICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgdW5rbm93IEEyRFAgc2luayBhZGRyZXNzICVzIiwgZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgLy8gbXV0ZSBtZWRpYSBzdHJhdGVneSB0byBhdm9pZCBvdXRwdXR0aW5nIHNvdW5kIG9uIGhhcmR3YXJlIG91dHB1dCB3aGlsZSBtdXNpYyBzdHJlYW0KLSAgICAvLyBpcyBzd2l0Y2hlZCBmcm9tIEEyRFAgb3V0cHV0IGFuZCBiZWZvcmUgbXVzaWMgaXMgcGF1c2VkIGJ5IG11c2ljIGFwcGxpY2F0aW9uCi0gICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIG1IYXJkd2FyZU91dHB1dCwgTVVURV9USU1FX01TKTsKLQotICAgIGlmICghYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSkgewotICAgICAgICAvLyB1bm11dGUgbXVzaWMgb24gQTJEUCBvdXRwdXQgaWYgYSBub3RpZmljYXRpb24gb3IgcmluZ3RvbmUgaXMgcGxheWluZwotICAgICAgICB1aW50MzJfdCByZWZDb3VudCA9IG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPnN0cmF0ZWd5UmVmQ291bnQoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlZkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIG1BMmRwT3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQTJkcERldmljZUFkZHJlc3MgPSAiIjsKLSAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjbG9zZUEyZHBPdXRwdXRzKCkKLXsKLQotICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNsb3NpbmcgQTJEUCBhbmQgZHVwbGljYXRlZCBvdXRwdXQhIik7Ci0KLSAgICBpZiAobUR1cGxpY2F0ZWRPdXRwdXQgIT0gMCkgewotICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKLSAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAotICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiBoYXJkd2FyZSBvdXRwdXQsIHRoZSByZWZlcmVuY2UKLSAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KLSAgICAgICAgLy8gaGFyZHdhcmUgb3V0cHV0LgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewotICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2ldOwotICAgICAgICAgICAgaHdPdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksLXJlZkNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtRHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obUR1cGxpY2F0ZWRPdXRwdXQpOwotICAgICAgICBtRHVwbGljYXRlZE91dHB1dCA9IDA7Ci0gICAgfQotICAgIGlmIChtQTJkcE91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtQTJkcE91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1BMmRwT3V0cHV0KTsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlRm9yKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtQTJkcE91dHB1dCk7Ci0gICAgICAgIG1BMmRwT3V0cHV0ID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIHVpbnQzMl90IHByZXZEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgdWludDMyX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlKTsKLSAgICBib29sIGEyZHBXYXNVc2VkID0gQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZSgoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMpKHByZXZEZXZpY2UgJiB+QXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUikpOwotICAgIGJvb2wgYTJkcElzVXNlZCA9IEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKShjdXJEZXZpY2UgJiB+QXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUikpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gMDsKLQotICAgIGlmIChhMmRwV2FzVXNlZCAmJiAhYTJkcElzVXNlZCkgewotICAgICAgICBib29sIGR1cFVzZWQgPSBhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmIGEyZHBXYXNVc2VkICYmIChBdWRpb1N5c3RlbTo6cG9wQ291bnQocHJldkRldmljZSkgPT0gMik7Ci0gICAgICAgIGRzdE91dHB1dCA9IG1IYXJkd2FyZU91dHB1dDsKLSAgICAgICAgaWYgKGR1cFVzZWQpIHsKLSAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBkdXBsaWNhdGVkIiwgc3RyYXRlZ3kpOwotICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUR1cGxpY2F0ZWRPdXRwdXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIGZyb20gYTJkcCIsIHN0cmF0ZWd5KTsKLSAgICAgICAgICAgIHNyY091dHB1dCA9IG1BMmRwT3V0cHV0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhMmRwSXNVc2VkICYmICFhMmRwV2FzVXNlZCkgewotICAgICAgICBib29sIGR1cFVzZWQgPSBhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmIGEyZHBJc1VzZWQgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjdXJEZXZpY2UpID09IDIpOwotICAgICAgICBzcmNPdXRwdXQgPSBtSGFyZHdhcmVPdXRwdXQ7Ci0gICAgICAgIGlmIChkdXBVc2VkKSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIHRvIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBkc3RPdXRwdXQgPSBtRHVwbGljYXRlZE91dHB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gYTJkcCIsIHN0cmF0ZWd5KTsKLSAgICAgICAgICAgIGRzdE91dHB1dCA9IG1BMmRwT3V0cHV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNyY091dHB1dCAhPSAwICYmIGRzdE91dHB1dCAhPSAwKSB7Ci0gICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBFZmZlY3REZXNjcmlwdG9yICpkZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChkZXNjLT5tU2Vzc2lvbiAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVN0cmF0ZWd5ID09IHN0cmF0ZWd5ICYmCi0gICAgICAgICAgICAgICAgICAgIGRlc2MtPm1PdXRwdXQgPT0gc3JjT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwgbUVmZmVjdHMua2V5QXQoaSksIGRzdE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKGRlc2MtPm1TZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bU91dHB1dCA9IGRzdE91dHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtT3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwgZHN0T3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQotewotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNoZWNrQTJkcFN1c3BlbmQoKQotewotICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6Ci0gICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgotICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgotICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKLSAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCi0gICAgLy8KLSAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgotICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgotICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKLSAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKLSAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKLSAgICAvLwotICAgIGlmIChtQTJkcE91dHB1dCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKLSAgICAgICAgaWYgKCgobVNjb0RldmljZUFkZHJlc3MgPT0gIiIpIHx8Ci0gICAgICAgICAgICAgKChtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OXSAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPKSAmJgotICAgICAgICAgICAgICAobUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfUkVDT1JEXSAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPKSkpICYmCi0gICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSAhPSBBdWRpb1N5c3RlbTo6TU9ERV9JTl9DQUxMKSAmJgotICAgICAgICAgICAgICAobVBob25lU3RhdGUgIT0gQXVkaW9TeXN0ZW06Ok1PREVfUklOR1RPTkUpKSkgewotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChtQTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCgobVNjb0RldmljZUFkZHJlc3MgIT0gIiIpICYmCi0gICAgICAgICAgICAgKChtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAgICAgICAobUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfUkVDT1JEXSA9PSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPKSkpIHx8Ci0gICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9JTl9DQUxMKSB8fAotICAgICAgICAgICAgICAobVBob25lU3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfUklOR1RPTkUpKSkgewotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChtQTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotI2VuZGlmCi0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldE5ld0RldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IDA7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKLSAgICAvLyAxOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBoYXJkd2FyZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDI6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBoYXJkd2FyZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KLSAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBoYXJkd2FyZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgaGFyZHdhcmUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgotICAgIGlmIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgIG91dHB1dERlc2MtPmlzVXNlZEJ5U3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNVc2VkQnlTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzVXNlZEJ5U3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNVc2VkQnlTdHJhdGVneShTVFJBVEVHWV9EVE1GKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOwotICAgIH0KLQotICAgIExPR1YoImdldE5ld0RldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgewotICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7Ci0gICAgdWludDMyX3QgZGV2aWNlczsKLSAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgTE9HRQotICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCi0gICAgaWYgKHN0cmVhbSA8IChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpIDAgfHwgc3RyZWFtID49IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKSB7Ci0gICAgICAgIGRldmljZXMgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBkZXZpY2VzID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6cm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRTdHJhdGVneSgKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgewotICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ086Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpSSU5HOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok5PVElGSUNBVElPTjoKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpBTEFSTToKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkRUTUY6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0UoInVua25vd24gc3RyZWFtIHR5cGUiKTsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpTWVNURU06Ci0gICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKLSAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpUVFM6Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6TVVTSUM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIGJvb2wgZnJvbUNhY2hlKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IDA7Ci0KLSAgICBpZiAoZnJvbUNhY2hlKSB7Ci0gICAgICAgIExPR1YoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4Iiwgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOwotICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7Ci0gICAgY2FzZSBTVFJBVEVHWV9EVE1GOgotICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIC8vIHdoZW4gb2ZmIGNhbGwsIERUTUYgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBNRURJQSBzdHJhdGVneQotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX1BIT05FOgotICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieSBvcmRlcgotICAgICAgICAvLyBvZiBwcmlvcml0eQotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9TeXN0ZW06OkZPUkNFX0JUX1NDTzoKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQotICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmICFtQTJkcFN1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0VBUlBJRUNFOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBlYXJwaWVjZSBkZXZpY2Ugbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpGT1JDRV9TUEVBS0VSOgotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KLSAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewotICAgICAgICAgICAgICAgIExPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3BlYWtlciBkZXZpY2Ugbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046Ci0KLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewotICAgICAgICAgICAgTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5Ci0gICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgY2FzZSBTVFJBVEVHWV9NRURJQTogewotICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7Ci0gICAgICAgIGlmIChkZXZpY2UyID09IDApIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgIH0KLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgaWYgKChtQTJkcE91dHB1dCAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQgJiYKLSAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHx8IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCAwIG90aGVyd2lzZQotICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKLSAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBMT0dWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCB1aW50MzJfdCBkZXZpY2UsIGJvb2wgZm9yY2UsIGludCBkZWxheU1zKQotewotICAgIExPR1YoInNldE91dHB1dERldmljZSgpIG91dHB1dCAlZCBkZXZpY2UgJXggZGVsYXlNcyAlZCIsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotCi0KLSAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQxLT5tSWQsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDItPm1JZCwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAotICAgIGlmIChvdXRwdXQgPT0gbUEyZHBPdXRwdXQpIHsKLSAgICAgICAgZGV2aWNlICY9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FMTF9BMkRQOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSAmPSB+QXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQUxMX0EyRFA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB1aW50MzJfdCBwcmV2RGV2aWNlID0gKHVpbnQzMl90KW91dHB1dERlc2MtPmRldmljZSgpOwotICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6Ci0gICAgLy8gIC0gdGhlIHJlcXVlc3RlZGUgZGV2aWNlIGlzIDAKLSAgICAvLyAgLSB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZSBhbmQgZm9yY2UgaXMgbm90IHNwZWNpZmllZC4KLSAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGRldmljZSA9PSAwIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJiAhZm9yY2UpIHsKLSAgICAgICAgTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAleCBvciBudWxsIGRldmljZSBmb3Igb3V0cHV0ICVkIiwgZGV2aWNlLCBvdXRwdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICAvLyBtdXRlIG1lZGlhIHN0cmVhbXMgaWYgYm90aCBzcGVha2VyIGFuZCBoZWFkc2V0IGFyZSBzZWxlY3RlZAotICAgIGlmIChvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0ICYmIEF1ZGlvU3lzdGVtOjpwb3BDb3VudChkZXZpY2UpID09IDIpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBvdXRwdXQpOwotICAgICAgICAvLyB3YWl0IGZvciB0aGUgUENNIG91dHB1dCBidWZmZXJzIHRvIGVtcHR5IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQKLSAgICAgICAgdXNsZWVwKG91dHB1dERlc2MtPm1MYXRlbmN5KjIqMTAwMCk7Ci0gICAgfQotCi0gICAgLy8gZG8gdGhlIHJvdXRpbmcKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KWRldmljZSk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobUhhcmR3YXJlT3V0cHV0LCBwYXJhbS50b1N0cmluZygpLCBkZWxheU1zKTsKLSAgICAvLyB1cGRhdGUgc3RyZWFtIHZvbHVtZXMgYWNjb3JkaW5nIHRvIG5ldyBkZXZpY2UKLSAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotCi0gICAgLy8gaWYgY2hhbmdpbmcgZnJvbSBhIGNvbWJpbmVkIGhlYWRzZXQgKyBzcGVha2VyIHJvdXRlLCB1bm11dGUgbWVkaWEgc3RyZWFtcwotICAgIGlmIChvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0ICYmIEF1ZGlvU3lzdGVtOjpwb3BDb3VudChwcmV2RGV2aWNlKSA9PSAyKSB7Ci0gICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnQgaW5wdXRTb3VyY2UpCi17Ci0gICAgdWludDMyX3QgZGV2aWNlOwotCi0gICAgc3dpdGNoKGlucHV0U291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgaWYgKG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX1JFQ09SRF0gPT0gQXVkaW9TeXN0ZW06OkZPUkNFX0JUX1NDTyAmJgotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgaWYgKGhhc0JhY2tNaWNyb3Bob25lKCkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkFDS19NSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX1ZPSUNFX0NBTEw7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR1coImdldElucHV0KCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIGRldmljZSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldEFjdGl2ZUlucHV0KCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpKS0+bVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnZvbEluZGV4VG9BbXBsKHVpbnQzMl90IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKLSAgICAgICAgaW50IGluZGV4SW5VaSkgewotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIHN0cmVhbURlc2MubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1BWF0gLQotICAgICAgICAgICAgc3RyZWFtRGVzYy5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUlOXTsKLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pKSAvCi0gICAgICAgICAgICAoc3RyZWFtRGVzYy5tSW5kZXhNYXggLSBzdHJlYW1EZXNjLm1JbmRleE1pbik7Ci0KLSAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCi0gICAgaW50IHNlZ21lbnQgPSAwOwotICAgIGlmICh2b2xJZHggPCBzdHJlYW1EZXNjLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNSU5dKSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IHN0cmVhbURlc2MubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUxXSkgewotICAgICAgICBzZWdtZW50ID0gMDsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IHN0cmVhbURlc2MubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUyXSkgewotICAgICAgICBzZWdtZW50ID0gMTsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBzdHJlYW1EZXNjLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNQVhdKSB7Ci0gICAgICAgIHNlZ21lbnQgPSAyOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMS4wZjsKLSAgICB9Ci0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IHN0cmVhbURlc2MubVZvbERiQXR0W3NlZ21lbnRdICsKLSAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIHN0cmVhbURlc2MubVZvbEluZGV4W3NlZ21lbnRdKSkgKgotICAgICAgICAgICAgICAgICggKHN0cmVhbURlc2MubVZvbERiQXR0W3NlZ21lbnQrMV0gLSBzdHJlYW1EZXNjLm1Wb2xEYkF0dFtzZWdtZW50XSkgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShzdHJlYW1EZXNjLm1Wb2xJbmRleFtzZWdtZW50KzFdIC0gc3RyZWFtRGVzYy5tVm9sSW5kZXhbc2VnbWVudF0pKSApOwotCi0gICAgZmxvYXQgYW1wbGlmaWNhdGlvbiA9IGV4cCggZGVjaWJlbHMgKiAwLjExNTEyOWYpOyAvLyBleHAoIGRCICogbG4oMTApIC8gMjAgKQotCi0gICAgTE9HVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIGFtcGw9JS41ZiIsCi0gICAgICAgICAgICBzdHJlYW1EZXNjLm1Wb2xJbmRleFtzZWdtZW50XSwgdm9sSWR4LCBzdHJlYW1EZXNjLm1Wb2xJbmRleFtzZWdtZW50KzFdLAotICAgICAgICAgICAgc3RyZWFtRGVzYy5tVm9sRGJBdHRbc2VnbWVudF0sIGRlY2liZWxzLCBzdHJlYW1EZXNjLm1Wb2xEYkF0dFtzZWdtZW50KzFdLAotICAgICAgICAgICAgYW1wbGlmaWNhdGlvbik7Ci0KLSAgICByZXR1cm4gYW1wbGlmaWNhdGlvbjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKCkgewotICAgIC8vIGluaXRpYWxpemUgdGhlIHZvbHVtZSBjdXJ2ZXMgdG8gYSAoLTQ5LjUgLSAwIGRCKSBhdHRlbnVhdGlvbiBpbiAwLjVkQiBzdGVwcwotICAgIGZvciAoaW50IGk9MCA7IGk8IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTIDsgaSsrKSB7Ci0gICAgICAgIG1TdHJlYW1zW2ldLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNSU5dID0gMTsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1JTl0gPSAtNDkuNWY7Ci0gICAgICAgIG1TdHJlYW1zW2ldLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xLTkVFMV0gPSAzMzsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUxXSA9IC0zMy41ZjsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUyXSA9IDY2OwotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTJdID0gLTE3LjBmOwotICAgICAgICAvLyBoZXJlIHdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzCi0gICAgICAgIC8vIHdoZW4gY29tcHV0aW5nIHRoZSB2b2x1bWUgaW4gdm9sSW5kZXhUb0FtcGwoKQotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUFYXSA9IDEwMDsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1BWF0gPSAwLjBmOwotICAgIH0KLQotICAgIC8vIE1vZGlmaWNhdGlvbiBmb3IgbXVzaWM6IG1vcmUgYXR0ZW51YXRpb24gZm9yIGxvd2VyIHZvbHVtZXMsIGZpbmVyIHN0ZXBzIGF0IGhpZ2ggdm9sdW1lcwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1JTl0gPSAxOwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1JTl0gPSAtNTguMGY7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTFdID0gMjA7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTFdID0gLTQwLjBmOwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUyXSA9IDYwOwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUyXSA9IC0xNy4wZjsKLSAgICBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6TVVTSUNdLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNQVhdID0gMTAwOwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbERiQXR0W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1BWF0gPSAwLjBmOwotfQotCi1mbG9hdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjb21wdXRlVm9sdW1lKGludCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCB1aW50MzJfdCBkZXZpY2UpCi17Ci0gICAgZmxvYXQgdm9sdW1lID0gMS4wOwotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0KLSAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgfQotCi0gICAgLy8gaWYgdm9sdW1lIGlzIG5vdCAwIChub3QgbXV0ZWQpLCBmb3JjZSBtZWRpYSB2b2x1bWUgdG8gbWF4IG9uIGRpZ2l0YWwgb3V0cHV0Ci0gICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6TVVTSUMgJiYKLSAgICAgICAgaW5kZXggIT0gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gJiYKLSAgICAgICAgZGV2aWNlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSB7Ci0gICAgICAgIHJldHVybiAxLjA7Ci0gICAgfQotCi0gICAgdm9sdW1lID0gdm9sSW5kZXhUb0FtcGwoZGV2aWNlLCBzdHJlYW1EZXNjLCBpbmRleCk7Ci0KLSAgICAvLyBpZiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkLCBhcHBseSB0aGUgZm9sbG93aW5nIHJ1bGVzIHRvIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMKLSAgICAvLyB0byBhdm9pZCBzb3VuZCBsZXZlbCBidXJzdHMgaW4gdXNlcidzIGVhcnM6Ci0gICAgLy8gLSBhbHdheXMgYXR0ZW51YXRlIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMgdm9sdW1lIGJ5IDZkQgotICAgIC8vIC0gaWYgbXVzaWMgaXMgcGxheWluZywgYWx3YXlzIGxpbWl0IHRoZSB2b2x1bWUgdG8gY3VycmVudCBtdXNpYyB2b2x1bWUsCi0gICAgLy8gd2l0aCBhIG1pbmltdW0gdGhyZXNob2xkIGF0IC0zNmRCIHNvIHRoYXQgbm90aWZpY2F0aW9uIGlzIGFsd2F5cyBwZXJjZWl2ZWQuCi0gICAgaWYgKChkZXZpY2UgJgotICAgICAgICAoQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAotICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKLSAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSkpICYmCi0gICAgICAgICgoZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0pID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlNZU1RFTSkpICYmCi0gICAgICAgIHN0cmVhbURlc2MubUNhbkJlTXV0ZWQpIHsKLSAgICAgICAgdm9sdW1lICo9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1I7Ci0gICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKLSAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKLSAgICAgICAgLy8ganVzdCBzdG9wcGVkCi0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbQXVkaW9TeXN0ZW06Ok1VU0lDXSB8fCBtTGltaXRSaW5ndG9uZVZvbHVtZSkgewotICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2wgPSBjb21wdXRlVm9sdW1lKEF1ZGlvU3lzdGVtOjpNVVNJQywgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tSW5kZXhDdXIsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAgICAgICAgIGZsb2F0IG1pblZvbCA9IChtdXNpY1ZvbCA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4pID8gbXVzaWNWb2wgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOOwotICAgICAgICAgICAgaWYgKHZvbHVtZSA+IG1pblZvbCkgewotICAgICAgICAgICAgICAgIHZvbHVtZSA9IG1pblZvbDsKLSAgICAgICAgICAgICAgICBMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbCwgbXVzaWNWb2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZvbHVtZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tBbmRTZXRWb2x1bWUoaW50IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90IGRldmljZSwgaW50IGRlbGF5TXMsIGJvb2wgZm9yY2UpCi17Ci0KLSAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKLSAgICBpZiAobU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLCBzdHJlYW0sIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKLSAgICBpZiAoKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCAmJiBtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPICYmIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pKSB7Ci0gICAgICAgIExPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAotICAgICAgICAgICAgIHN0cmVhbSwgbUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfQ09NTVVOSUNBVElPTl0pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7Ci0gICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6Ci0gICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKLSAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAotICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8Ci0gICAgICAgICAgICBmb3JjZSkgewotICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7Ci0gICAgICAgIExPR1YoInNldFN0cmVhbVZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKLSAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6RFRNRiB8fAotICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICAvLyBvZmZzZXQgdmFsdWUgdG8gcmVmbGVjdCBhY3R1YWwgaGFyZHdhcmUgdm9sdW1lIHRoYXQgbmV2ZXIgcmVhY2hlcyAwCi0gICAgICAgICAgICAvLyAxJSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGZpcnN0IHN0ZXAgaW4gVk9JQ0VfQ0FMTCBzdHJlYW0gdm9sdW1lIHNldHRpbmcgKHNlZSBBdWRpb1NlcnZpY2UuamF2YSkKLSAgICAgICAgICAgIHZvbHVtZSA9IDAuMDEgKyAwLjk5ICogdm9sdW1lOwotICAgICAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKLSAgICAgICAgICAgIC8vIGVuYWJsZWQKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7Ci0gICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOwotICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90IGRldmljZSwgaW50IGRlbGF5TXMsIGJvb2wgZm9yY2UpCi17Ci0gICAgTE9HVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIG91dHB1dCAlZCBhbmQgZGV2aWNlICV4Iiwgb3V0cHV0LCBkZXZpY2UpOwotCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBib29sIG9uLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zKQotewotICAgIExPR1YoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgJWQiLCBzdHJhdGVneSwgb24sIG91dHB1dCk7Ci0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBvbiwgb3V0cHV0LCBkZWxheU1zKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzZXRTdHJlYW1NdXRlKGludCBzdHJlYW0sIGJvb2wgb24sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMpCi17Ci0gICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLQotICAgIExPR1YoInNldFN0cmVhbU11dGUoKSBzdHJlYW0gJWQsIG11dGUgJWQsIG91dHB1dCAlZCwgbU11dGVDb3VudCAlZCIsIHN0cmVhbSwgb24sIG91dHB1dCwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKTsKLQotICAgIGlmIChvbikgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXQsIG91dHB1dERlc2MtPmRldmljZSgpLCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBpbmNyZW1lbnQgbU11dGVDb3VudCBhZnRlciBjYWxsaW5nIGNoZWNrQW5kU2V0Vm9sdW1lKCkgc28gdGhhdCB2b2x1bWUgY2hhbmdlIGlzIG5vdCBpZ25vcmVkCi0gICAgICAgIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgTE9HVygic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgc3RyZWFtRGVzYy5tSW5kZXhDdXIsIG91dHB1dCwgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihpbnQgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotCi0gICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKLSAgICAgICAgTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKLSAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOwotICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTG93VmlzaWJpbGl0eSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbUhhcmR3YXJlT3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKSkgewotICAgICAgICAgICAgICAgICAgICBMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbUhhcmR3YXJlT3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsIEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aXNJbkNhbGwoKQotewotICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1QaG9uZVN0YXRlKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgewotICAgIHJldHVybiAoKHN0YXRlID09IEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAoc3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfSU5fQ09NTVVOSUNBVElPTikpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6Om5lZWRzRGlyZWN0T3VwdXQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZSkKLXsKLSAgIHJldHVybiAoKGZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkgfHwKLSAgICAgICAgICAoZm9ybWF0ICE9MCAmJiAhQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQotewotICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c01lbW9yeSgpCi17Ci0gICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKLX0KLQotLy8gLS0tIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpCi0gICAgOiBtSWQoMCksIG1TYW1wbGluZ1JhdGUoMCksIG1Gb3JtYXQoMCksIG1DaGFubmVscygwKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzKTApLCBtRGV2aWNlKDApLCBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCkKLXsKLSAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewotICAgICAgICBtUmVmQ291bnRbaV0gPSAwOwotICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKLSAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1TdG9wVGltZVtpXSA9IDA7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpCi17Ci0gICAgdWludDMyX3QgZGV2aWNlID0gMDsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgZGV2aWNlID0gbU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZTsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXZpY2UgPSBtRGV2aWNlOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGRlbHRhKQotewotICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgfQotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOwotICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7Ci0gICAgTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6cmVmQ291bnQoKQotewotICAgIHVpbnQzMl90IHJlZmNvdW50ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewotICAgICAgICByZWZjb3VudCArPSBtUmVmQ291bnRbaV07Ci0gICAgfQotICAgIHJldHVybiByZWZjb3VudDsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdHJhdGVneVJlZkNvdW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgdWludDMyX3QgcmVmQ291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWkpID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICByZWZDb3VudCArPSBtUmVmQ291bnRbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlZkNvdW50OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVscyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBBdWRpb0lucHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoKQotICAgIDogbVNhbXBsaW5nUmF0ZSgwKSwgbUZvcm1hdCgwKSwgbUNoYW5uZWxzKDApLAotICAgICBtQWNvdXN0aWNzKChBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzKTApLCBtRGV2aWNlKDApLCBtUmVmQ291bnQoMCkKLXsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVscyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBY291c3RpY3MgJTA4eFxuIiwgbUFjb3VzdGljcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUmVmIENvdW50ICVkXG4iLCBtUmVmQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgJWRcbiIsCi0gICAgICAgICAgICBtSW5kZXhNaW4sCi0gICAgICAgICAgICBtSW5kZXhNYXgsCi0gICAgICAgICAgICBtSW5kZXhDdXIsCi0gICAgICAgICAgICBtQ2FuQmVNdXRlZCk7Ci19Ci0KLS8vIC0tLSBFZmZlY3REZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE91dHB1dDogJWRcbiIsIG1PdXRwdXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYjYxNGM0OC4uZGQ5MTc4OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTMwLDIxICszMCwxNyBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKLQotI2lmbmRlZiBIQVZFX0dFVFRJRAotIyBkZWZpbmUgZ2V0dGlkIGdldHBpZAotI2VuZGlmCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3lfaGFsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiBzdGF0aWMgY29uc3QgY2hhciAqa0RlYWRsb2NrZWRTdHJpbmcgPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDbWREZWFkbG9ja2VkU3RyaW5nID0gIkF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kIHRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIApAQCAtNjEsMTIgKzU3LDE5IEBACiAgICAgcmV0dXJuIG9rOwogfQogCituYW1lc3BhY2UgeworICAgIGV4dGVybiBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHM7Cit9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKLSAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgLCBtcFBvbGljeU1hbmFnZXIoTlVMTCkKKyAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpICwgbXBBdWRpb1BvbGljeShOVUxMKQogewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZTsKKyAgICBpbnQgZm9yY2VkX3ZhbDsKKyAgICBpbnQgcmM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC03NSwzMyArNzgsMzIgQEAKICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Db21tYW5kVGhyZWFkIikpOwogCi0jaWYgKGRlZmluZWQgR0VORVJJQ19BVURJTykgfHwgKGRlZmluZWQgQVVESU9fUE9MSUNZX1RFU1QpCi0gICAgbXBQb2xpY3lNYW5hZ2VyID0gbmV3IEF1ZGlvUG9saWN5TWFuYWdlckJhc2UodGhpcyk7Ci0gICAgTE9HVigiYnVpbGQgZm9yIEdFTkVSSUNfQVVESU8gLSB1c2luZyBnZW5lcmljIGF1ZGlvIHBvbGljeSIpOwotI2Vsc2UKLSAgICAvLyBpZiBydW5uaW5nIGluIGVtdWxhdGlvbiAtIHVzZSB0aGUgZW11bGF0b3IgZHJpdmVyCi0gICAgaWYgKHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCB2YWx1ZSwgMCkpIHsKLSAgICAgICAgTE9HVigiUnVubmluZyBpbiBlbXVsYXRpb24gLSB1c2luZyBnZW5lcmljIGF1ZGlvIHBvbGljeSIpOwotICAgICAgICBtcFBvbGljeU1hbmFnZXIgPSBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZSh0aGlzKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPR1YoIlVzaW5nIGhhcmR3YXJlIHNwZWNpZmljIGF1ZGlvIHBvbGljeSIpOwotICAgICAgICBtcFBvbGljeU1hbmFnZXIgPSBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIodGhpcyk7Ci0gICAgfQotI2VuZGlmCisgICAgLyogaW5zdGFudGlhdGUgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyICovCisgICAgcmMgPSBod19nZXRfbW9kdWxlKEFVRElPX1BPTElDWV9IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKChtcFBvbGljeU1hbmFnZXIgIT0gTlVMTCkgJiYgKG1wUG9saWN5TWFuYWdlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIGRlbGV0ZSBtcFBvbGljeU1hbmFnZXI7Ci0gICAgICAgIG1wUG9saWN5TWFuYWdlciA9IE5VTEw7Ci0gICAgfQorICAgIHJjID0gYXVkaW9fcG9saWN5X2Rldl9vcGVuKG1vZHVsZSwgJm1wQXVkaW9Qb2xpY3lEZXYpOworICAgIExPR0VfSUYocmMsICJjb3VsZG4ndCBvcGVuIGF1ZGlvIHBvbGljeSBkZXZpY2UgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNvdWxkIG5vdCBjcmVhdGUgQXVkaW9Qb2xpY3lNYW5hZ2VyIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbG9hZCBwcm9wZXJ0aWVzCi0gICAgICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgICAgICBtcFBvbGljeU1hbmFnZXItPnNldFN5c3RlbVByb3BlcnR5KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUpOwotICAgIH0KKyAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcEF1ZGlvUG9saWN5KTsKKyAgICBMT0dFX0lGKHJjLCAiY291bGRuJ3QgY3JlYXRlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm47CisKKyAgICByYyA9IG1wQXVkaW9Qb2xpY3ktPmluaXRfY2hlY2sobXBBdWRpb1BvbGljeSk7CisgICAgTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm47CisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBmb3JjZWRfdmFsID0gc3RydG9sKHZhbHVlLCBOVUxMLCAwKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfY2FuX211dGVfZW5mb3JjZWRfYXVkaWJsZShtcEF1ZGlvUG9saWN5LCAhZm9yY2VkX3ZhbCk7CisKKyAgICBMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7CiB9CiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCkBAIC0xMTEsNTcgKzExMyw1OSBAQAogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLmNsZWFyKCk7CiAKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyKSB7Ci0gICAgICAgIGRlbGV0ZSBtcFBvbGljeU1hbmFnZXI7Ci0gICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ICYmIG1wQXVkaW9Qb2xpY3lEZXYpCisgICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOworICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2KQorICAgICAgICBhdWRpb19wb2xpY3lfZGV2X2Nsb3NlKG1wQXVkaW9Qb2xpY3lEZXYpOwogfQogCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoZGV2aWNlKSAmJiAhQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoZGV2aWNlKSkgeworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKLSAgICAgICAgICAgIHN0YXRlICE9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKIH0KIAotQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoaW50IHN0YXRlKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEF1ZGlvU3lzdGVtOjpOVU1fTU9ERVMpIHsKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xNzEsMjE1ICsxNzUsMjE1IEBACiAgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcFBvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzaykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBtcFBvbGljeU1hbmFnZXItPnNldFJpbmdlck1vZGUobW9kZSwgbWFzayk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X3Jpbmdlcl9tb2RlKG1wQXVkaW9Qb2xpY3ksIG1vZGUsIG1hc2spOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQXVkaW9TeXN0ZW06Ok5VTV9GT1JDRV9VU0UpIHsKKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBdWRpb1N5c3RlbTo6TlVNX0ZPUkNFX0NPTkZJRykgeworICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBMT0dWKCJzZXRGb3JjZVVzZSgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSwgY29uZmlnKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLUF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSkKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORTsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkU7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBdWRpb1N5c3RlbTo6TlVNX0ZPUkNFX1VTRSkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkU7CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSk7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBMT0dWKCJnZXRPdXRwdXQoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGZsYWdzKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgZmxhZ3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIExPR1YoInN0YXJ0T3V0cHV0KCkgdGlkICVkIiwgZ2V0dGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RvcE91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTE9HVigicmVsZWFzZU91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQpOworICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7CiB9CiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoaW50IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGFjb3VzdGljcyk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBhY291c3RpY3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3BfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KGlucHV0KTsKKyAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBpZiAoc3RyZWFtIDwgMCB8fCBzdHJlYW0gPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKKyAgICBpZiAoc3RyZWFtIDwgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBtcFBvbGljeU1hbmFnZXItPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIG1wQXVkaW9Qb2xpY3ktPmluaXRfc3RyZWFtX3ZvbHVtZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgaWYgKHN0cmVhbSA8IDAgfHwgc3RyZWFtID49IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKSB7CisgICAgaWYgKHN0cmVhbSA8IDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4KTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCAqaW5kZXgpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQordWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dF9mb3JfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCkBAIC0zODgsMjcgKzM5MiwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnJlZ2lzdGVyRWZmZWN0KGRlc2MsIG91dHB1dCwgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+cmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MsIG91dHB1dCwgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+dW5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgaWQpOwogfQogCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoaW50IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewpAQCAtNDM1LDcgKzQzOSw3IEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wUG9saWN5TWFuYWdlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUG9saWN5TWFuYWdlciBJbnRlcmZhY2U6ICVwXG4iLCBtcEF1ZGlvUG9saWN5KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC00NjUsOCArNDY5LDggQEAKICAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1wUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgbXBQb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKKyAgICAgICAgaWYgKG1wQXVkaW9Qb2xpY3kpIHsKKyAgICAgICAgICAgIG1wQXVkaW9Qb2xpY3ktPmR1bXAobXBBdWRpb1BvbGljeSwgZmQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CkBAIC00OTUsMTU0ICs0OTksNiBAQAogfQogCiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvcGVuT3V0cHV0KHVpbnQzMl90ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIExPR1coIm9wZW5PdXRwdXQoKSBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQocERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKXBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgTE9HVygib3BlbkR1cGxpY2F0ZU91dHB1dCgpIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgTE9HVygic3VzcGVuZE91dHB1dCgpIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIik7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIExPR1coInJlc3RvcmVPdXRwdXQoKSBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIpOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5yZXN0b3JlT3V0cHV0KG91dHB1dCk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6b3BlbklucHV0KHVpbnQzMl90ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY291c3RpY3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBMT0dXKCJvcGVuSW5wdXQoKSBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5JbnB1dChwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgKHVpbnQzMl90ICopcEZvcm1hdCwgcENoYW5uZWxzLCBhY291c3RpY3MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZUlucHV0KGlucHV0KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT52b2x1bWVDb21tYW5kKChpbnQpc3RyZWFtLCB2b2x1bWUsIChpbnQpb3V0cHV0LCBkZWxheU1zKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1PdXRwdXQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgKGludClzcmNPdXRwdXQsIChpbnQpZHN0T3V0cHV0KTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoKGludClpb0hhbmRsZSwga2V5VmFsdWVQYWlycywgZGVsYXlNcyk7Ci19Ci0KLVN0cmluZzggQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleXMpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKHRvbmUsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKLXsKLSAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lKQpAQCAtODU5LDcgKzcxNSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChpbnQgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtODY4LDcgKzcyNCw3IEBACiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfUEFSQU1FVEVSUzsKICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IG5ldyBQYXJhbWV0ZXJzRGF0YSgpOwogICAgIGRhdGEtPm1JTyA9IGlvSGFuZGxlOwotICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzID0ga2V5VmFsdWVQYWlyczsKKyAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKICAgICBpZiAoZGVsYXlNcyA9PSAwKSB7CiAgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKQEAgLTg3OCw3ICs3MzQsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQsIGRlbGF5TXMpOwogICAgIExPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcGFyYW1ldGVyIHN0cmluZyAlcywgaW8gJWQgLGRlbGF5ICVkIiwKLSAgICAgICAgICAgIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIGtleVZhbHVlUGFpcnMsIGlvSGFuZGxlLCBkZWxheU1zKTsKICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKICAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdChtTG9jayk7CkBAIC0xMDIzLDQgKzg3OSwyMjYgQEAKICAgICAgICAgICAgIG1QYXJhbSk7CiB9CiAKKy8qKioqKioqIGhlbHBlcnMgZm9yIHRoZSBzZXJ2aWNlX29wcyBjYWxsYmFja3MgZGVmaW5lZCBiZWxvdyAqKioqKioqKiovCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5wYXJhbWV0ZXJzQ29tbWFuZCgoaW50KWlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2x1bWVDb21tYW5kKChpbnQpc3RyZWFtLCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW91dHB1dCwgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pCisgICAgICAgIExPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7CisgICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkKKyAgICAgICAgTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKKyAgICAgICAgICAgICB0b25lKTsKKyAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQoreworICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQoreworICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Cit9CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOworfQorCitzdGF0aWMgaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpCisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdGljIGludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjb3VzdGljcykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQocERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY291c3RpY3MpOworfQorCitzdGF0aWMgaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitzdGF0aWMgaW50IGFwc19zZXRfc3RyZWFtX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFmLT5zZXRTdHJlYW1PdXRwdXQoc3RyZWFtLCBvdXRwdXQpOworfQorCitzdGF0aWMgaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSwgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCAoaW50KXNyY19vdXRwdXQsIChpbnQpZHN0X291dHB1dCk7Cit9CisKK3N0YXRpYyBjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQoreworICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKKyAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGt2X3BhaXJzLCBkZWxheV9tcyk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworc3RhdGljIGludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOworfQorCitzdGF0aWMgaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworfTsgLy8gZXh0ZXJuICJDIgorCituYW1lc3BhY2UgeworICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wcyA9IHsKKyAgICAgICAgb3Blbl9vdXRwdXQgICAgICAgICAgIDogYXBzX29wZW5fb3V0cHV0LAorICAgICAgICBvcGVuX2R1cGxpY2F0ZV9vdXRwdXQgOiBhcHNfb3Blbl9kdXBfb3V0cHV0LAorICAgICAgICBjbG9zZV9vdXRwdXQgICAgICAgICAgOiBhcHNfY2xvc2Vfb3V0cHV0LAorICAgICAgICBzdXNwZW5kX291dHB1dCAgICAgICAgOiBhcHNfc3VzcGVuZF9vdXRwdXQsCisgICAgICAgIHJlc3RvcmVfb3V0cHV0ICAgICAgICA6IGFwc19yZXN0b3JlX291dHB1dCwKKyAgICAgICAgb3Blbl9pbnB1dCAgICAgICAgICAgIDogYXBzX29wZW5faW5wdXQsCisgICAgICAgIGNsb3NlX2lucHV0ICAgICAgICAgICA6IGFwc19jbG9zZV9pbnB1dCwKKyAgICAgICAgc2V0X3N0cmVhbV92b2x1bWUgICAgIDogYXBzX3NldF9zdHJlYW1fdm9sdW1lLAorICAgICAgICBzZXRfc3RyZWFtX291dHB1dCAgICAgOiBhcHNfc2V0X3N0cmVhbV9vdXRwdXQsCisgICAgICAgIHNldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19zZXRfcGFyYW1ldGVycywKKyAgICAgICAgZ2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX2dldF9wYXJhbWV0ZXJzLAorICAgICAgICBzdGFydF90b25lICAgICAgICAgICAgOiBhcHNfc3RhcnRfdG9uZSwKKyAgICAgICAgc3RvcF90b25lICAgICAgICAgICAgIDogYXBzX3N0b3BfdG9uZSwKKyAgICAgICAgc2V0X3ZvaWNlX3ZvbHVtZSAgICAgIDogYXBzX3NldF92b2ljZV92b2x1bWUsCisgICAgICAgIG1vdmVfZWZmZWN0cyAgICAgICAgICA6IGFwc19tb3ZlX2VmZmVjdHMsCisgICAgfTsKK307IC8vIG5hbWVzcGFjZSA8dW5uYW1lZD4KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCBmYWFkODkzLi5kOWI1YWRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0xOCwxMSArMTgsMTQgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL1RvbmVHZW5lcmF0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5X2hhbC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFN0cmluZzg7CkBAIC0zMiw3ICszNSw3IEBACiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCiAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotICAgIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKKy8vICAgIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OwpAQCAtNDcsNDYgKzUwLDQ2IEBACiAgICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgdmlydHVhbCBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGludCBzdGF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSaW5nZXJNb2RlKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IG1hc2spOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKTsKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpGT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19JTkRJUkVDVCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OkZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzKTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2luX2Fjb3VzdGljc190KTApOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50ICppbmRleCk7CiAKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLApAQCAtMTA3LDQwICsxMTAsMjEgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwogCiAgICAgLy8KLSAgICAvLyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZQorICAgIC8vIEhlbHBlcnMgZm9yIHRoZSBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGltcGxlbWVudGF0aW9uLgorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0CisgICAgLy8gYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBwb2xpY3kgc2VydmljZS4KICAgICAvLwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dCh1aW50MzJfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncyk7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dCh1aW50MzJfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtT3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdG9uZSwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKTsKQEAgLTE4MCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKGludCB0eXBlID0gMCwgaW50IHN0cmVhbSA9IDApOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChpbnQgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGludCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGludCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoaW50IGlvSGFuZGxlLCBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogCkBAIC0yNDAsOSArMjI0LDExIEBACiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIG1wUG9saWN5TWFuYWdlcjsgICAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCiAgICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCisKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGI1MmZjNjkuLmUzNTQzNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMSwzOCArMSw1IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAotIyBTZXQgVVNFX0NBTUVSQV9TVFVCIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgaGFyZHdhcmUgY2FtZXJhLgotCi0jIGZvcmNlIHRoZXNlIGJ1aWxkcyB0byB1c2UgY2FtZXJhIHN0dWIgb25seQotaWZuZXEgKCQoZmlsdGVyIHNvb25lciBnZW5lcmljIHNpbSwkKFRBUkdFVF9ERVZJQ0UpKSwpCi0gIFVTRV9DQU1FUkFfU1RVQjo9dHJ1ZQotZW5kaWYKLQotaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLCkKLSAgVVNFX0NBTUVSQV9TVFVCOj1mYWxzZQotZW5kaWYKLQotaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLHRydWUpCi0jCi0jIGxpYmNhbWVyYXN0dWIKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIENhbWVyYUhhcmR3YXJlU3R1Yi5jcHAgICAgICBcCi0gICAgRmFrZUNhbWVyYS5jcHAKLQotTE9DQUxfTU9EVUxFOj0gbGliY2FtZXJhc3R1YgotCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfUFJPQ0VTUwotZW5kaWYKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IGxpYnVpCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLWVuZGlmICMgVVNFX0NBTUVSQV9TVFVCCi0KICMKICMgbGliY2FtZXJhc2VydmljZQogIwpAQCAtNDksMTkgKzE2LDkgQEAKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYm1lZGlhIFwKICAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAotICAgIGxpYmd1aQorICAgIGxpYmd1aSBcCisgICAgbGliaGFyZHdhcmUKIAogTE9DQUxfTU9EVUxFOj0gbGliY2FtZXJhc2VydmljZQogCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfUFJPQ0VTUwotZW5kaWYKLQotaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLCB0cnVlKQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJjYW1lcmFzdHViCi1lbHNlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNhbWVyYSAKLWVuZGlmCi0KIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTg4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9IQVJEV0FSRV9JTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9IQVJEV0FSRV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHVpL2FuZHJvaWRfbmF0aXZlX2J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiB2b2lkICgqbm90aWZ5X2NhbGxiYWNrKShpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKTsKKwordHlwZWRlZiB2b2lkICgqZGF0YV9jYWxsYmFjaykoaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpOworCit0eXBlZGVmIHZvaWQgKCpkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCkobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpOworCisvKioKKyAqIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZQorICogY2FtZXJhIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyLCB1c2VkIGZvciBzZXR0aW5nIGFuZCBnZXR0aW5nCisgKiBwYXJhbWV0ZXJzLCBsaXZlIHByZXZpZXdpbmcsIGFuZCB0YWtpbmcgcGljdHVyZXMuCisgKgorICogSXQgaXMgYSByZWZlcmVuY2VkIGNvdW50ZWQgaW50ZXJmYWNlIHdpdGggUmVmQmFzZSBhcyBpdHMgYmFzZSBjbGFzcy4KKyAqIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCkgdG8gcmV0cmlldmUgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUKKyAqIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGFuZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUKKyAqIGZvbGxvd2luZyBzdGVwcyBkZXNjcmliZSBhIHR5cGljYWwgc2VxdWVuY2U6CisgKgorICogICAtIyBBZnRlciBDYW1lcmFTZXJ2aWNlIGNhbGxzIG9wZW5DYW1lcmFIYXJkd2FyZSgpLCBnZXRQYXJhbWV0ZXJzKCkgYW5kCisgKiAgICAgIHNldFBhcmFtZXRlcnMoKSBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjYW1lcmEgaW5zdGFuY2UuCisgKiAgICAgIENhbWVyYVNlcnZpY2UgY2FsbHMgZ2V0UHJldmlld0hlYXAoKSB0byBlc3RhYmxpc2ggYWNjZXNzIHRvIHRoZQorICogICAgICBwcmV2aWV3IGhlYXAgc28gaXQgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBTdXJmYWNlRmxpbmdlciBmb3IKKyAqICAgICAgZWZmaWNpZW50IGRpc3BsYXkgdXBkYXRpbmcgd2hpbGUgaW4gcHJldmlldyBtb2RlLgorICogICAtIyBzdGFydFByZXZpZXcoKSBpcyBjYWxsZWQuICBUaGUgY2FtZXJhIGluc3RhbmNlIHRoZW4gcGVyaW9kaWNhbGx5CisgKiAgICAgIHNlbmRzIHRoZSBtZXNzYWdlIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSAoaWYgZW5hYmxlZCkgZWFjaCB0aW1lCisgKiAgICAgIGEgbmV3IHByZXZpZXcgZnJhbWUgaXMgYXZhaWxhYmxlLiAgSWYgZGF0YSBjYWxsYmFjayBjb2RlIG5lZWRzIHRvIHVzZQorICogICAgICB0aGlzIG1lbW9yeSBhZnRlciByZXR1cm5pbmcsIGl0IG11c3QgY29weSB0aGUgZGF0YS4KKyAqCisgKiBQcmlvciB0byB0YWtpbmcgYSBwaWN0dXJlLCBDYW1lcmFTZXJ2aWNlIGNhbGxzIGF1dG9mb2N1cygpLiBXaGVuIGF1dG8KKyAqIGZvY3VzaW5nIGhhcyBjb21wbGV0ZWQsIHRoZSBjYW1lcmEgaW5zdGFuY2Ugc2VuZHMgYSBDQU1FUkFfTVNHX0ZPQ1VTIG5vdGlmaWNhdGlvbiwKKyAqIHdoaWNoIGluZm9ybXMgdGhlIGFwcGxpY2F0aW9uIHdoZXRoZXIgZm9jdXNpbmcgd2FzIHN1Y2Nlc3NmdWwuIFRoZSBjYW1lcmEgaW5zdGFuY2UKKyAqIG9ubHkgc2VuZHMgdGhpcyBtZXNzYWdlIG9uY2UgYW5kIGl0IGlzIHVwICB0byB0aGUgYXBwbGljYXRpb24gdG8gY2FsbCBhdXRvRm9jdXMoKQorICogYWdhaW4gaWYgcmVmb2N1c2luZyBpcyBkZXNpcmVkLgorICoKKyAqIENhbWVyYVNlcnZpY2UgY2FsbHMgdGFrZVBpY3R1cmUoKSB0byByZXF1ZXN0IHRoZSBjYW1lcmEgaW5zdGFuY2UgdGFrZSBhCisgKiBwaWN0dXJlLiBBdCB0aGlzIHBvaW50LCBpZiBhIHNodXR0ZXIsIHBvc3R2aWV3LCByYXcsIGFuZC9vciBjb21wcmVzc2VkIGNhbGxiYWNrCisgKiBpcyBkZXNpcmVkLCB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIG11c3QgYmUgZW5hYmxlZC4gQXMgd2l0aCBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsCisgKiBhbnkgbWVtb3J5IHByb3ZpZGVkIGluIGEgZGF0YSBjYWxsYmFjayBtdXN0IGJlIGNvcGllZCBpZiBpdCdzIG5lZWRlZCBhZnRlciByZXR1cm5pbmcuCisgKi8KKworY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShod19tb2R1bGVfdCAqbW9kdWxlLCBjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgbURldmljZSA9IDA7CisgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMsIHRoaXMgJXAiLCBuYW1lLCB0aGlzKTsKKyAgICAgICAgaW50IHJjID0gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CisgICAgICAgIGlmIChyYyAhPSBPSykKKyAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBvcGVuIGNhbWVyYSAlczogJWQiLCBuYW1lLCByYyk7CisgICAgICAgIGluaXRIYWxQcmV2aWV3V2luZG93KCk7CisgICAgfQorCisgICAgfkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCkKKyAgICB7CisgICAgICAgIExPR0koIkRlc3Ryb3lpbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpbnQgcmMgPSBtRGV2aWNlLT5jb21tb24uY2xvc2UoJm1EZXZpY2UtPmNvbW1vbik7CisgICAgICAgIGlmIChyYyAhPSBPSykKKyAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBjbG9zZSBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKKyAgICB9CisKKyAgICAvKiogU2V0IHRoZSBBTmF0aXZlV2luZG93IHRvIHdoaWNoIHByZXZpZXcgZnJhbWVzIGFyZSBzZW50ICovCisgICAgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIGJ1ZiAlcCIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCksIGJ1Zi5nZXQoKSk7CisKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c2V0X3ByZXZpZXdfd2luZG93KSB7CisgICAgICAgICAgICBtUHJldmlld1dpbmRvdyA9IGJ1ZjsKKyAgICAgICAgICAgIG1IYWxQcmV2aWV3V2luZG93LnVzZXIgPSB0aGlzOworICAgICAgICAgICAgTE9HVigiJXMgJm1IYWxQcmV2aWV3V2luZG93ICVwIG1IYWxQcmV2aWV3V2luZG93LnVzZXIgJXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICZtSGFsUHJldmlld1dpbmRvdywgbUhhbFByZXZpZXdXaW5kb3cudXNlcik7CisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgYnVmLmdldCgpID8gJm1IYWxQcmV2aWV3V2luZG93Lm53IDogMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBhbmQgZGF0YSBjYWxsYmFja3MgKi8KKyAgICB2b2lkIHNldENhbGxiYWNrcyhub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2sgZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKQorICAgIHsKKyAgICAgICAgbU5vdGlmeUNiID0gbm90aWZ5X2NiOworICAgICAgICBtRGF0YUNiID0gZGF0YV9jYjsKKyAgICAgICAgbURhdGFDYlRpbWVzdGFtcCA9IGRhdGFfY2JfdGltZXN0YW1wOworICAgICAgICBtQ2JVc2VyID0gdXNlcjsKKworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKworICAgICAgICBpZiAobURldmljZS0+b3BzLT5zZXRfY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtRGV2aWNlLT5vcHMtPnNldF9jYWxsYmFja3MobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nZXRfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFsbCB0YWtlIGEgbXNndHlwZSwKKyAgICAgKiB3aGljaCBpcyBhIGJpdG1hc2sgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4KKyAgICAgKiBpbmNsdWRlL3VpL0NhbWVyYS5oCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBtZXNzYWdlLCBvciBzZXQgb2YgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBlbmFibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5lbmFibGVfbXNnX3R5cGUpCisgICAgICAgICAgICBtRGV2aWNlLT5vcHMtPmVuYWJsZV9tc2dfdHlwZShtRGV2aWNlLCBtc2dUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgbWVzc2FnZSwgb3IgYSBzZXQgb2YgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBPbmNlIHJlY2VpdmVkIGEgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgY2FtZXJhIGhhbAorICAgICAqIHNob3VsZCBub3QgcmVseSBvbiBpdHMgY2xpZW50IHRvIGNhbGwgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgdG8gcmVsZWFzZQorICAgICAqIHZpZGVvIHJlY29yZGluZyBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYWwgaGFsIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlCisgICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkgY2FsbC4gQ2FtZXJhIGhhbCBjbGllbnRzIG11c3Qgbm90CisgICAgICogbW9kaWZ5L2FjY2VzcyBhbnkgdmlkZW8gcmVjb3JkaW5nIGZyYW1lIGFmdGVyIGNhbGxpbmcKKyAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5kaXNhYmxlX21zZ190eXBlKQorICAgICAgICAgICAgbURldmljZS0+b3BzLT5kaXNhYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHdoZXRoZXIgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcywgaXMgZW5hYmxlZC4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBvcGVyYXRlcyBhcyBhbiBBTkQsIGlmIGFueSBvZiB0aGUgbWVzc2FnZXMKKyAgICAgKiBxdWVyaWVkIGFyZSBvZmYsIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgaW50IG1zZ1R5cGVFbmFibGVkKGludDMyX3QgbXNnVHlwZSkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5tc2dfdHlwZV9lbmFibGVkKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+bXNnX3R5cGVfZW5hYmxlZChtRGV2aWNlLCBtc2dUeXBlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHByZXZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydFByZXZpZXcoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnN0YXJ0X3ByZXZpZXcpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zdGFydF9wcmV2aWV3KG1EZXZpY2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCBwcmV2aWV3LgorICAgICAqLworICAgIHZvaWQgc3RvcFByZXZpZXcoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnN0b3BfcHJldmlldykKKyAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+c3RvcF9wcmV2aWV3KG1EZXZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcmV2aWV3IGlzIGVuYWJsZWQuCisgICAgICovCisgICAgaW50IHByZXZpZXdFbmFibGVkKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5wcmV2aWV3X2VuYWJsZWQpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5wcmV2aWV3X2VuYWJsZWQobURldmljZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlIG1ldGEgZGF0YSBvciByZWFsIFlVViBkYXRhIGluCisgICAgICogdGhlIHZpZGVvIGJ1ZmZlcnMgc2VuZCBvdXQgdmlhIENBTUVSQV9NU0dfVklERU9fRlJSQU1FIGZvciBhCisgICAgICogcmVjb3JkaW5nIHNlc3Npb24uIElmIGl0IGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IGNhbWVyYQorICAgICAqIGhhbCBiZWhhdmlvciBpcyB0byBzdG9yZSByZWFsIFlVViBkYXRhIGluIHRoZSB2aWRlbyBidWZmZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRSZWNvcmRpbmcoKSBpbiBvcmRlcgorICAgICAqIHRvIGJlIGVmZmVjdGl2ZS4KKyAgICAgKgorICAgICAqIElmIG1ldGEgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHZpZGVvIGJ1ZmZlcnMsIGl0IGlzIHVwIHRvIHRoZQorICAgICAqIHJlY2VpdmVyIG9mIHRoZSB2aWRlbyBidWZmZXJzIHRvIGludGVycHJldCB0aGUgY29udGVudHMgYW5kCisgICAgICogdG8gZmluZCB0aGUgYWN0dWFsIGZyYW1lIGRhdGEgd2l0aCB0aGUgaGVscCBvZiB0aGUgbWV0YSBkYXRhCisgICAgICogaW4gdGhlIGJ1ZmZlci4gSG93IHRoaXMgaXMgZG9uZSBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZgorICAgICAqIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogU29tZSBjYW1lcmEgaGFsIG1heSBub3Qgc3VwcG9ydCBzdG9yaW5nIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8KKyAgICAgKiBidWZmZXJzLCBidXQgYWxsIGNhbWVyYSBoYWwgc2hvdWxkIHN1cHBvcnQgc3RvcmluZyByZWFsIFlVViBkYXRhCisgICAgICogaW4gdGhlIHZpZGVvIGJ1ZmZlcnMuIElmIHRoZSBjYW1lcmEgaGFsIGRvZXMgbm90IHN1cHBvcnQgc3RvcmluZworICAgICAqIHRoZSBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnMgd2hlbiBpdCBpcyByZXF1ZXN0ZWQgdG8gZG8KKyAgICAgKiBkbywgSU5WQUxJRF9PUEVSQVRJT04gbXVzdCBiZSByZXR1cm5lZC4gSXQgaXMgdmVyeSB1c2VmdWwgZm9yCisgICAgICogdGhlIGNhbWVyYSBoYWwgdG8gcGFzcyBtZXRhIGRhdGEgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBmcmFtZQorICAgICAqIGRhdGEgZGlyZWN0bHkgdG8gdGhlIHZpZGVvIGVuY29kZXIsIHNpbmNlIHRoZSBhbW91bnQgb2YgdGhlCisgICAgICogdW5jb21wcmVzc2VkIGZyYW1lIGRhdGEgY2FuIGJlIHZlcnkgbGFyZ2UgaWYgdmlkZW8gc2l6ZSBpcyBsYXJnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGUgaWYgdHJ1ZSB0byBpbnN0cnVjdCB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZQorICAgICAqICAgICAgbWV0YSBkYXRhIGluIHRoZSB2aWRlbyBidWZmZXJzOyBmYWxzZSB0byBpbnN0cnVjdAorICAgICAqICAgICAgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUgcmVhbCBZVVYgZGF0YSBpbiB0aGUgdmlkZW8KKyAgICAgKiAgICAgIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIG9uIHN1Y2Nlc3MuCisgICAgICovCisKKyAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGludCBlbmFibGUpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycyhtRGV2aWNlLCBlbmFibGUpOworICAgICAgICByZXR1cm4gZW5hYmxlID8gSU5WQUxJRF9PUEVSQVRJT046IE9LOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHJlY29yZCBtb2RlLiBXaGVuIGEgcmVjb3JkIGltYWdlIGlzIGF2YWlsYWJsZSBhIENBTUVSQV9NU0dfVklERU9fRlJBTUUKKyAgICAgKiBtZXNzYWdlIGlzIHNlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmcmFtZS4gRXZlcnkgcmVjb3JkIGZyYW1lIG11c3QgYmUgcmVsZWFzZWQKKyAgICAgKiBieSBhIGNhbWVyYWwgaGFsIGNsaWVudCB2aWEgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgYmVmb3JlIHRoZSBjbGllbnQgY2FsbHMKKyAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgdGhlIGNsaWVudCBjYWxscworICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MgcmVzcG9uc2liaWxpdHkKKyAgICAgKiB0byBtYW5hZ2UgdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHZpZGVvIHJlY29yZGluZyBmcmFtZXMsIGFuZCB0aGUgY2xpZW50IG11c3QKKyAgICAgKiBub3QgbW9kaWZ5L2FjY2VzcyBhbnkgdmlkZW8gcmVjb3JkaW5nIGZyYW1lcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydFJlY29yZGluZygpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c3RhcnRfcmVjb3JkaW5nKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RhcnRfcmVjb3JkaW5nKG1EZXZpY2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCByZWNvcmRpbmcuCisgICAgICovCisgICAgdm9pZCBzdG9wUmVjb3JkaW5nKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5zdG9wX3JlY29yZGluZykKKyAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+c3RvcF9yZWNvcmRpbmcobURldmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHJlY29yZGluZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIGludCByZWNvcmRpbmdFbmFibGVkKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5yZWNvcmRpbmdfZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnJlY29yZGluZ19lbmFibGVkKG1EZXZpY2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhIHJlY29yZCBmcmFtZSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IENBTUVSQV9NU0dfVklERU9fRlJBTUUuCisgICAgICoKKyAgICAgKiBJdCBpcyBjYW1lcmEgaGFsIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIHJlbGVhc2UgdmlkZW8gcmVjb3JkaW5nCisgICAgICogZnJhbWVzIHNlbnQgb3V0IGJ5IHRoZSBjYW1lcmEgaGFsIGJlZm9yZSB0aGUgY2FtZXJhIGhhbCByZWNlaXZlcworICAgICAqIGEgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgaXQgcmVjZWl2ZXMKKyAgICAgKiB0aGUgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgaXQgaXMgY2FtZXJhIGhhbCdzCisgICAgICogcmVzcG9uc2liaWxpdHkgb2YgbWFuYWdpbmcgdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHZpZGVvIHJlY29yZGluZworICAgICAqIGZyYW1lcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKSB7CisgICAgICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisgICAgICAgICAgICB2b2lkICpkYXRhID0gKCh1aW50OF90ICopaGVhcC0+YmFzZSgpKSArIG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKG1EZXZpY2UsIGRhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYXV0byBmb2N1cywgdGhlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayByb3V0aW5lIGlzIGNhbGxlZAorICAgICAqIHdpdGggQ0FNRVJBX01TR19GT0NVUyBvbmNlIHdoZW4gZm9jdXNpbmcgaXMgY29tcGxldGUuIGF1dG9Gb2N1cygpCisgICAgICogd2lsbCBiZSBjYWxsZWQgYWdhaW4gaWYgYW5vdGhlciBhdXRvIGZvY3VzIGlzIG5lZWRlZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhdXRvRm9jdXMoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPmF1dG9fZm9jdXMpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5hdXRvX2ZvY3VzKG1EZXZpY2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhdXRvLWZvY3VzIGZ1bmN0aW9uLiBJZiB0aGUgYXV0by1mb2N1cyBpcyBzdGlsbCBpbiBwcm9ncmVzcywKKyAgICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY2FuY2VsIGl0LiBXaGV0aGVyIHRoZSBhdXRvLWZvY3VzIGlzIGluIHByb2dyZXNzCisgICAgICogb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBmb2N1cyBwb3NpdGlvbiB0byB0aGUgZGVmYXVsdC4KKyAgICAgKiBJZiB0aGUgY2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgYXV0by1mb2N1cywgdGhpcyBpcyBhIG5vLW9wLgorICAgICAqLworICAgIHN0YXR1c190IGNhbmNlbEF1dG9Gb2N1cygpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+Y2FuY2VsX2F1dG9fZm9jdXMpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5jYW5jZWxfYXV0b19mb2N1cyhtRGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYSBwaWN0dXJlLgorICAgICAqLworICAgIHN0YXR1c190IHRha2VQaWN0dXJlKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT50YWtlX3BpY3R1cmUpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT50YWtlX3BpY3R1cmUobURldmljZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSBwaWN0dXJlIHRoYXQgd2FzIHN0YXJ0ZWQgd2l0aCB0YWtlUGljdHVyZS4gIENhbGxpbmcgdGhpcworICAgICAqIG1ldGhvZCB3aGVuIG5vIHBpY3R1cmUgaXMgYmVpbmcgdGFrZW4gaXMgYSBuby1vcC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjYW5jZWxQaWN0dXJlKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5jYW5jZWxfcGljdHVyZSkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9waWN0dXJlKG1EZXZpY2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gVGhpcyByZXR1cm5zIEJBRF9WQUxVRSBpZiBhbnkgcGFyYW1ldGVyIGlzCisgICAgICogaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyAmcGFyYW1zKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnNldF9wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2V0X3BhcmFtZXRlcnMobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZsYXR0ZW4oKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gKi8KKyAgICBDYW1lcmFQYXJhbWV0ZXJzIGdldFBhcmFtZXRlcnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFybXM7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPmdldF9wYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBjaGFyICp0ZW1wID0gbURldmljZS0+b3BzLT5nZXRfcGFyYW1ldGVycyhtRGV2aWNlKTsKKyAgICAgICAgICAgIFN0cmluZzggc3RyX3Bhcm1zKHRlbXApOworICAgICAgICAgICAgZnJlZSh0ZW1wKTsKKyAgICAgICAgICAgIHBhcm1zLnVuZmxhdHRlbihzdHJfcGFybXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGNvbW1hbmQgdG8gY2FtZXJhIGRyaXZlci4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c2VuZF9jb21tYW5kKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2VuZF9jb21tYW5kKG1EZXZpY2UsIGNtZCwgYXJnMSwgYXJnMik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgb3duZWQgYnkgdGhpcyBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBpcworICAgICAqICpub3QqIGRvbmUgaW4gdGhlIGRlc3RydWN0b3IuCisgICAgICovCisgICAgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+cmVsZWFzZSkKKyAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+cmVsZWFzZShtRGV2aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wIHN0YXRlIG9mIHRoZSBjYW1lcmEgaGFyZHdhcmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5kdW1wKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+ZHVtcChtRGV2aWNlLCBmZCk7CisgICAgICAgIHJldHVybiBPSzsgLy8gSXQncyBmaW5lIGlmIHRoZSBIQUwgZG9lc24ndCBpbXBsZW1lbnQgZHVtcCgpCisgICAgfQorCitwcml2YXRlOgorICAgIGNhbWVyYV9kZXZpY2VfdCAqbURldmljZTsKKyAgICBTdHJpbmc4IG1OYW1lOworCisgICAgc3RhdGljIHZvaWQgX19ub3RpZnlfY2IoaW50MzJfdCBtc2dfdHlwZSwgaW50MzJfdCBleHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCAqdXNlcikKKyAgICB7CisgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CisgICAgICAgIF9fdGhpcy0+bU5vdGlmeUNiKG1zZ190eXBlLCBleHQxLCBleHQyLCBfX3RoaXMtPm1DYlVzZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIF9fZGF0YV9jYihpbnQzMl90IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKKyAgICB7CisgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CisgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOworICAgICAgICBpZiAoaW5kZXggPj0gbWVtLT5tTnVtQnVmcykgeworICAgICAgICAgICAgTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIF9fdGhpcy0+bURhdGFDYihtc2dfdHlwZSwgbWVtLT5tQnVmZmVyc1tpbmRleF0sIF9fdGhpcy0+bUNiVXNlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgX19kYXRhX2NiX3RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKKyAgICB7CisgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CisgICAgICAgIC8vIFN0YXJ0IHJlZmNvdW50aW5nIHRoZSBoZWFwIG9iamVjdCBmcm9tIGhlcmUgb24uICBXaGVuIHRoZSBjbGllbnRzCisgICAgICAgIC8vIGRyb3AgYWxsIHJlZmVyZW5jZXMsIGl0IHdpbGwgYmUgZGVzdHJveWVkIChhcyB3ZWxsIGFzIHRoZSBlbmNsb3NlZAorICAgICAgICAvLyBNZW1vcnlIZWFwQmFzZS4KKyAgICAgICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4oZGF0YS0+aGFuZGxlKSk7CisgICAgICAgIGlmIChpbmRleCA+PSBtZW0tPm1OdW1CdWZzKSB7CisgICAgICAgICAgICBMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICBpbmRleCwgbWVtLT5tTnVtQnVmcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgX190aGlzLT5tRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgbXNnX3R5cGUsIG1lbS0+bUJ1ZmZlcnNbaW5kZXhdLCBfX3RoaXMtPm1DYlVzZXIpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRoYXQgY29tYmluZXMgYSBNZW1vcnlIZWFwQmFzZSBhbmQgYSBNZW1vcnlCYXNlCisgICAgLy8gaW4gb25lLiAgU2luY2Ugd2UgdGVuZCB0byB1c2UgdGhlbSBpbiBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwLCB0aGlzIGlzCisgICAgLy8gaGFuZHkuCisKKyAgICBjbGFzcyBDYW1lcmFIZWFwTWVtb3J5IDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeShpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZmZXJzID0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmcyhudW1fYnVmZmVycykKKyAgICAgICAgeworICAgICAgICAgICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoZmQsIGJ1Zl9zaXplICogbnVtX2J1ZmZlcnMpOworICAgICAgICAgICAgY29tbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkoc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZmZlcnMgPSAxKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUoYnVmX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1CdWZzKG51bV9idWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBtSGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShidWZfc2l6ZSAqIG51bV9idWZmZXJzKTsKKyAgICAgICAgICAgIGNvbW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNvbW1vbkluaXRpYWxpemF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlLmRhdGEgPSBtSGVhcC0+YmFzZSgpOworICAgICAgICAgICAgaGFuZGxlLnNpemUgPSBtQnVmU2l6ZSAqIG1OdW1CdWZzOworICAgICAgICAgICAgaGFuZGxlLmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgICAgIG1CdWZmZXJzID0gbmV3IHNwPE1lbW9yeUJhc2U+W21OdW1CdWZzXTsKKyAgICAgICAgICAgIGZvciAodWludF90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IG5ldyBNZW1vcnlCYXNlKG1IZWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAqIG1CdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUpOworCisgICAgICAgICAgICBoYW5kbGUucmVsZWFzZSA9IF9fcHV0X21lbW9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNhbWVyYUhlYXBNZW1vcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgW10gbUJ1ZmZlcnM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbUJ1ZlNpemU7CisgICAgICAgIHVpbnRfdCBtTnVtQnVmczsKKyAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1IZWFwOworICAgICAgICBzcDxNZW1vcnlCYXNlPiAqbUJ1ZmZlcnM7CisKKyAgICAgICAgY2FtZXJhX21lbW9yeV90IGhhbmRsZTsKKyAgICB9OworCisgICAgc3RhdGljIGNhbWVyYV9tZW1vcnlfdCogX19nZXRfbWVtb3J5KGludCBmZCwgc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCisgICAgeworICAgICAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW07CisgICAgICAgIGlmIChmZCA8IDApCisgICAgICAgICAgICBtZW0gPSBuZXcgQ2FtZXJhSGVhcE1lbW9yeShidWZfc2l6ZSwgbnVtX2J1ZnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtZW0gPSBuZXcgQ2FtZXJhSGVhcE1lbW9yeShmZCwgYnVmX3NpemUsIG51bV9idWZzKTsKKyAgICAgICAgbWVtLT5pbmNTdHJvbmcobWVtKTsKKyAgICAgICAgcmV0dXJuICZtZW0tPmhhbmRsZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBfX3B1dF9tZW1vcnkoY2FtZXJhX21lbW9yeV90ICpkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKCFkYXRhKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkgKm1lbSA9IHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4oZGF0YS0+aGFuZGxlKTsKKyAgICAgICAgbWVtLT5kZWNTdHJvbmcobWVtKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQU5hdGl2ZVdpbmRvdyAqX190b19hbncodm9pZCAqdXNlcikKKyAgICB7CisgICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpfX3RoaXMgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CisgICAgICAgIHJldHVybiBfX3RoaXMtPm1QcmV2aWV3V2luZG93LmdldCgpOworICAgIH0KKyNkZWZpbmUgYW53KG4pIF9fdG9fYW53KCgoc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyAqKW4pLT51c2VyKQorCisgICAgc3RhdGljIGludCBfX2RlcXVldWVfYnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyKQorICAgIHsKKyAgICAgICAgaW50IHJjOworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CisgICAgICAgIHJjID0gYS0+ZGVxdWV1ZUJ1ZmZlcihhLCAmYW5iKTsKKyAgICAgICAgaWYgKCFyYykgeworICAgICAgICAgICAgcmMgPSBhLT5sb2NrQnVmZmVyKGEsIGFuYik7CisgICAgICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgICAgICpidWZmZXIgPSAmYW5iLT5oYW5kbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYS0+Y2FuY2VsQnVmZmVyKGEsIGFuYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworI2lmbmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHR5cGVvZigoKHR5cGUgKikgMCktPm1lbWJlcikgKl9fbXB0ciA9IChwdHIpOyAgICAgXAorICAgICAgICAodHlwZSAqKSAoKGNoYXIgKikgX19tcHRyIC0gKGNoYXIgKikoJigodHlwZSAqKTApLT5tZW1iZXIpKTsgfSkKKyNlbmRpZgorCisgICAgc3RhdGljIGludCBfX2VucXVldWVfYnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpCisgICAgeworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICByZXR1cm4gYS0+cXVldWVCdWZmZXIoYSwKKyAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19jYW5jZWxfYnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpCisgICAgeworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICByZXR1cm4gYS0+Y2FuY2VsQnVmZmVyKGEsCisgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcl9jb3VudChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgY291bnQpCisgICAgeworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCisgICAgeworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19zZXRfY3JvcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAorICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pCisgICAgeworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKKyAgICAgICAgY3JvcC5sZWZ0ID0gbGVmdDsKKyAgICAgICAgY3JvcC50b3AgPSB0b3A7CisgICAgICAgIGNyb3AucmlnaHQgPSByaWdodDsKKyAgICAgICAgY3JvcC5ib3R0b20gPSBib3R0b207CisgICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICZjcm9wKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IF9fc2V0X3VzYWdlKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCB1c2FnZSkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF91c2FnZShhLCB1c2FnZSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBfX3NldF9zd2FwX2ludGVydmFsKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsIGludCBpbnRlcnZhbCkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaW50ZXJ2YWwpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19nZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBhLT5xdWVyeShhLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsIGNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIGluaXRIYWxQcmV2aWV3V2luZG93KCkKKyAgICB7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmNhbmNlbF9idWZmZXIgPSBfX2NhbmNlbF9idWZmZXI7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmRlcXVldWVfYnVmZmVyID0gX19kZXF1ZXVlX2J1ZmZlcjsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuZW5xdWV1ZV9idWZmZXIgPSBfX2VucXVldWVfYnVmZmVyOworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfYnVmZmVyX2NvdW50ID0gX19zZXRfYnVmZmVyX2NvdW50OworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfYnVmZmVyc19nZW9tZXRyeSA9IF9fc2V0X2J1ZmZlcnNfZ2VvbWV0cnk7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9jcm9wID0gX19zZXRfY3JvcDsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X3VzYWdlID0gX19zZXRfdXNhZ2U7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9zd2FwX2ludGVydmFsID0gX19zZXRfc3dhcF9pbnRlcnZhbDsKKworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5nZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50ID0KKyAgICAgICAgICAgICAgICBfX2dldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQ7CisgICAgfQorCisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgIG1QcmV2aWV3V2luZG93OworCisgICAgc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyB7CisgICAgICAgIHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgbnc7CisgICAgICAgIHZvaWQgKnVzZXI7CisgICAgfTsKKworICAgIHN0cnVjdCBjYW1lcmFfcHJldmlld193aW5kb3cgbUhhbFByZXZpZXdXaW5kb3c7CisKKyAgICBub3RpZnlfY2FsbGJhY2sgICAgICAgICBtTm90aWZ5Q2I7CisgICAgZGF0YV9jYWxsYmFjayAgICAgICAgICAgbURhdGFDYjsKKyAgICBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCBtRGF0YUNiVGltZXN0YW1wOworICAgIHZvaWQgKm1DYlVzZXI7Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGEwOWUxNmIuLjFlOGMzMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAqLwogCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02OSwyNCArNzEsMzQgQEAKIHN0YXRpYyBDYW1lcmFTZXJ2aWNlICpnQ2FtZXJhU2VydmljZTsKIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpCi06bVNvdW5kUmVmKDApCis6bVNvdW5kUmVmKDApLCBtTW9kdWxlKDApCiB7CiAgICAgTE9HSSgiQ2FtZXJhU2VydmljZSBzdGFydGVkIChwaWQ9JWQpIiwgZ2V0cGlkKCkpOwotCi0gICAgbU51bWJlck9mQ2FtZXJhcyA9IEhBTF9nZXROdW1iZXJPZkNhbWVyYXMoKTsKLSAgICBpZiAobU51bWJlck9mQ2FtZXJhcyA+IE1BWF9DQU1FUkFTKSB7Ci0gICAgICAgIExPR0UoIk51bWJlciBvZiBjYW1lcmFzKCVkKSA+IE1BWF9DQU1FUkFTKCVkKS4iLAotICAgICAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMsIE1BWF9DQU1FUkFTKTsKLSAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IE1BWF9DQU1FUkFTOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgIHNldENhbWVyYUZyZWUoaSk7Ci0gICAgfQotCiAgICAgZ0NhbWVyYVNlcnZpY2UgPSB0aGlzOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6Om9uRmlyc3RSZWYoKQoreworICAgIEJuQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpOworCisgICAgaWYgKGh3X2dldF9tb2R1bGUoQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgICAgICAoY29uc3QgaHdfbW9kdWxlX3QgKiopJm1Nb2R1bGUpIDwgMCkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3QgbG9hZCBjYW1lcmEgSEFMIG1vZHVsZSIpOworICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBtTW9kdWxlLT5nZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKKyAgICAgICAgaWYgKG1OdW1iZXJPZkNhbWVyYXMgPiBNQVhfQ0FNRVJBUykgeworICAgICAgICAgICAgTE9HRSgiTnVtYmVyIG9mIGNhbWVyYXMoJWQpID4gTUFYX0NBTUVSQVMoJWQpLiIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMsIE1BWF9DQU1FUkFTKTsKKyAgICAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBNQVhfQ0FNRVJBUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgc2V0Q2FtZXJhRnJlZShpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKICAgICAgICAgaWYgKG1CdXN5W2ldKSB7CkBAIC0xMDMsMTIgKzExNSwxOSBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pIHsKKyAgICBpZiAoIW1Nb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCiAgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSEFMX2dldENhbWVyYUluZm8oY2FtZXJhSWQsIGNhbWVyYUluZm8pOwotICAgIHJldHVybiBPSzsKKyAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pOworICAgIGNhbWVyYUluZm8tPmZhY2luZyA9IGluZm8uZmFjaW5nOworICAgIGNhbWVyYUluZm8tPm9yaWVudGF0aW9uID0gaW5mby5vcmllbnRhdGlvbjsKKyAgICByZXR1cm4gcmM7CiB9CiAKIHNwPElDYW1lcmE+IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoCkBAIC0xMTYsNiArMTM1LDExIEBACiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIAorICAgIGlmICghbU1vZHVsZSkgeworICAgICAgICBMT0dFKCJDYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgewogICAgICAgICBMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhSWQgJWQpLiIsCkBAIC0xNDYsMTUgKzE3MCwxOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gaGFyZHdhcmUgPSBIQUxfb3BlbkNhbWVyYUhhcmR3YXJlKGNhbWVyYUlkKTsKLSAgICBpZiAoaGFyZHdhcmUgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJGYWlsIHRvIG9wZW4gY2FtZXJhIGhhcmR3YXJlIChpZD0lZCkiLCBjYW1lcmFJZCk7CisgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CisgICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgQ2FtZXJhSW5mbyBpbmZvOwotICAgIEhBTF9nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCAmaW5mbyk7Ci0gICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsIGhhcmR3YXJlLCBjYW1lcmFJZCwgaW5mby5mYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKKworICAgIGNoYXIgY2FtZXJhX2RldmljZV9uYW1lWzEwXTsKKyAgICBzbnByaW50ZihjYW1lcmFfZGV2aWNlX25hbWUsIHNpemVvZihjYW1lcmFfZGV2aWNlX25hbWUpLCAiJWQiLCBjYW1lcmFJZCk7CisKKyAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoJm1Nb2R1bGUtPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2RldmljZV9uYW1lKSwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgaW5mby5mYWNpbmcsIGNhbGxpbmdQaWQpOwogICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwogICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCIpOwogICAgIHJldHVybiBjbGllbnQ7CkBAIC0yNDQsNyArMjcyLDcgQEAKIHN0YXRpYyBNZWRpYVBsYXllciogbmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewogICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwogICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgewotICAgICAgICBtcC0+c2V0QXVkaW9TdHJlYW1UeXBlKEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFKTsKKyAgICAgICAgbXAtPnNldEF1ZGlvU3RyZWFtVHlwZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSk7CiAgICAgICAgIG1wLT5wcmVwYXJlKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGxvYWQgQ2FtZXJhU2VydmljZSBzb3VuZHM6ICVzIiwgZmlsZSk7CkBAIC0yODMsNyArMzExLDcgQEAKICAgICAgICAgLy8gZG8gbm90IHBsYXkgdGhlIHNvdW5kIGlmIHN0cmVhbSB2b2x1bWUgaXMgMAogICAgICAgICAvLyAodHlwaWNhbGx5IGJlY2F1c2UgcmluZ2VyIG1vZGUgaXMgc2lsZW50KS4KICAgICAgICAgaW50IGluZGV4OwotICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OkVORk9SQ0VEX0FVRElCTEUsICZpbmRleCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgJmluZGV4KTsKICAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKICAgICAgICAgICAgIHBsYXllci0+c2Vla1RvKDApOwogICAgICAgICAgICAgcGxheWVyLT5zdGFydCgpOwpAQCAtMzIwLDcgKzM0OCw3IEBACiAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0ZPQ1VTKTsKIAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKKyAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgY2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhQnVzeShjYW1lcmFJZCk7CkBAIC00MTAsNyArNDM4LDcgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOworICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICBtQ2FtZXJhQ2xpZW50ID0gY2xpZW50OwogCkBAIC00NzIsMTUgKzUwMCwxNSBAQAogICAgIHJlc3VsdCA9IE5PX0VSUk9SOwogCiAgICAgLy8gcmV0dXJuIGlmIG5vIGNoYW5nZSBpbiBzdXJmYWNlLgotICAgIC8vIGFzQmluZGVyKCkgaXMgc2FmZSBvbiBOVUxMIChyZXR1cm5zIE5VTEwpCi0gICAgaWYgKGdldElTdXJmYWNlKHN1cmZhY2UpLT5hc0JpbmRlcigpID09IG1TdXJmYWNlKSB7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyKHN1cmZhY2UgIT0gMCA/IHN1cmZhY2UtPmFzQmluZGVyKCkgOiAwKTsKKyAgICBpZiAoYmluZGVyID09IG1TdXJmYWNlKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKICAgICAgICAgTE9HMSgiY2xlYXJpbmcgb2xkIHByZXZpZXcgc3VyZmFjZSAlcCIsIG1TdXJmYWNlLmdldCgpKTsKICAgICB9Ci0gICAgbVN1cmZhY2UgPSBnZXRJU3VyZmFjZShzdXJmYWNlKS0+YXNCaW5kZXIoKTsKKyAgICBtU3VyZmFjZSA9IGJpbmRlcjsKICAgICBtUHJldmlld1dpbmRvdyA9IHN1cmZhY2U7CiAKICAgICAvLyBJZiBwcmV2aWV3IGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCwgcmVnaXN0ZXIgcHJldmlldwpAQCAtNTQzLDcgKzU3MSw3IEBACiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBjYWxsYmFja19mbGFnOwotICAgIGlmIChtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKKyAgICBpZiAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgewogICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKQEAgLTY2NiwyMCArNjk0LDYgQEAKICAgICBtSGFyZHdhcmUtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShtZW0pOwogfQogCi1pbnQzMl90IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSBjb25zdCB7Ci0gICAgTE9HMSgiZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG1IYXJkd2FyZS0+Z2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKTsKLX0KLQotc3A8SU1lbW9yeT4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRWaWRlb0J1ZmZlcihpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgTE9HMSgiZ2V0VmlkZW9CdWZmZXI6ICVkIiwgaW5kZXgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gMDsKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5nZXRWaWRlb0J1ZmZlcihpbmRleCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpCiB7CiAgICAgTE9HMSgic3RvcmVNZXRhRGF0YUluQnVmZmVyczogJXMiLCBlbmFibGVkPyAidHJ1ZSI6ICJmYWxzZSIpOwpAQCAtOTM4LDcgKzk1Miw3IEBACiAgICAgc3dpdGNoIChtc2dUeXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX01TR19TSFVUVEVSOgogICAgICAgICAgICAgLy8gZXh0MSBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSB5dXYgcGljdHVyZS4KLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlU2h1dHRlcigoaW1hZ2VfcmVjdF90eXBlICopZXh0MSk7CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZVNodXR0ZXIoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwpAQCAtOTk3LDkgKzEwMTEsNyBAQAogfQogCiAvLyBzbmFwc2hvdCB0YWtlbiBjYWxsYmFjawotLy8gInNpemUiIGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHl1diBwaWN0dXJlIGZvciByZWdpc3RlckJ1ZmZlci4KLS8vIElmIGl0IGlzIE5VTEwsIHVzZSB0aGUgcGljdHVyZSBzaXplIGZyb20gcGFyYW1ldGVycy4KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVTaHV0dGVyKGltYWdlX3JlY3RfdHlwZSAqc2l6ZSkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZVNodXR0ZXIodm9pZCkgewogICAgIGlmIChtUGxheVNodXR0ZXJTb3VuZCkgewogICAgICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwogICAgIH0KQEAgLTEwMjUsNyArMTAzNyw3IEBACiAgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAKICAgICAvLyBpcyBjYWxsYmFjayBlbmFibGVkPwotICAgIGlmICghKGZsYWdzICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykpIHsKKyAgICBpZiAoIShmbGFncyAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSkgewogICAgICAgICAvLyBJZiB0aGUgZW5hYmxlIGJpdCBpcyBvZmYsIHRoZSBjb3B5LW91dCBhbmQgb25lLXNob3QgYml0cyBhcmUgaWdub3JlZAogICAgICAgICBMT0cyKCJmcmFtZSBjYWxsYmFjayBpcyBkaXNhYmxlZCIpOwogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTEwMzYsMTcgKzEwNDgsMTcgQEAKICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKIAogICAgIC8vIGNsZWFyIGNhbGxiYWNrIGZsYWdzIGlmIG5vIGNsaWVudCBvciBvbmUtc2hvdCBtb2RlCi0gICAgaWYgKGMgPT0gMCB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spKSB7CisgICAgaWYgKGMgPT0gMCB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSkgewogICAgICAgICBMT0cyKCJEaXNhYmxlIHByZXZpZXcgY2FsbGJhY2siKTsKLSAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CisgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnICY9IH4oQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOwogICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIAogICAgIGlmIChjICE9IDApIHsKICAgICAgICAgLy8gSXMgdGhlIHJlY2VpdmVkIGZyYW1lIGNvcGllZCBvdXQgb3Igbm90PwotICAgICAgICBpZiAoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKKyAgICAgICAgaWYgKGZsYWdzICYgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSykgewogICAgICAgICAgICAgTE9HMigiZnJhbWUgaXMgY29waWVkIik7CiAgICAgICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoYywgaGVhcCwgb2Zmc2V0LCBzaXplKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNTcsMTIgKzEyNjksNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8SVN1cmZhY2U+IENhbWVyYVNlcnZpY2U6OmdldElTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7Ci0gICAgaWYgKHN1cmZhY2UgIT0gMCkgewotICAgICAgICByZXR1cm4gc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3A8SVN1cmZhY2U+KDApOwotICAgIH0KLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCAxYzQzYjAwLi41ZTJkNTcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xOSw5ICsxOSw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CiAKIC8qIFRoaXMgbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIHdlIGNhbiBoYXZlIG1vcmUgY2FtZXJhcyAqLwogI2RlZmluZSBNQVhfQ0FNRVJBUyAyCkBAIC0zMCw2ICsyOSw3IEBACiAKIGNsYXNzIE1lbW9yeUhlYXBCYXNlOwogY2xhc3MgTWVkaWFQbGF5ZXI7CitjbGFzcyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTsKIAogY2xhc3MgQ2FtZXJhU2VydmljZSA6CiAgICAgcHVibGljIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT4sCkBAIC01Myw2ICs1Myw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKICAgICBlbnVtIHNvdW5kX2tpbmQgewogICAgICAgICBTT1VORF9TSFVUVEVSID0gMCwKQEAgLTc5LDEyICs4MCw2IEBACiAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICBtU291bmRQbGF5ZXJbTlVNX1NPVU5EU107CiAgICAgaW50ICAgICAgICAgICAgICAgICBtU291bmRSZWY7ICAvLyByZWZlcmVuY2UgY291bnQgKHJlbGVhc2UgYWxsIE1lZGlhUGxheWVyIHdoZW4gMCkKIAotICAgIC8vIFVzZWQgYnkgQ2xpZW50IG9iamVjdHMgdG8gZXh0cmFjdCB0aGUgSVN1cmZhY2UgZnJvbSBhIFN1cmZhY2Ugb2JqZWN0LgotICAgIC8vIFRoaXMgaXMgdXNlZCBiZWNhdXNlIG1ha2luZyBDbGllbnQgYSBmcmllbmQgY2xhc3Mgb2YgU3VyZmFjZSB3b3VsZAotICAgIC8vIHJlcXVpcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGluIFN1cmZhY2UuaCBzaW5jZSBDbGllbnQgaXMgYSBuZXN0ZWQKLSAgICAvLyBjbGFzcy4KLSAgICBzdGF0aWMgc3A8SVN1cmZhY2U+IGdldElTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKLQogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBCbkNhbWVyYQogICAgIHsKICAgICBwdWJsaWM6CkBAIC05OSw4ICs5NCw2IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UHJldmlldygpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUHJldmlldygpOwogICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBwcmV2aWV3RW5hYmxlZCgpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3QgICAgICAgICBnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRWaWRlb0J1ZmZlcihpbnQzMl90IGluZGV4KSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFJlY29yZGluZygpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKCk7CkBAIC0xNTIsNyArMTQ1LDcgQEAKICAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUKICAgICAgICAgc3RhdGljIHNwPENsaWVudD4gICAgICAgZ2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKICAgICAgICAgLy8gaGFuZGxlcnMgZm9yIG1lc3NhZ2VzCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNodXR0ZXIoaW1hZ2VfcmVjdF90eXBlICpzaXplKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcih2b2lkKTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJldmlld0RhdGEoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvc3R2aWV3KGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVSYXdQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwpAQCAtMjA3LDYgKzIwMCw4IEBACiAgICAgICAgIC8vIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkLiBJdCByZXR1cm5zIHRydWUgaWYgbUxvY2sgaXMgZ3JhYmJlZC4KICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbG9ja0lmTWVzc2FnZVdhbnRlZChpbnQzMl90IG1zZ1R5cGUpOwogICAgIH07CisKKyAgICBjYW1lcmFfbW9kdWxlX3QgKm1Nb2R1bGU7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCmluZGV4IGNmNGU0MmYuLmNmNzMwMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAogICAgICAgICAgICAgICAgIGxpYnVpIFwKICAgICAgICAgICAgICAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICAgICAgICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQKKyAgICAgICAgICAgICAgICBsaWJndWkKIAogIyBEaXNhYmxlIGl0IGJlY2F1c2UgdGhlIElTdXJmYWNlIGludGVyZmFjZSBtYXkgY2hhbmdlLCBhbmQgYmVmb3JlIHdlIGhhdmUgYQogIyBjaGFuY2UgdG8gZml4IHRoaXMgdGVzdCwgd2UgZG9uJ3Qgd2FudCB0byBicmVhayBub3JtYWwgYnVpbGRzLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAKaW5kZXggOGEyMjhmZC4uZjg2Y2E0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQ2FtZXJhU2VydmljZVRlc3QuY3BwCkBAIC04MzAsMTAgKzgzMCwxMCBAQAogICAgICAgICAgICAgQVNTRVJUKGMtPnByZXZpZXdFbmFibGVkKCkgPT0gdHJ1ZSk7CiAgICAgICAgICAgICBzbGVlcCgyKTsKICAgICAgICAgICAgIGMtPnN0b3BQcmV2aWV3KCk7Ci0gICAgICAgICAgICBpZiAoKHYgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKHYgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgPT0gMCkgewogICAgICAgICAgICAgICAgIGNjLT5hc3NlcnREYXRhKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgTUNhbWVyYUNsaWVudDo6RVEsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKHYgJiBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHYgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGNjLT5hc3NlcnREYXRhKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgTUNhbWVyYUNsaWVudDo6R0UsIDEwKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjYy0+YXNzZXJ0RGF0YShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKQEAgLTg0OSw3ICs4NDksNyBAQAogICAgICAgICBBU1NFUlQoYy0+cmVjb3JkaW5nRW5hYmxlZCgpID09IGZhbHNlKTsKICAgICAgICAgc3A8TVN1cmZhY2U+IHN1cmZhY2UgPSBuZXcgTVN1cmZhY2UoKTsKICAgICAgICAgQVNTRVJUKGMtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpID09IE5PX0VSUk9SKTsKLSAgICAgICAgYy0+c2V0UHJldmlld0NhbGxiYWNrRmxhZyhGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKKyAgICAgICAgYy0+c2V0UHJldmlld0NhbGxiYWNrRmxhZyhDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CiAgICAgICAgIGNjLT5zZXRSZWxlYXNlcihjLmdldCgpKTsKICAgICAgICAgYy0+c3RhcnRSZWNvcmRpbmcoKTsKICAgICAgICAgQVNTRVJUKGMtPnJlY29yZGluZ0VuYWJsZWQoKSA9PSB0cnVlKTsKQEAgLTg3MCw3ICs4NzAsNyBAQAogCiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW0oYy0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAgICAgcGFyYW0uc2V0UHJldmlld1NpemUodywgaCk7Ci0gICAgICAgIGMtPnNldFByZXZpZXdDYWxsYmFja0ZsYWcoRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CisgICAgICAgIGMtPnNldFByZXZpZXdDYWxsYmFja0ZsYWcoQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOwogICAgICAgICBjLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLmZsYXR0ZW4oKSk7CiAKICAgICAgICAgYy0+c3RhcnRQcmV2aWV3KCk7Cg==